我正在尝试使用proc optmodel构建优化模型。我正在使用MILP解算器,我一次又一次地进入不可行的解决方案。
当预解算器无法获得冲突约束时会发生问题,我在日志中没有获得关于去哪里和进行编辑的任何信息,以及在1000个约束中找出其中的漫长而繁琐的过程
如果有办法在解决运行后识别不可行的约束,请提供建议。
我尝试过使用IIS选项,它不适用于MILP求解器,PRESTOL选项可以获得最轻微的不可行约束,但没有任何效果。
答案 0 :(得分:0)
如果MILP解算器能够识别导致不可行的特定约束,它将显示在日志中。即:
Note: Constraint con[1] causes the problem to be infeasible.
如果不能,它会告诉你问题本身是不可行的。要找出导致问题的确切约束,您可以删除约束并循环求解器,直到它变得可行。有关详细信息,请参阅this answer。示例代码如下:
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社区论坛