1

我正在使用Gecode工具包,我想对以下场景进行建模。

我有两个变量xy。根据x的值,y应该是某个值。例如,如果x是 1,y应该是 3,如果x是 2,y应该是 5。我应该如何在 Gecode 中建模?

我目前使用reified 约束来模拟这种情况,可以在这个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);
}

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

4

2 回答 2

1

如果可能,最好通过元素约束来完成从 x 到 y 的功能转换(即,将 x 的每个值分配给 y 的单个值)。约束采用一个数组,该数组将 x 的域映射到 y 的域,从零索引开始。

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

IntArgs mapping(3,  invalid, 3, 5);
element(*this, mapping, x, y);
于 2014-04-28T07:44:47.033 回答
0

这样做的一种方法是使用布尔表达式(例如 MPG 第 7.1.2 节“布尔表达式和关系”),使用带有 的蕴涵(“if else”)构造>>。这是你提到的例子。

// 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 还支持等价(使用==if 代替>>)以两种方式获取此关系。

于 2014-04-26T16:40:13.487 回答