Originally posted by: viva0521
Hello,
I am using lagrangian relaxation method to solve a MIP multi commodity flow problem. When I was trying to update my lagrangian multiplier with current flow, I got a problem here that can not update my lagrangian multiplier in main block as follows:
...
main {
var source = thisOplModel;
var status = 0;
thisOplModel.settings.mainEndEnabled = true;
thisOplModel.generate();
var GAP = 1.0e-6; //use to check if result is coverage
var lagm1 = source.TableHWArcs[" <t.fromnode,t.tonode>:t.lagm | t in TableHWArcs "];
var lagm2 = source.TableRWArcs[" <t.fromnode,t.tonode>:t.lagm | t in TableRWArcs "];
var Cap1 = source.TableHWArcs [" <t.fromnode,t.tonode>:t.cap | t in TableHWArcs "];
var Cap2 = source.TableRWArcs [" <t.fromnode,t.tonode>:t.cap | t in TableRWArcs "];
var slack1 = source.TableHWArcs[" <t.fromnode,t.tonode>:t.slack | t in TableHWArcs "];
var slack2 = source.TableRWArcs[" <t.fromnode,t.tonode>:t.slack | t in TableHWArcs "];
var totalflow1 = 0;
var totalflow2 = 0;
var m1Def = thisOplModel.modelDefinition;
var m1Cplex = cplex;
var m1Data = thisOplModel.dataElements;
var best;
var curr = Infinity;
// Creating the m1 model
var m1Opl = new IloOplModel(m1Def, ma1Cplex);
m1Opl.addDataSource(m1Data);
m1Opl.generate();
// define m2 model
var m2Source = new IloOplModelSource("MIPexm.mod");
var m2Def = new IloOplModelDefinition(m2Source);
var m2Cplex = new IloCplex();
//first solve m1 model with initial data
if ( m1Cplex.solve() ) {
m1Opl.postProcess();
best = m1Cplex.getObjValue();
writeln("OBJECTIVE: ",best);
for(var i in RWArcs)for(o in Ori)for(d in Dest)
writeln("y[i].add(i,j)[o][d]: ",m1Opl.y[i].add(i,j)[o][d].solutionValue);
for(var i in HWArcs)for(o in Ori)for(d in Dest)
writeln("x[i].add(i,j)[o][d]: ",m1Opl.x[i].add(i,j)[o][d].solutionValue);
m1Opl.end();
m1Def.end();
m1Cplex.end();
m1Source.end(); //m1 model is no longer needed
}
//Ceating m2 model
var m2Opl = new IloOplModel(m2Def,m2Cplex);
//Using data elements from m1 model and pass its solution to m2 model
var m2Data = thisOplModel.dataElements;
m2Data.TableRWArcs.add(m1Data.TableRWArcs.flow,1,m2Opl.Use.solutionValue);
m2Data.TableHWArcs.add(m1Data.TableHWArcs.flow,1,m2Opl.Use.solutionValue);
//start iteration and the maximum number of iteration now is 20
var iter_limit = 20;
for(var k=1; k<=iter_limit;k++) {
var step = 1/k;
writeln();
writeln(" ITERATION: " , k );
// update lagrangian multiplier
for(var i in HWArcs){
for(o in Ori)
for(d in Dest){
totalflow1 += x[i].add(i,j)[o][d];}
slack1[i].add(i,j) = totalflow1 - Cap1[i].add(i,j) this expression cannot be assigned
};
for(var i in RWArcs)
for(o in Ori)
for(d in Dest){
totalflow2 += y[i].add(i,j)[o][d];
slack2[i].add(i,j) = totalflow2 - Cap2[i].add(i,j) this expression cannot be assigned
};
for(i in HWArcs)for(o in Ori)for( d in Dest) {
temp1[i].add(i,j) = lagm1[i].add(i,j);
if (temp1[i].add(i,j) + step * slack1[i].add(i,j) > 0)
lagm1[i].add(i,j) = temp1[i].add(i,j) + (step * slack[i].add(i,j)) ;
else
lagm1[i].add(i,j) = 0;
};
for(i in RWArcs)for(o in Ori)for( d in Dest) {
temp2[i].add(i,j) = lagm1[i].add(i,j);
if (temp2[i].add(i,j) + step * slack2[i].add(i,j) > 0 )
lagm2[i].add(i,j) = temp1[i].add(i,j) + (step * slack[i].add(i,j)) ;
else
lagm2[i].add(i,j) = 0;
};
m2Data.addDataSource
m2Opl.addDataSource(m2Data);
m2Opl.generate();
if (m2Cplex.solve()
&¤t = m2Cplex.getObjValue()&& (best - current) <= GAP)
{writeln();
writeln("M2 OBJECTIVE: ",m2Cplex.getObjValue());
}
else {
writeln("No better solution, stop.");
m2Data.end();
m2Opl.end();
break;}
m2Def.end();
m2Cplex.end();
m2Source.end();
status;
}
}
Would you please provide any suggestion? Thanks in advance! Also, I attached my mod and data file here if anyone can kindly help me to try this.
#DecisionOptimization#OPLusingCPLEXOptimizer