0

我正在使用 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]);
      }
    }
 }

谢谢你的帮助。

4

0 回答 0