我使用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)。
有人有过类似的问题吗?你有更好的方法吗?有没有想过要解决问题?
提前致谢。
答案 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();
}