0

線形計画法の問題を解決するために cplex を使用しています。問題の規模が大きいと getIIS の呼び出し時間が長くなるため、代わりに、refineConflict メソッドを使用して最小限の競合を見つけるようにしています。しかし、getIIS と renameConflict を呼び出した結果は大きく異なります。以下は、満たされない線形計画問題の結果です。

getIIS を呼び出した結果:

IloRange 3_4 : 0.0 <= (-1.0*water_t_4 + 1.0*water_v_1_4) <= infinity
IloRange 3_4 : 5.0 <= (2.0*water_t_4 + 1.0*water_v_2_4) <= infinity
IloRange 4_5 : 0.0 <= (-1.0*water_v_2_4 - 1.0*water_t_5 + 1.0*water_v_2_5) <= infinity
IloRange 4_5 : 2.0 <= (1.0*water_v_1_4) <= 2.0
IloRange 5_6 : 0.0 <= (1.0*water_v_2_5) <= 0.0

renameConflict を呼び出した結果 (最初のパラメーターは線形制約全体で、2 番目のパラメーターはメンバーが 1 に設定された配列です)。

Possible : IloRange 4_5 : 2.0 <= (1.0*water_v_1_4) <= 2.0
Possible : IloRange 5_6 : 0.0 <= (1.0*water_v_2_5) <= 0.0

2 つの方法で得られる結果について、私は混乱しています。これが私のコードで、cplex のバージョンは cplex_studio125.win-x86-64 です。

cplex=new IloCplex();
cplex.setParam(IloCplex.IntParam.Threads,1);
cplex.setParam(IloCplex.IntParam.RootAlg, IloCplex.Algorithm.Concurrent);
cplex.addRangel()...
if(!cplex.solve){
   IloConstraint[] arr is the whole linear constraints 
    double prefs[] = new double[arr.length];
    Arrays.fill(prefs, 1);
    if(cplex.refineConflict(arr, prefs)){               
      ConflictStatus[] conflicts = cplex.getConflict(arr);
      for (int i1 = 0; i1 < conflicts.length;i1++ ){                 
        if(conflicts[i1]== ConflictStatus.Member)
           System.out.println(" Proved : " + arr[i1]);
        else if (conflicts[i1]==ConflictStatus.PossibleMember)
           System.out.println(" Possible : " + arr[i1]);
      }
    }
 }

ご協力いただきありがとうございます。

4

0 に答える 0