如何根据Gecode中其他变量的值约束变量

时间:2014-04-26 13:20:38

标签: constraint-programming gecode

我正在使用Gecode工具包,我想模拟以下场景。

我有两个变量 x y 。根据 x 的值, y 应具有特定值。例如。如果 x 为1,则 y 应为3,如果 x 为2, y 应为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);
}

我想知道是否有更好的方法来模拟这种情况。

2 个答案:

答案 0 :(得分:1)

从x到y的函数变换(即,x的每个值被赋予y的单个值的函数变换)最好在可能时通过element constraint完成。约束采用一个数组,该数组将x的域映射到y的域,从零索引开始。

对于您的示例,您可以使用以下内容(假设invalid不是y域中的int):

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

答案 1 :(得分:0)

这样做的一种方法是使用布尔表达式(例如MPG部分7.1.2和#34;布尔表达式和关系")使用含义(" if else")构造{ {1}}。以下是您提到的示例。

>>

请注意,Gecode也支持等效(使用// if x == 1 then y == 3 rel(*this, (x == 1) >> (y == 3)); // if x == 2 then y == 5 rel(*this, (x == 2) >> (y == 5)); 代替==)以获得双向关系。