0

我正在尝试在 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]]);

谢谢!

4

1 回答 1

1

我相信您知道如何发布求和约束,因此重要的部分在于 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),因此您可能需要相应地更新模型或使用偏移量。

希望这可以帮助

https://www.cosling.com/

于 2016-05-11T16:18:12.707 回答