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

Posted

技术标签:

【中文标题】使用 Minizinc 进行优化 - 仅打印最佳解决方案【英文标题】:Optimization with Minizinc - Only print optimal solutions 【发布时间】:2018-01-19 19:34:29 【问题描述】:

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

最好的问候

【问题讨论】:

【参考方案1】:

您的solve 声明是什么?如果是solve satisfy,那么您需要所有解决方案。如果是solve minimize xsolve maximize x,则求解器将显示最优解的进度,最后显示最优解。

【讨论】:

您好 hakank,感谢您的回答。我的声明是“解决最小化”。是否有可能配置 minizinc 以在求解过程完成时仅显示最佳解决方案? 没有选择只能获得最后的最佳解决方案。对于最优问题,一些求解器以不同方式处理“-n ”选项,但他们要么给出第一个解决方案(而不是最后一个解决方案),要么直接忽略该标志。 @Westfale 因为答案可以说解决了您的问题,请接受它 - 请参阅What should I do when someone answers my question? @hakank 在 MiniZinc IDE 的更高版本中,您可以更改求解器配置以仅输出最优解。单击 IDE 右上角的“显示配置编辑器”按钮。在打开的窗格中,找到单选按钮“用户定义的行为”并单击它。最后,取消选中“打印中间解决方案...”框(如果选中)。这将使求解器具有您想要的行为,只要 MiniZinc 使用的求解器具有此选项...【参考方案2】:

使用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


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

-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。后一种模型会打印两次:第一次是在找到后立即打印,第二次是在求解器能够证明它实际上是问题的最优解时。

【讨论】:

以上是关于使用 Minizinc 进行优化 - 仅打印最佳解决方案的主要内容,如果未能解决你的问题,请参考以下文章

MiniZinc决策变量非连续范围

MiniZinc 在引入输出语句时找不到解决方案

解开发者之痛:中国移动MySQL数据库优化最佳实践(有彩蛋)

使用 minizinc 解决的各种问题

如何在 MiniZinc 中安装 Google 的 CP 求解器 OR-Tools?

如何设置 C/C++ 编译器选项以对使用中的 CPU 进行最佳优化? [关闭]