目前我正在仔细研究 Minizinc。Minizinc 在求解模型时会在输出窗口中显示我的模型的所有有效解。我有点困惑,因为我没有要求 minizinc 将模型作为满意度问题来解决。是否有可能只显示最佳解决方案?感谢您的回答。
最好的祝福
目前我正在仔细研究 Minizinc。Minizinc 在求解模型时会在输出窗口中显示我的模型的所有有效解。我有点困惑,因为我没有要求 minizinc 将模型作为满意度问题来解决。是否有可能只显示最佳解决方案?感谢您的回答。
最好的祝福
你的solve
说法是什么?如果是,solve satisfy
那么您要求所有解决方案。如果是solve minimize x
,solve maximize x
则求解器将显示最优解的进程,最后显示最优解。
使用OptiMathSAT
version ,现在可以使用选项打印给定公式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
。后一种模型会打印两次:第一次是在找到后立即打印,第二次是在求解器能够证明它实际上是问题的最优解时。