2

我的 minizinc 模型运行良好,但我需要将其转换为 Java 代码,所以我使用 choco 来完成。我现在面临的问题是 minizinc 炒锅的机制与 choco 不同。我在 choco 中写了我在 minizinc 中使用的约束,但它没有用。

假设:

minizinc 型号为:

array[sub_set] of var cl_set: cl_id;
constraint alldifferent(cl_id);
constraint forall(i in sub_set) ( sub_cap[i] <= cl_cap[cl_id[i]]);

巧克力代码是:

cl_id = VF.boundedArray("", sub_sz, 0, cl_sz - 1, solver);
solver.post(ICF.alldifferent(cl_id));
for (int i = 0; i < sub_sz; i++) {
     Constraint a = ICF.arithm(VF.fixed(cl_cap[cl_id[i].getValue()], solver), ">=", sub_cap[i]);
      solver.post(a);
        }
  • cl_cap 是一个 int 数组。
  • cl_id[i].getValue()始终为 0,因为它获取域的下限并且约束不适用于 cl_id

我应该怎么做才能使 choco 约束以与 minizinc 相同的方式工作?

4

1 回答 1

2

正如哈坎克所说,你需要 Choco Solver 的元素约束。它的语法是 : element(IntVar VALUE, int[] TABLE, IntVar INDEX),意思是VALUE = TABLE[INDEX]

所以它给出了类似的东西:

for (int i = 0; i < sub_sz; i++) {

    solver.post(ICF.element(VF.bounded(sub_cap[i], cl_sz - 1, solver), cl_cap, cl_id[i]));
}

你不能使用getValue(),因为在这个阶段,问题还没有解决(getValue()当 -ea 被传递给 JVM 参数或返回当前变量 LOWER BOUND 时抛出异常,这就是你得到 0 的原因)。

于 2016-04-21T08:16:59.830 回答