/********************************************* * OPL 12.5 Model * Author: jescamilla *********************************************/ using CP; int nbJobs = ...; int nbMchs = ...; int nbOp = ...; range Jobs = 0..nbJobs-1; range Mchs = 0..nbMchs-1; range Op = 0..nbOp-1; int mkmax = 0; int energymax = 0; int nbTotOp = nbJobs*nbOp; range TotOp = 0..nbTotOp-1; int maxenergy[TotOp]; //int maxmk[TotOp]; // Mchs is used both to index machines and operation position in job tuple Operation { int id; //Id (nuevo) int mch; // Machine }; tuple Mode { int opId; // Operation id int energy; // Energy int pt; // Processing time }; Operation Ops[j in Jobs][m in Op] = ...; {Mode} Modes = ...; dvar interval itvs[j in Jobs][o in Op]; dvar interval modes[md in Modes] optional size md.pt; dvar sequence mchs[m in Mchs] in all(j in Jobs, o in Op : Ops[j][o].mch == m) itvs[j][o]; dexpr int energyEff= sum(md in Modes) md.energy * presenceOf(modes[md]); dexpr int mk= max(j in Jobs) endOf(itvs[j][nbOp-1]); execute { cp.param.TimeMode = "ElapsedTime"; cp.param.TimeLimit = 100;// limit time 100 seconds. It is changed depending on the type of instance. for(var md in Modes){ if (md.energy>maxenergy[md.opId-1]){ energymax+=md.energy-maxenergy[md.opId-1]; maxenergy[md.opId-1]=md.energy; }//energymax } mkmax = 1906;//maximum makespan value equal to 1906. It is changed depending on the type of instance. This values can be download for the web page. } float lambda = 0.5; //lambda value equal to 0.5 It has to be changed. minimize ((1-lambda)*((energyEff)/(energymax))+lambda*((mk)/(mkmax))); subject to { forall (m in Mchs)//Machine constraints noOverlap(mchs[m]); forall (j in Jobs, o in 0..nbOp-2)//Precedence constraints endBeforeStart(itvs[j][o], itvs[j][o+1]); forall (j in Jobs, o in Op) alternative(itvs[j][o], all(md in Modes: md.opId==Ops[j][o].id) modes[md]); } execute { for (var j = 0; j <= nbJobs-1; j++) { for (var o = 0; o <= nbMchs-1; o++) { write(itvs[j][o].start + " "); } writeln(""); } }