Hi
let me show you with a tiny jobshop example:
You could write:
.mod
int nbJobs = ...;
int nbMchs = ...;
range Jobs = 0..nbJobs-1;
range Mchs = 0..nbMchs-1;
// Mchs is used both to index machines and operation position in job
tuple Operation {
int mch; // Machine
int pt; // Processing time
};
Operation Ops[j in Jobs][m in Mchs] = ...;
dvar int+ s[j in Jobs][o in Mchs];
dvar int+ e[j in Jobs][o in Mchs];
minimize max(j in Jobs) e[j][nbMchs-1];
subject to {
forall (j in Jobs, o in 0..nbMchs-1) e[j][o]-s[j][o]==Ops[j][o].pt;
forall (o1,o2 in Mchs) forall(i,j in Jobs:(Ops[i][o1].mch==Ops[j][o2].mch) && ((i!=j) || (o1!=o2)))
(s[i][o1]>=e[j][o2]) || (s[j][o2]>=e[i][o1]);
forall (j in Jobs, o in 0..nbMchs-2)
(e[j][o]<=s[j][o+1]);
}
execute {
for (var j = 0; j <= nbJobs-1; j++) {
for (var o = 0; o <= nbMchs-1; o++) {
write(s[j][o] + " ");
}
writeln("");
}
}
and then .dat
nbJobs = 6;
nbMchs = 6;
Ops = [
[ <5,4>, <1,3>, <4,3>, <3,2>, <0,1>, <2,2> ],
[ <1,3>, <0,8>, <5,7>, <2,2>, <4,9>, <3,3> ],
[ <3,1>, <4,9>, <1,9>, <0,7>, <5,5>, <2,5> ],
[ <3,8>, <4,2>, <1,1>, <5,7>, <2,8>, <0,9> ],
[ <1,6>, <3,2>, <4,5>, <5,5>, <0,3>, <2,1> ],
[ <4,10>, <2,4>, <0,4>, <3,3>, <1,2>, <5,3> ]
];
which is MIP
Then what you could do and that is naive is to add using CP; in the .mod
This works but you could do better:
Use the example that is in CPLEX_Studio128\opl\examples\opl
// --------------------------------------------------------------------------
// Licensed Materials - Property of IBM
//
// 5725-A06 5725-A29 5724-Y48 5724-Y49 5724-Y54 5724-Y55
// Copyright IBM Corporation 1998, 2013. All Rights Reserved.
//
// Note to U.S. Government Users Restricted Rights:
// Use, duplication or disclosure restricted by GSA ADP Schedule
// Contract with IBM Corp.
// --------------------------------------------------------------------------
using CP;
int nbJobs = ...;
int nbMchs = ...;
range Jobs = 0..nbJobs-1;
range Mchs = 0..nbMchs-1;
// Mchs is used both to index machines and operation position in job
tuple Operation {
int mch; // Machine
int pt; // Processing time
};
Operation Ops[j in Jobs][m in Mchs] = ...;
dvar interval itvs[j in Jobs][o in Mchs] size Ops[j][o].pt;
dvar sequence mchs[m in Mchs] in all(j in Jobs, o in Mchs : Ops[j][o].mch == m) itvs[j][o];
execute {
cp.param.FailLimit = 10000;
}
minimize max(j in Jobs) endOf(itvs[j][nbMchs-1]);
subject to {
forall (m in Mchs)
noOverlap(mchs[m]);
forall (j in Jobs, o in 0..nbMchs-2)
endBeforeStart(itvs[j][o], itvs[j][o+1]);
}
execute {
for (var j = 0; j <= nbJobs-1; j++) {
for (var o = 0; o <= nbMchs-1; o++) {
write(itvs[j][o].start + " ");
}
writeln("");
}
}
tuple itvs_result
{
key int Job;
key int Machine;
int s;
int e;
int d;
}
{itvs_result} itvs_results=
{<j,m,startOf(itvs[j][m]),endOf(itvs[j][m]),lengthOf(itvs[j][m])> | j in Jobs,m in Mchs};
regards
#DecisionOptimization#OPLusingCPLEXOptimizer