Как изменить ограничение cplex правой стороны в java

Я хотел бы знать, как я могу изменить правую часть ограничения после того, как я прочитал модель в файле с 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, новый UB), но я не могу просто написать в своем коде c0.setBounds (новый LB, новый UB).

Любая помощь была бы замечательной.


person Albionion    schedule 11.07.2014    source источник


Ответы (1)


Возможно, это не лучшее решение, но после некоторых исследований я обнаружил, что:

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. Итак, было бы предпочтительнее, если бы я просто снова записал модель в файл и снова загрузил ее?

person Albionion    schedule 14.07.2014