Choco-solver:在intVar的一部分上定义约束

时间:2019-12-14 16:40:15

标签: java solver choco

我们可以用choco求解器检查2个分号之间的相等性吗?

我有一个二维数组,对于它的每个元素,它们的域是具有相同形式的不同数字:由6位数字组成的数字(元素可以具有的一些值示例:781010、680101、391111) 。 我的问题是,如何只比较一个数字而不是整个数字?

我必须做些看起来像这样的事情:

Model model = new Model();
IntVar[][] array = new IntVar[height][width];

....
// getting the domains for each element of array
....

for(int i = 0; i < height; i++) {
    for(int j = 0; j < width; j++) {
       model.arithm(array[i][j]3rdDigit, "=", array[i+1][j]4thDigit);
    }
}

能帮我吗?

1 个答案:

答案 0 :(得分:1)

您可以考虑将数字分解为一系列数字:对于当前的每个IntVar,您可以创建一个数组arr为6(因为您的数字始终为6个数字)IntVars,并为该值设置另一个IntVar,并具有以下约束:

IntVar value = model.intVar(0,999999);
model.scalar(arr, new int[]{100000, 10000, 1000, 100, 10, 1}, "=", value).post();

然后您可以将其他约束发布到值上(如您已经做的那样,可以将其存储在矩阵中)。

另一种可能较慢的可能性是发布以下约束(不为数字创建变量):

for(int i = 0; i < height; i++) {
    for(int j = 0; j < width; j++) {
       IntVar thirdDigit = model.intVar(0,9);
       model.mod(array[i][j], 1000, thirdDigit).post();
       IntVar fourthDigit = model.intVar(0,9);
       model.mod(array[i+1][j], 100, fourthDigit).post();
       model.arithm(thirdDigit, "=", fourthDigit).post();
    }
}