【问题标题】:How to identify minizinc problem(Maximizing or Minimizing) has multiple answers如何识别 minizinc 问题(最大化或最小化)有多个答案
【发布时间】:2020-06-04 01:42:51
【问题描述】:

我刚刚做了一些实验,如果优化问题有很多解决方案会发生什么。我知道通过 MiniZinc,我们可以确定满足问题的多个答案。(就像用户指南中的地图着色)。 而 MiniZinc 总是在我们得到最优答案后不久显示一条双虚线。

现在我刚刚运行下面的代码,我注意到如果我使用 gecode 求解器的答案与我使用 coin-bccplex 求解器时的答案不同。 MiniZinc 中是否有任何功能会在此类多重最优解决问题时通知我们,或者获取所有解决方案而不管我们使用的求解器。

    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;

【问题讨论】:

    标签: optimization minizinc


    【解决方案1】:

    一个优化问题确实有多个正确的最优答案。经常发生不同的求解器会提供不同的解决方案;但是,如果求解器正常运行,那么目标值(在您的情况下为 cost)在两个解决方案中应该是相同的。

    MiniZinc 中经常使用的一种查找所有(或至少更多)最优解的方法是添加constraint cost = V;,其中cost 是目标的名称,V 是找到的最优值你的问题。如果我们再把问题改成满意问题(solve satisfy),那么支持find all solution(如chuffedgecode)的求解器就可以找到原问题的所有最优解。

    请注意,找到所有个最佳解决方案通常比仅找到一个最佳解决方案要困难得多。

    【讨论】:

      【解决方案2】:

      Dekker 已经回答了您的问题。我想补充一点,OptiMathSAT 内置支持查找所有相同的最优值解决方案。

      最简单的尝试方法是下载、配置和安装fzn2omt,然后使用选项--all-solutions-opt例如

      ~$ 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;
      ----------
      ==========
      

      【讨论】:

        猜你喜欢
        • 2021-08-23
        • 1970-01-01
        • 2012-11-25
        • 1970-01-01
        • 1970-01-01
        • 2012-04-16
        • 2011-10-27
        • 2022-12-04
        • 1970-01-01
        相关资源
        最近更新 更多