是否可以创建一个Cplex对象或IloModel数组?

时间:2018-02-08 06:21:16

标签: java optimization cplex

我使用Java来解决Cplex的一系列问题。我的主要方法是用修改的变量和约束来优化模型的不同立场(不,我不能每次都修改主模型)。

我的主要方法是创建一个Cplex对象数组,如下所示:

IloCplex[] model = new IloCplex[10];
IloNumVar[][] X = new IloNumVar[10][5];
for( int i=0;i<10;i++){
   for(int j=0;j<5;j++){
       x[i][j] = ; // something different each time,e.g. different lb&ub
   }
   rng[i] = ;// something different each time on x[i]s
   model[i].add(x[i]);
   model[i].add(rng[i]);
} // end of for loop
// to separate the model from solving procedure, another IloCplex object has been created:
IloCplex newModel = new IloCplex;
for(int  i=0;i<10;i++){
   newModel = model[i];
   newModel.addMinimize(cost(model[i], x[i]));
   newModel.solve()
   if(newModel.solve()){
       //print the answers
   }
   else{
       //print problem not solvable
   }

} // for循环结束

成本是获取模型和变量以及从中获取函数的函数。

因此,该算法第一次起作用(i = 0),但是,在求解过程中,它似乎改变了所有模型[i],尽管我试图将它们分开。因此,在下一次迭代中,问题无法解决,我得到了这个错误:

ilog.cplex.MultipleObjectiveException

我还尝试使用IloEnv来分离模型,但这也没有用(我在另一篇文章中将其作为一个问题:IloEnv is not working)。

有人有过类似的问题吗?你有更好的方法吗?有没有想过要解决问题?

提前致谢。

1 个答案:

答案 0 :(得分:0)

是的,可以创建一个IloCplex个对象的数组。正如您可能已经猜到的那样,您获得的错误表明您正在为同一模型添加多个目标。在没有看到所有代码的情况下,很难说更多。

这是一个使用IloCplex对象数组的工作玩具示例:

  IloCplex[] model = new IloCplex[10];
  IloNumVar[][] x = new IloNumVar[10][5];
  IloRange[] rng = new IloRange[10];
  double[] coefs = { 1.0, 1.0, 1.0, 1.0, 1.0 };

  for (int i = 0; i < 10; i++) {
     model[i] = new IloCplex();
     for (int j = 0; j < 5; j++)
        x[i][j] = model[i].numVar(Math.min(i, j), Math.max(i, j));
     rng[i] = model[i].addLe(model[i].scalProd(x[i], coefs), 20.0);
     model[i].add(rng[i]);
  }

  for (int i = 0; i < 10; i++) {
     IloCplex cplex = model[i];
     cplex.addMinimize(cplex.scalProd(x[i], coefs));
     cplex.exportModel(String.format("model%d.lp", i));
     if (cplex.solve()) {
        cplex.output().println("Solution status = " + cplex.getStatus());
        cplex.output().println("Solution value  = " + cplex.getObjValue());
        double[] val = cplex.getValues(x[i]);
        for (int j = 0; j < 5; j++)
           cplex.output().printf("Variable %d: Value = %f%n", j, val[j]);
     }
     else {
        cplex.output().println("Failed to solve instance " + i);
     }
     cplex.end();
  }