【发布时间】:2016-04-20 17:24:42
【问题描述】:
我的 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 相同?
【问题讨论】:
-
由于没有显示 cl_cap 的定义,因此尚不清楚 MiniZinc 模型的作用。但问题似乎是您在选择一个值(这里显然是 0)的约束中使用 .getValue 。您可能必须使用元素约束 (choco-solver.org/user_guide/5_elements.html#element) 来提取位置 cl_id[i] 中的 cl_cap 值(这是一个决策变量)。这些约束在 MiniZinc 中更容易表述。
-
Solversolver = new Solver(); int [] a = new int []{30,70,50}; int [] b = 新的 int []{50,30,80}; IntVar [] idx = VF.boundedArray("", 3, 0, 2, 求解器);求解器.post(ICF.alldifferent(idx)); for (int i = 0; i ", a[i])); } 求解器.findSolution(); for (int i = 0; i
-
好吧,决策变量在模型的搜索部分之前不会被初始化(或分配)任何值。正如我之前提到的,您应该使用“元素”约束来“提取” idx[i] 的值以获取“b”中的索引。 (MiniZinc 对元素约束有更好的语法,所以这一步在其他 CP 系统中可能很难说明。)请参阅我之前链接到的页面上的示例。
-
Choco 能够解决编码为 FlatZinc 文件的问题。使用 MiniZinc 的 FlatZinc 中间文件并将其输入 Choco 可能是一种选择。
-
我已经解决了我的问题,现在我有另一个问题,当我在 minizinc IDE 中针对特定数据运行我的模型时,给出了大约 10 毫秒的解决方案,但是当我使用命令行命令运行我的模型时,它需要很长时间如果它提供的解决方案与 minizinc IDE 解决方案不同,或者它根本不提供解决方案,我使用的命令如下 cd "C:\Program Files\MiniZinc IDE (bundled)" minizinc.exe MinizincCode.mzn
标签: constraints constraint-programming minizinc choco