我想知道在使用CPLEX Java API读取文件中的模型后,如何更改约束的右侧。
我们说我有以下代码:
IloCplex cplex = new IloCplex();
cplex.setParam(IloCplex.IntParam.RootAlg,IloCplex.Algorithm.Auto);
cplex.importModel(filename);
if ( cplex.solve() ) {
// solve the model
}
我有一个约束" c0"我想解决同一个模型只改变这个约束的右边。在我再次解决模型之前如何更改它?我试图在安装包中查找示例,但到目前为止我错过了如何操作。
有一个函数setBounds(newLB,new UB),但我不能只写我的代码 c0.setBounds(新LB,新UB)。
任何帮助都会很棒。
答案 0 :(得分:0)
这可能不是最佳解决方案,但经过一些研究后我发现:
String filename = "model.lp";
IloCplex cplex = new IloCplex();
cplex.setParam(IloCplex.IntParam.RootAlg,IloCplex.Algorithm.Auto);
cplex.importModel(filename);
IloLPMatrix lp = (IloLPMatrix)cplex.LPMatrixIterator().next();
if(cplex.solve()){
double[] x = cplex.getValues(lp);
for (int j = 0; j < x.length; ++j){
System.out.println("Nome: " + lp.getNumVar(j).getName() + " Valor: " + x[j]);
}
}
IloRange [] list = lp.getRanges();
for(int g = 0; g < list.length; ++g){
System.out.println(list[g].getLB() + " <= " + list[g].getName() + " <= " + list[g].getUB());
if(list[g].getName().equals("r1")){
list[g].setBounds(6.5, 6.5);
}
}
我可以获得约束“r1”并更改其限制。它至少为玩具问题提供了正确的答案。 但是,当我第二次尝试解决模型时,cplex给了我: “警告:1 MIP开始没有找到解决方案。” 我知道第一个问题的解决方案不会是第二个程序的解决方案。根据我的研究,我理解,可能是错误的,因为第一个问题的解决方案对于第二个问题是不可行的,所以它将从头开始,因为我有一个MIP问题。那么,如果我只是在文件中再次编写模型并再次加载它会更好吗?