実行不可能の原因となっている特定の制約を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コミュニティフォーラム
私はIISのオプションを使用してみましたが、問題は、あなたがMILPで解決しようとする場合、IISのオプションが有効でないということです。私は何をしているのですか...同じものに利用できる他の方法はありますか? – mathgeek121
解決策は理想的ではありませんが、上記のループ方法では、どこに障害が発生しているかについての適切な方向性が示されます。 MILPソルバは、ほとんどの分岐カットでLP緩和を使用しています。 –
私は理解していますが、MILPソルバを使って実現不可能性を発見する方法はありますか? また、sas自体のMILPソルバーによってログに出力される制約を取得する方法があります。マクロ変数のどこかに格納する必要があります。 – mathgeek121