2014-04-26 43 views
1

我正在使用Gecode工具包,我想爲以下情形建模。如何約束一個變量,取決於其他變量的值在Gecode

我有兩個變量xy。取決於值x,y應該具有一定的值。例如。如果X是1,ÿ應該是3,如果X是2,ÿ應該是5.我應該如何在Gecode模型呢?

我目前使用reified constraints來模擬這種情況,可以在gist中看到。癥結在於使用一個BoolVar和兩個指定約束來設置相應的值。

for (IntVarValues i(x); i(); ++i) { 
    BoolVar b = BoolVar(*this, 0, 1); 
    rel(*this, x, IRT_EQ, i.val(), b); 
    rel(*this, y, IRT_EQ, f(i.val), b); 
} 

我想知道是否有更好的方法來模擬這種情況。

回答

1

如果可能,最好通過element constraint完成從x到y的函數轉換(即x的每個值分配y的單個值的函數轉換)。該約束需要一個數組,該數組將映射x的域到y的域,從零索引開始。

對於你的榜樣,您可以使用以下(假設invalid是一個int不是在y域):

IntArgs mapping(3, invalid, 3, 5); 
element(*this, mapping, x, y); 
0

這樣做的一種方法是使用帶有>>的含義(「if else」)構造的布爾表達式(例如,MPG部分7.1.2「布爾表達式和關係」)。這裏是你提到的例子。

// if x == 1 then y == 3 
rel(*this, (x == 1) >> (y == 3)); 
// if x == 2 then y == 5 
rel(*this, (x == 2) >> (y == 5)); 

注意Gecode還支持對等(使用==,而是如果>>)獲得此關係是雙向的。

+0

注意,使用布爾表達式是構建具體化的表現只是另一種語法。 – Zayenz