2016-08-17 13 views
0

Я хотел бы решить простую проблему в cplex, используя моделирование столбцов. Вот проблема,Моделирование столбцов в Cplex с использованием Java

maximize 2x + 3y 
subject to x<= 5 
      y<=2 
      x,y >=0 

А вот код, который я должен написал ее решить:

public static void Model_1() { 
     try { 
      //create new model 
      IloCplex cplex = new IloCplex(); 
      //define variables 
      IloNumVar x; 
      IloNumVar y; 
      IloObjective objective; 
      objective = cplex.addMaximize(); 
      IloRange cons01; 
      IloRange cons02; 
      cons01 = cplex.addRange(0, 5, "c1"); 
      cons02 = cplex.addRange(0, 2, "c1"); 
      IloColumn new_col = cplex.column(objective, 2); 
      IloColumn new_col2 = cplex.column(objective,3); 
      new_col = new_col.and(cplex.column(cons01,1)); 
      new_col2 = new_col2.and(cplex.column(cons02,1)); 
      x = cplex.numVar(new_col, 0, Double.MAX_VALUE); 
      y = cplex.numVar(new_col, 0, Double.MAX_VALUE); 
//solve model 
      if (cplex.solve()) { 
       System.out.println("obj = "+cplex.getObjValue()); 
       System.out.println("x = "+cplex.getValue(x)); 
       System.out.println("y = "+cplex.getValue(y)); 
} 
      else { 
       System.out.println("Model not solved"); 
      } 
      cplex.end(); 
     } 
     catch (IloException exc) { 
      exc.printStackTrace(); 
     } 
    } 

Но я не получаю правильное решение. Имею ли я ошибку при написании кода?

ответ

0

При попытке отладки этого типа проблемы всегда полезно экспортировать модель в формат LP, чтобы убедиться, что вы сгенерировали ее правильно. Вы можете сделать это, добавив следующую строку кода непосредственно перед вызовом cplex.solve:

cplex.exportModel("model.lp"); 

Если вы сделаете это, содержимое model.lp выглядеть следующим образом:

Maximize 
obj: 2 x1 + 2 x2 
Subject To 
c1: x1 + x2 - Rgc1 = 0 
c1: - Rgc1 = 0 
Bounds 
0 <= Rgc1 <= 5 
0 <= Rgc1 <= 2 
End 

Это проливает свет на два опечатки, которые вы сделали в своей программе. А именно, вы должны заменить:

cons02 = cplex.addRange(0, 2, "c1"); 

с

cons02 = cplex.addRange(0, 2, "c2"); 

И, вы должны заменить:

y = cplex.numVar(new_col, 0, Double.MAX_VALUE); 

с

y = cplex.numVar(new_col2, 0, Double.MAX_VALUE); 

После внесения этих двух изменений model.lp выглядит так:

Maximize 
obj: 2 x1 + 3 x2 
Subject To 
c1: x1 - Rgc1 = 0 
c2: x2 - Rgc2 = 0 
Bounds 
0 <= Rgc1 <= 5 
0 <= Rgc2 <= 2 
End 

И вы получите следующий вывод из программы:

obj = 16.0 
x = 5.0 
y = 2.0 
+0

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

+0

Привет @rkersh Мне было интересно, я могу экспортировать модель двойственной задачи также от CPLEX? – Dipta

+0

@ Dipta, если по Cplex, вы имеете в виду интерактивность, то да. – rkersh

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

  • Нет связанных вопросов^_^