使用Minizinc进行优化 - 仅打印最佳解决方案

时间:2018-01-19 19:34:30

标签: minizinc

目前我正在仔细研究Minizinc。 在解决模型时,Minizinc在输出窗口中显示了我的模型的所有有效解。我有点困惑,因为我没有要求minizinc将模型解决为满意度问题。 是否有可能只显示最佳解决方案? 谢谢你的回答。

最好的问候

2 个答案:

答案 0 :(得分:1)

您的solve声明是什么?如果它是solve satisfy那么你要求所有的解决方案。如果是solve minimize xsolve maximize x,那么解算器将显示最佳解决方案的进展,最后的解决方案会显示在最后。

答案 1 :(得分:0)

使用OptiMathSAT版本1.5.1,现在可以使用选项

打印给定FlatZinc公式的所有相同成本的最佳解决方案
-opt.fzn.all_solutions=[BOOL]

例如获取以下test.fzn文件

var 0..3: x ::output_var;
var 0..3: y ::output_var;
var bool: r1 ::output_var;
var bool: r2 ::output_var;

constraint int_lin_le_reif([1, 1, -1], [x, y, 4], 0, r1);
constraint int_lin_le_reif([1, 1, -1], [x, y, 2], 0, r2);
constraint bool_or(r1, r2, true);

solve maximize x;

并按如下方式解决:

~$ ../bin/optimathsat -input=fzn -opt.fzn.all_solutions=True < test.fzn
% allsat model
x = 3;
y = 0;
r1 = true;
r2 = false;
----------
% allsat model
x = 3;
y = 1;
r1 = true;
r2 = false;
----------
=========

x的最大值为3,因此解算器会打印test.fzn x等于3的所有模型OptiMathSAT }。

当然,正如@hakank在他的回答中提到的那样,人们可能会对解决方案向最优解决方案的进展感兴趣。这也可以使用选项

-opt.fzn.partial_solutions=[BOOL] 中完成
~$ ../bin/optimathsat -input=fzn -opt.fzn.partial_solutions=True < test.fzn
% objective: x (model)
x = 2;
y = 0;
r1 = true;
r2 = true;
----------
% objective: x (model)
x = 3;
y = 0;
r1 = true;
r2 = false;
----------
% objective: x (optimal model)
x = 3;
y = 0;
r1 = true;
r2 = false;
----------
=========

在上面的示例中,这将产生

x

此处优化搜索会找到两个不同的模型:2等于x的初始模型,以及3等于- "20000-20100" means: Expose the container ports in the range 20000 to 20100 into random ports on the host machine - "10000-10100:20000-20100" means: Expose the container ports in the range 20000 to 20100 into random ports on the host machine in the range of 10000 to 10100 - "20000-20100:20000-20100" similar to the above 的最佳模型。后一个模型打印两次:第一次发现,第二次解算器能够证明它实际上是问题的最佳解决方案。