Optimization 如何识别微量锌问题(最大化或最小化)有多种答案
我只是做了一些实验,看看如果一个优化问题有很多解决方案,会发生什么。我知道,通过Minizing,我们可以为这个问题找到多个答案。(就像《用户指南》中的地图着色一样)。 在我们得到最佳答案后,迷你锌总是显示一条双虚线 现在我只是在代码下面运行,我注意到如果我使用Optimization 如何识别微量锌问题(最大化或最小化)有多种答案,optimization,minizinc,Optimization,Minizinc,我只是做了一些实验,看看如果一个优化问题有很多解决方案,会发生什么。我知道,通过Minizing,我们可以为这个问题找到多个答案。(就像《用户指南》中的地图着色一样)。 在我们得到最佳答案后,迷你锌总是显示一条双虚线 现在我只是在代码下面运行,我注意到如果我使用gecode解算器的答案与使用coin bc或cplex解算器的答案不同。Minizing中是否有任何功能,当这些类型的多个最佳答案出现问题时,我们会收到通知,或者在不考虑我们使用的解算器的情况下获得所有解决方案 enum sup
gecode
解算器的答案与使用coin bc
或cplex
解算器的答案不同。Minizing中是否有任何功能,当这些类型的多个最佳答案出现问题时,我们会收到通知,或者在不考虑我们使用的解算器的情况下获得所有解决方案
enum suppliers;
suppliers={s1,s2,s3};
set of int:sup=1..length(suppliers);
array[sup] of float:price=[3.0,6.0,12.0];
array[sup] of int:max=[2,3,1];
int:demand=3;
array[sup] of var 0..1000:qty;
var float:cost;
constraint sum(i in sup)(
qty[i])=demand;
constraint forall(i in sup)(
qty[i]<=max[i]
);
constraint qty[2] != 1;
constraint qty[1] != 1;
constraint sum(i in sup)(
price[i]*qty[i])=cost;
solve minimize cost;
enum供应商;
供应商={s1、s2、s3};
成套int:sup=1..长度(供应商);
浮点数组[sup]:price=[3.0,6.0,12.0];
int:max=[2,3,1]的数组[sup];
int:需求=3;
变量0..1000的数组[sup]:数量;
var浮动:成本;
约束和(sup中的i)(
数量[i])=需求;
所有限制条件(支持中的i)(
数量[i]一个优化问题确实会有多个正确的最优答案。不同的解算器通常会提供不同的解决方案;但是,如果解算器功能正常,则两种解决方案中的目标值(在您的情况下,成本
)应该相同
Minizing中经常使用的一种寻找所有(或至少更多)最优解决方案的方法是添加约束成本=V;
,其中成本
是目标的名称,V
是为您的问题找到的最佳值。如果我们随后将问题更改为满意问题(解决
),则支持“查找所有解决方案”(如chuffed
或gecode
)的解算器可以找到原始问题的所有最优解决方案
请注意,找到所有最优解决方案通常比只找到一个最优解决方案要困难得多。已经回答了您的问题。我想补充一点,它内置了对找到所有相同最优值解决方案的支持
最简单的试用方法是下载、配置和安装,然后使用选项——所有解决方案都选择,例如
~$ fzn2optimathsat.py examples/flatzinc_allsolutions.fzn --all-solutions-opt
% allsat model
x = 3;
y = 0;
r1 = true;
r2 = false;
----------
% allsat model
x = 3;
y = 1;
r1 = true;
r2 = false;
----------
==========