/********************************************* * OPL 12.10.0.0 Model * Author: calle * Creation Date: 10 Dec. 2020 at 4:45:51 pm *********************************************/ //Sets definition {string} Plants = ... ; {string} Customers = ...; //Tuples structures to read dynamic sets and dynamic parameters tuple dataExtremePoints{ int idExtremePoint; }; {dataExtremePoints} infoExtremePoints = {}; tuple dataPlantsExtremePoints { string Plant; int idExtremePoint; float ub; } {dataPlantsExtremePoints} infoPlantsExtremePoints = {}; tuple dataCustomersExtremePoints { string Customer; int idExtremePoint; float vb; } {dataCustomersExtremePoints} infoCustomersExtremePoints = {}; tuple dataPlantsCustomersExtremePoints { string Plant; string Customer; int idExtremePoint; float wb; } {dataPlantsCustomersExtremePoints} infoPlantsCustomersExtremePoints = {}; tuple dataExtremeRays{ int idExtremeRay; }; {dataExtremeRays} infoExtremeRays = {}; tuple dataPlantsExtremeRays { string Plant; int idExtremeRay; float ubu; } {dataPlantsExtremeRays} infoPlantsExtremeRays = {}; tuple dataCustomersExtremeRays { string Customer; int idExtremeRay; float vbu; } {dataCustomersExtremeRays} infoCustomersExtremeRays = {}; tuple dataPlantsCustomersExtremeRays { string Plant; string Customer; int idExtremeRay; float wbu; } {dataPlantsCustomersExtremeRays} infoPlantsCustomersExtremeRays = {}; //Parameters definition float Supply[Plants] = ...; float Demand[Customers] = ...; float f[Plants][Customers] =...; float c[Plants][Customers] =...; float M[Plants][Customers] = ...; float yb[Plants][Customers]=[]; main { thisOplModel.settings.mainEndEnabled = true; thisOplModel.generate(); // read; var Plants = thisOplModel.Plants; var Customers = thisOplModel.Customers; var Supply = thisOplModel.Supply; var Demand = thisOplModel.Demand; var f = thisOplModel.f; var c = thisOplModel.c; var M = thisOplModel.M; var infoExtremePoints = thisOplModel.infoExtremePoints; var infoPlantsExtremePoints = thisOplModel.infoPlantsExtremePoints; var infoCustomersExtremePoints = thisOplModel.infoCustomersExtremePoints; var infoPlantsCustomersExtremePoints = thisOplModel.infoPlantsCustomersExtremePoints; var infoExtremeRays = thisOplModel.infoExtremeRays; var infoPlantsExtremeRays = thisOplModel.infoPlantsExtremeRays; var infoCustomersExtremeRays = thisOplModel.infoCustomersExtremeRays; var infoPlantsCustomersExtremeRays = thisOplModel.infoPlantsCustomersExtremeRays; var yb =thisOplModel.yb; //dummy value for yb for (var i in Plants) { for (var j in Customers) { yb[i][j]=1; } }; //Iteration parameters var upperBound = 5000; var lowerBound = -10; var epsilon = 0.1; var nIter =0; var nOptCuts = 0; var nFeasCuts = 0; while (upperBound - lowerBound > epsilon) //while (nIter <4) { nIter = nIter+1; writeln("iteration:" + nIter) // Define dual subproblem var dualSubproblemSrc = new IloOplModelSource("dualSubproblemYParameter.mod"); var dualSubproblemDef = new IloOplModelDefinition(dualSubproblemSrc); var dualSubproblem = new IloOplModel(dualSubproblemDef,cplex); var dualSubproblemData = new IloOplDataElements(); dualSubproblemData.Plants = Plants; dualSubproblemData.Customers = Customers; dualSubproblemData.Supply = Supply; dualSubproblemData.Demand = Demand; dualSubproblemData.c = c; dualSubproblemData.f = f; dualSubproblemData.M = M; dualSubproblemData.yb = yb; dualSubproblem.addDataSource(dualSubproblemData); dualSubproblem.generate(); //solve dual subproblem if (cplex.solve()) { writeln("feasible dual subproblem -> add an optimality cut") writeln("dual subproblem solution") writeln("u= " + dualSubproblem.u); writeln("v= " + dualSubproblem.v); writeln("w= " + dualSubproblem.w); writeln("Dual Subproblem Objective Function =" + cplex.getObjValue()) dualSubproblem.postProcess(); //Check to update upper bound (q is the name of DSP objective function + fy) writeln("previous Upper Bound= " + upperBound); if (dualSubproblem.q < upperBound) { upperBound=dualSubproblem.q; } writeln("new Upper Bound= " + upperBound); //Add Optimality Cut nOptCuts=nOptCuts+1; //add element to extreme points set infoExtremePoints.add(nOptCuts) //update ub for (i in Plants) { infoPlantsExtremePoints.add(i,nOptCuts,dualSubproblem.u[i]); } //update vb for (j in Customers) { infoCustomersExtremePoints.add(j,nOptCuts,dualSubproblem.v[j]); } //update wb for (i in Plants) { for (j in Customers) { infoPlantsCustomersExtremePoints.add(i,j,nOptCuts,dualSubproblem.w[i][j]); } } dualSubproblem.end(); } else { // Solve the homogeneous system to add feasability cut to relaxed master problem dualSubproblem.end(); writeln("infeseable dual subproblem"); writeln("generate feasability cut"); //Define homogeneous system var homogeneousSystemSrc = new IloOplModelSource("HomogeneousSystemYParameter.mod"); var homogeneousSystemDef = new IloOplModelDefinition(homogeneousSystemSrc); var homogeneousSystem = new IloOplModel(homogeneousSystemDef,cplex); var homogeneousSystemData = new IloOplDataElements(); homogeneousSystemData.Plants = Plants; homogeneousSystemData.Customers = Customers; homogeneousSystemData.Supply = Supply; homogeneousSystemData.Demand = Demand; homogeneousSystemData.M = M; homogeneousSystemData.yb = yb; homogeneousSystem.addDataSource(homogeneousSystemData); homogeneousSystem.generate(); if (cplex.solve()) { writeln("solution homogeneous system"); writeln("u= " + homogeneousSystem.u); writeln("v= " + homogeneousSystem.v); writeln("w= " + homogeneousSystem.w); //Add Feasability Cut nFeasCuts=nFeasCuts+1; //add element to extreme rays set infoExtremeRays.add(nFeasCuts); //update ubu for (i in Plants) { infoPlantsExtremeRays.add(i,nFeasCuts,homogeneousSystem.u[i]); } //update vbu for (j in Customers) { infoCustomersExtremeRays.add(j,nFeasCuts,homogeneousSystem.v[j]); } //update wbu for (i in Plants) { for (j in Customers) { infoPlantsCustomersExtremeRays.add(i,j,nFeasCuts,homogeneousSystem.w[i][j]); } } homogeneousSystem.end(); }; }; //Define relaxed master problem var relaxedMasterSrc = new IloOplModelSource("RelaxedMasterProblemYParameter.mod"); var relaxedMasterDef = new IloOplModelDefinition(relaxedMasterSrc); var relaxedMaster = new IloOplModel(relaxedMasterDef,cplex); var relaxedMasterData = new IloOplDataElements(); relaxedMasterData.Plants = Plants; relaxedMasterData.Customers = Customers; relaxedMasterData.Supply = Supply; relaxedMasterData.Demand = Demand; relaxedMasterData.M = M; relaxedMasterData.f = f; relaxedMasterData.infoExtremePoints = infoExtremePoints; relaxedMasterData.infoPlantsExtremePoints = infoPlantsExtremePoints; relaxedMasterData.infoCustomersExtremePoints = infoCustomersExtremePoints; relaxedMasterData.infoPlantsCustomersExtremePoints = infoPlantsCustomersExtremePoints; relaxedMasterData.infoExtremeRays = infoExtremeRays; relaxedMasterData.infoPlantsExtremeRays = infoPlantsExtremeRays; relaxedMasterData.infoCustomersExtremeRays = infoCustomersExtremeRays; relaxedMasterData.infoPlantsCustomersExtremeRays = infoPlantsCustomersExtremeRays; relaxedMaster.addDataSource(relaxedMasterData); relaxedMaster.generate(); if (cplex.solve()) { writeln("Relaxed Master Problem Objective Function"+ cplex.getObjValue()); writeln("PreviousLowerBound= " + lowerBound); lowerBound=cplex.getObjValue(); writeln("newLowerBound= " + lowerBound); //Update yb writeln("previous yb=" + yb); for (i in Plants){ for (j in Customers){ yb[i][j]=relaxedMaster.y[i][j]; } } //yb = relaxedMaster.y; writeln("new yb="+ yb); relaxedMaster.end(); } else { writeln("error solving the relaxed master problem"); } if (nIter>50) { writeln("There are problems, after 50 iterations I could not converge"); writeln("lower bound =" + lowerBound); writeln("Upper bound" + upperBound); break; }; }; };