Originally posted by: K__U
Hi,
I have an opl model that solves five consecutive connected models. One of the submodel solves many problems with a for loop and the next model combines these solutions.
Since the parameters are known for this set of subproblems, I would like to call these models in parallel. I couldn't use the IloOplExec since the model inputs (for the entire subproblem set) are connected to the previous model solution.
Do you have any suggestion ? Subproblem code is below:
for (var SubSol in opl2.Sub_Sol) {
writeln("********************** SubSet >> Multi Period Solution **************************");
for (var SubDem in opl2.Sub_Dem){
if(SubSol.id==SubDem.id) {opl2.Selected_Demands.add(SubDem.dem)}
}
for (var SubSup in opl2.Sub_Supply){
if(SubSup.id==SubSol.id) {opl2.Selected_Supply.add(SubSup.supply);}
}
var src3 = new IloOplModelSource("13_Sub_Problem.mod");
var def3 = new IloOplModelDefinition(src3);
var cplex3 = new IloCplex();
var opl3 = new IloOplModel(def3, cplex3);
var data3 = new IloOplDataElements();
data3.t=thisOplModel.t;
data3.Demand_N=opl2.Selected_Demands;
data3.Demand_L=opl2.Demand_L;
data3.Dtemp=opl2.D;
data3.solutionpath=solutionpath;
data3.maxDist=opl2.maxDist;
data3.DistanceTemp=opl2.DistanceTemp;
data3.wType=opl2.wType;
data3.SubSolID=SubSol.id;
data3.Supply=opl2.Selected_Supply;
data3.iterationno=iterationno;
//SubProblem Relaxation
data3.DC=opl2.Empty;
if(all_locations==1){
if(opl2.Selected_Demands.contains(SubSol.dc)){
data3.DC=opl2.Selected_Demands;
}else{
data3.DC=(opl2.Selected_Demands);
data3.DC.add(SubSol.dc);
};
}else{
data3.DC.add(SubSol.dc);
};
data3.AltNew=opl2.EmptyIntSet;
data3.AltNew.add(1);
data3.AltNew.add(2);
data3.AltNew.add(3);
data3.AltNew.add(4);
data3.AltNew.add(5);
data3.AltNew.add(6);
data3.AltNew.add(7);
data3.AltNew.add(8);
data3.AltNew.add(9);
data3.AltNew.add(10);
opl3.addDataSource(data3);
opl3.generate();
cplex3.tilim = 90;
cplex3.epgap=0.001; // relative gap
cplex3.mipemphasis=2;
if (!cplex3.solve() || cplex3.getCplexStatus()==11){
writeln("NO solution found during the initial time limit, so now we`ll change settings");
cplex3.tilim = 3600;
cplex3.epgap = 0.01; // relative gap
cplex3.mipemphasis = 3;
}else{
writeln("Solution found with initial settings, now we`ll continue to postprocess");
writeln("Status : ",cplex3.getCplexStatus());
opl3.postProcess();
};
// Updating the 00_tmp_sub_control data:
for (var j1 in opl3.DC){opltmp.Control_DC.add(SubSol.id,SubSol.alt,j1)};
for (var j2 in opl3.Demand_N){opltmp.Control_Demand.add(SubSol.id,j2)};
cplextmp.solve();
opltmp.postProcess();
thisOplModel.Dem_Per.add(opl3.Dem_Per_tmp);
thisOplModel.Columns.add(opl3.Columns);
var dempersize=0;
for(var k in opl3.Dem_Per_tmp){
thisOplModel.Covering[k.dem][k.per].add(k.id);
dempersize++;
};
opl3.Dem_Per_tmp.clear();
opl3.Columns.clear();
opl3.Columns_tmp.clear();
opl3.Columns_cost_tmp.clear();
opl3.Columns_cost.clear();
opl3.DC.clear();
opl3.AltNew.clear();
opl3.end();
data3.end();
def3.end();
src3.end();
cplex3.end();
opl2.Selected_Demands.clear();
opl2.Selected_Supply.clear();
}; //end of for loop
Thanks
#DecisionOptimization#OPLusingCPLEXOptimizer