我正在使用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);
}
我想知道是否有更好的方法来模拟这种情况。
答案 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));
代替==
)以获得双向关系。