2016-07-21 3 views
0

Я пытаюсь получить двойные значения в java с помощью cplex. Но я получаю неправильную ценность. Я знаю, что это неправильно, потому что я проверил двойные значения, используя другой решатель. Я не мог найти никаких проблем с моим кодом. Может ли кто-нибудь сказать мне, что здесь не так? Моя проблема приводится ниже:Получение двойного значения в Java с использованием Cplex

minimize 100000x1 + 0.869x2 + 299997x3 + 199998x4 + 199998x5 
subject to x1 = 1 
      x1+x2=1 
      x3 = 1 
      x3+x4=1 
      x5 = 1 
      x1+x2+X3+x4+x5 <= 500 

И это мой код:

public class dual_new { 
    public static void main(String[] args) { 
    Model_1(); 
    } 
    public static void Model_1() { 
     try { 
      //create new model 
      IloCplex cplex = new IloCplex(); 
      //define variables 
      IloNumVar x1 = cplex.numVar(0, 1,"x1"); 
      IloNumVar x2 = cplex.numVar(0, 1,"x2"); 
      IloNumVar x3 = cplex.numVar(0, 1,"x3"); 
      IloNumVar x4 = cplex.numVar(0, 1,"x4"); 
      IloNumVar x5 = cplex.numVar(0, 1,"x5"); 



      //define expressions 
      IloLinearNumExpr objective = cplex.linearNumExpr(); 
      objective.addTerm(100000, x1); 
      objective.addTerm(0.869, x2); 
      objective.addTerm(299997, x3); 
      objective.addTerm(199998, x4); 
      objective.addTerm(199998, x5); 

      //define objective 
      cplex.addMinimize(objective); 
      //define constraints 
      List<IloRange>constraints = new ArrayList<IloRange>(); 
      constraints.add(cplex.addEq(cplex.prod(1, x1),1)); 
      constraints.add(cplex.addEq(cplex.sum(cplex.prod(1, x1),cplex.prod(1, x2)),1)); 
      constraints.add(cplex.addEq(cplex.prod(1, x3),1)); 
      constraints.add(cplex.addEq(cplex.sum(cplex.prod(1, x3),cplex.prod(1, x4)),1)); 
      constraints.add(cplex.addEq(cplex.prod(1, x5),1)); 
      constraints.add(cplex.addLe(cplex.sum(cplex.prod(1, x1),cplex.prod(1, x2),cplex.prod(1, x3),cplex.prod(1, x4),cplex.prod(1, x5)),500)); 

      //solve model 
      if (cplex.solve()) { 
       System.out.println("obj = "+cplex.getObjValue()); 
       System.out.println("x1 = "+cplex.getValue(x1)); 
       System.out.println("x2 = "+cplex.getValue(x2)); 
       System.out.println("x3 = "+cplex.getValue(x3)); 
       System.out.println("x4 = "+cplex.getValue(x4)); 
       System.out.println("x5 = "+cplex.getValue(x5)); 

       for(int i=0; i<constraints.size();i++) 
       System.out.println("dual = "+(i+1) +" = " +cplex.getDual(constraints.get(i))); 
      } 
      else { 
       System.out.println("Model not solved"); 
      } 
      cplex.end(); 
     } 
     catch (IloException exc) { 
      exc.printStackTrace(); 
     } 
    } 
} 

ответ

0

Там нет ничего плохого. Двойная проблема для вашей модели имеет несколько оптимальных решений; поэтому решатель может дать вам любое из этих решений, где ни один из них не является неправильным. Способ проверить это - вычислить цель двойной проблемы, используя двойные значения из первичного, вы должны получить одинаковое объективное значение для обеих проблем.

+0

Большое спасибо :) – Dipta

Смежные вопросы