2016-08-17 21 views
0

我想通过列明智建模来解决cplex中的一个简单问题。 这是问题所在,使用Java在Cplex中进行列明智建模

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