線形計画法の問題を解決するために 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]);
}
}
}
ご協力いただきありがとうございます。