Обновление нижней границы полунепрерывной переменной больше не сохраняет ее полунепрерывной

#java #cplex

#java #cplex

Вопрос:

Я создал полунепрерывную переменную CPLEX, а затем обновил ее значение нижней границы. Переменная больше не обрабатывалась как полунепрерывная.

 IloCplex cplex = new IloCplex();
IloLinearNumExpr objective = cplex.linearNumExpr();
IloNumVar x1=cplex.semiContVar(10, Double.MAX_VALUE,IloNumVarType.Float,"x1");
IloNumVar x2 = cplex.numVar(10, Double.MAX_VALUE,IloNumVarType.Float,"x2");
//If below line is commented, variable x1 is treated as semi continuous
x1.setLB(10);
objective.addTerm(x1, 4);
objective.addTerm(x2, 2);
cplex.addMinimize(objective);
cplex.lowerBound(x1..getVar().setLB(arg0);
cplex.solve();
if (cplex.solve()) {
    cplex.exportModel("Test2Variables.lp");
    System.out.println(cplex.getObjValue());
}
  

Я ожидаю, что результат будет равен 20, но фактический результат равен 60

Ответ №1:

Хорошо, я получил решение:

При установке нижней границы я использовал : ((IloSemiContVar)x1).setSemiContLB(10);

Это решило проблему.

Комментарии:

1. Было бы чище объявлять x1 как IloSemiConVar вместо IloNumVar . Тогда вам не нужно было бы приводить ее к использованию setSemiContLB() .