我正在使用 cplex 来解决线性规划问题。由于问题较大时调用getIIS的时间较长,所以我尝试使用refineConflict方法来寻找最小冲突。但是调用getIIS 和refineConflict 的结果是很不一样的。下面是一个不可满足的线性规划问题的结果。
调用 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
调用refineConflict的结果(第一个参数是整个线性约束,第二个是成员设置为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
我对这两种方法给出的结果感到困惑。这是我的代码,我的 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]);
}
}
}
谢谢你的帮助。