我正在编写包括场景子问题的分解算法。我使用模型指针来创建子问题优化模型。然后,随着算法的进行,需要修改每个子问题的目标函数系数。我使用指针来避免每次从头开始创建子问题模型。代码部分显示如下;生成子问题模型指针(用于 2 个场景),然后必须使用 IloObjective::setLinearCoefficients 更改一个场景子问题的目标函数系数。修改后的子问题必须再次求解:
int main (int argc, char **argv)
{
int ScenearioNum=2;//Number of scenarios in small example
IloEnv env;
try {
//Generate the subproblem model pointers:
IloModel* MaxProblemPtr= new(env) IloModel[ScenearioNum];
IloObjective* MaxObjPtr= new(env) IloObjective[ScenearioNum];
for (int s=0;s<ScenearioNum;s++){
IloModel MaxProblem(env);
*(MaxProblemPtr+s)=MaxProblem;
IloObjective MaxObj= IloAdd(MaxProblem, IloMaximize(env));
*(MaxObjPtr+s)=MaxObj;
IloRangeArray ConstMax;
if (s==0){
ConstMax=IloAdd(MaxProblem,
IloRangeArray(env, - IloInfinity,RHS_sub1));
}else{
ConstMax=IloAdd(MaxProblem,
IloRangeArray(env, - IloInfinity,RHS_sub2));
}
for (int j=0;j<2;j++){
X.add(IloNumVar(MaxObj(1)+ConstMax[0](1)));
Y.add(IloNumVar(MaxObj(2)+ConstMax[1](1)));
}
IloCplex maxcplex(MaxProblem);
maxcplex.solve();
if (maxcplex.solve()) {
double currentObj=maxcplex.getObjValue();
cout<<"**max Objective function for s"<<s+1<<" :"<< currentObj<<endl;
}
}
//CHANGING OBJECTIVE FUNCTION OF FIRST SCENARIO
IloNumArray XCoeff(env);
IloObjective tempMaxObj=*MaxObjPtr;
tempMaxObj.setLinearCoefs(X,XCoeff);
IloModel Maxproblem=*MaxProblemPtr;
IloCplex maxcplex(Maxproblem);
}
}
catch (IloException& ex) {
cerr << "Error: " << ex << endl;
}
catch (...) {
cerr << "Error" << endl;
}
env.end();
return 0;
}
但是我在“tempMaxObj.setLinearCoefs”行中得到了未处理的异常错误。我不知道如何解决这个问题,因为模型指针似乎工作正常。如果有人帮助我,我将不胜感激。谢谢。