首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Proc Optmodel MILP求解器,如何查找不可行约束

Proc Optmodel MILP求解器,如何查找不可行约束
EN

Stack Overflow用户
提问于 2017-03-29 19:09:15
回答 1查看 385关注 0票数 0

我正在尝试使用proc optmodel构建一个优化模型。我正在使用MILP求解器,并且一次又一次地陷入不可行解。

当预解算器不能得到冲突的约束时,问题就发生了,我在日志中得不到任何关于去哪里和做编辑的信息,并且在1000个约束中找出它是一个漫长而乏味的过程。

如果有办法在求解运行后识别不可行的约束,请告知。

我试过使用IIS选项,它不适用于MILP求解器,PRESTOL选项可以得到即使是最轻微的不可行的约束,但都不起作用。

EN

回答 1

Stack Overflow用户

发布于 2017-03-29 21:02:51

如果MILP求解器能够识别导致不可行的特定约束,则它将显示在日志中。即:

Note: Constraint con[1] causes the problem to be infeasible.

如果不能,它会告诉你问题本身是不可行的。若要找出导致问题的确切约束,可以删除约束并循环求解器,直到它变得可行。有关详细信息,请参阅this answer。示例代码如下:

代码语言:javascript
复制
proc optmodel presolver=none;
   /* declare variables */
   var x{1..3} >=0;

   /* upper bound on variable x[3] */
   x[3].ub = 3;

   /* objective function */
   min obj = x[1] + x[2] + x[3];

   /* constraints */
   con c1: x[1] + x[2] >= 10;
   con c2: x[1] + x[3] <= 4;
   con c3: 4 <= x[2] + x[3] <= 5;

   num iteration init 1;
   set IIS{1 .. iteration} init {};
   do while (1);
     solve with lp / iis = on;
     IIS[iteration] = {ci in 1 .. _NCON_: _CON_[ci].status ~= ''};
     if card(IIS[iteration]) = 0 then leave;
     for {ci in IIS[iteration]: _CON_[ci].status = 'I_L'}
        _CON_[ci].lb = -constant('big');
     for {ci in IIS[iteration]: _CON_[ci].status = 'I_U'}
        _CON_[ci].ub = constant('big');
     iteration = iteration + 1;
   end;
   iteration = iteration - 1;
   for {ii in 1 .. iteration}
     put IIS[ii]=;
quit;

资料来源:LeoLopes,SAS社区论坛

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43091840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档