我正在尝试在 choco 中移植 minizinc 模型。我知道如何定义变量和其他基本的东西,但是尽管阅读了教程和一些代码示例,但我在定义一些非平凡的约束时遇到了一些麻烦。有人可以给我一些建议,如何以 choco 求解器风格翻译以下代码(只是 z)?
array[1..n,1..n] of int: c;
array[1..n] of var 0..10: next;
var 0..sum(c): z = sum(i in 1..n)(c[i,next[i]]);
谢谢!
我正在尝试在 choco 中移植 minizinc 模型。我知道如何定义变量和其他基本的东西,但是尽管阅读了教程和一些代码示例,但我在定义一些非平凡的约束时遇到了一些麻烦。有人可以给我一些建议,如何以 choco 求解器风格翻译以下代码(只是 z)?
array[1..n,1..n] of int: c;
array[1..n] of var 0..10: next;
var 0..sum(c): z = sum(i in 1..n)(c[i,next[i]]);
谢谢!
我相信您知道如何发布求和约束,因此重要的部分在于 c[i,next[i]],它检索矩阵 c 中第 i 行和第 next[i] 列的整数。问题是 next[i] 是一个变量,因此您不能直接使用它来访问(Java)数组。
您需要使用元素约束(也在 minizinc 中):
/**
* Creates an element constraint: value = table[index]
*
* @param value an integer variable taking its value in table
* @param table an array of integer values
* @param index an integer variable representing the value of value in table
*/
default Constraint element(IntVar value, int[] table, IntVar index)
当您使用矩阵时,您需要对每一行执行此操作,然后对它们进行总和。
另请注意,在 Java 中,数组单元的访问范围是从 0 到 n-1(在 minizinc 中是从 1 到 n),因此您可能需要相应地更新模型或使用偏移量。
希望这可以帮助