2017-03-29 11 views
0

私はproc optmodelを使って最適化モデルを構築しようとしています。私はMILPソルバーを使用しています。Proc Optmodel MILPソルバ、実行不可能な制約を見つける方法

プリソルバーが競合する制約を得ることができないときに問題が発生します。私は、どこに行かなければならないかについての情報を得ず、1000の制約の中から長所と退屈なプロセスを考え出します。

解決策実行後に実行不可能な制約を識別する方法がある場合は助言をお願いします。

私はMILPソルバー、PRESTOLオプションのために働かないIISオプションを試してみましたが、実行可能な制約はほとんどありませんが、何も効果がありませんでした。

答えて

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コミュニティフォーラム

+0

私はIISのオプションを使用してみましたが、問題は、あなたがMILPで解決しようとする場合、IISのオプションが有効でないということです。私は何をしているのですか...同じものに利用できる他の方法はありますか? – mathgeek121

+0

解決策は理想的ではありませんが、上記のループ方法では、どこに障害が発生しているかについての適切な方向性が示されます。 MILPソルバは、ほとんどの分岐カットでLP緩和を使用しています。 –

+0

私は理解していますが、MILPソルバを使って実現不可能性を発見する方法はありますか? また、sas自体のMILPソルバーによってログに出力される制約を取得する方法があります。マクロ変数のどこかに格納する必要があります。 – mathgeek121

関連する問題