如何在java中更改约束右侧cplex

时间:2014-07-11 19:23:54

标签: constraints cplex

我想知道在使用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)。

任何帮助都会很棒。

1 个答案:

答案 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问题。那么,如果我只是在文件中再次编写模型并再次加载它会更好吗?