Sas Proc Optmodel MILP解算器,如何查找不可行约束

Sas Proc Optmodel MILP解算器,如何查找不可行约束,sas,Sas,我正在尝试使用proc optmodel构建一个优化模型。我正在使用MILP解算器,我一次又一次地陷入不可行解 当预解算器无法获得冲突约束时,问题就会发生。我在日志中没有得到任何关于去哪里进行编辑的信息,这是一个漫长而乏味的过程,要在1000个约束中找出答案 如果有办法在求解运行后确定不可行的约束,请提供建议 我尝试过使用IIS选项,该选项对MILP解算器不起作用,而使用PRESTOL选项,即使是最轻微的不可行约束也不起作用。如果MILP解算器能够识别导致不可行的特定约束,它将显示在日志中。i、

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

当预解算器无法获得冲突约束时,问题就会发生。我在日志中没有得到任何关于去哪里进行编辑的信息,这是一个漫长而乏味的过程,要在1000个约束中找出答案

如果有办法在求解运行后确定不可行的约束,请提供建议


我尝试过使用IIS选项,该选项对MILP解算器不起作用,而使用PRESTOL选项,即使是最轻微的不可行约束也不起作用。

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

注意:约束con[1]导致问题不可行。

如果不能,它会告诉你这个问题本身是不可行的。要找出导致问题的确切约束,可以删除约束并循环解算器,直到可行为止。有关更多信息,请参阅。示例代码如下:

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;
proc optmodel presolver=none;
/*声明变量*/
var x{1..3}>=0;
/*变量x[3]的上界*/
x[3].ub=3;
/*目标函数*/
最小obj=x[1]+x[2]+x[3];
/*约束条件*/
con c1:x[1]+x[2]>=10;

con c2:x[1]+x[3]我尝试过使用IIS选项,问题是如果您尝试使用milp解决问题,IIS选项无效。这就是我正在做的。。。是否有其他方法可用于相同的问题。虽然解决方案并不理想,但上述循环方法应为您提供关于其失败的大致方向。MILP解算器已经在其大多数分支切割中使用LP松弛。我理解,但是有没有办法使用MILP解算器来找出不可行性?此外,是否有一种方法可以获取sas中MILP solver在日志中打印的约束,它必须存储在某个宏变量中。