Originally posted by: user1234567
I have 2 parts in my code: The first one is used for assignment , and the second is used for scheduling.
I get this result: 0E0 !! When i should get a result which is better than the monolevel part (without division into 2 parts).
when i run it in one part (before deviding it into two parts), it works well.
First part: (.MOD)
using CP;
int L = 1000;
tuple paramsT{
int nbJobs;
int nbMchs;
int nbOper;
int nbOpertotal;
};
paramsT Params = ...;
int nbJobs = Params.nbJobs;
int nbMchs = Params.nbMchs;
int nbOper = Params.nbOper;
int nbOpertotal = Params.nbOpertotal;
range Jobs = 1..nbJobs;
range Mchs = 1..nbMchs;
range Oper = 1..nbOper;
range Opertotal = 1..nbOpertotal;
tuple Operation {
int id; // Operation id
int jobId; // Job id
int pos; // Position in job
};
tuple Mode {
int opId; // Operation id
int jobId;
int mch; // Machine
int pt; // Processing time
};
{Operation} Ops = ...;
{Mode} Modes = ...;
// Position of last operation of job j
int jlast[j in Jobs] = max(o in Ops: o.jobId==j) o.pos;
dvar interval ops [Ops];
dvar interval modes[md in Modes] optional size md.pt;
dvar sequence mchs[m in Mchs] in all(md in Modes: md.mch == m) modes[md];
dvar int c[i in Jobs][j in Oper][k in Mchs] in 0..1000 ;
dvar int s[i in Jobs][j in Oper][k in Mchs] in 0..1000;
int p[i in Jobs][j in Oper][k in Mchs];
int c1[i in Jobs];
dvar int r[u in Opertotal][k in Mchs];
dvar boolean X[i in Jobs][j in Oper][k in Mchs];
dvar int+ e[i in Jobs][j in Oper][k in Mchs];
dvar boolean y[i1 in Jobs][j1 in Oper][i2 in Jobs][j2 in Oper][k in Mchs];
execute {
cp.param.FailLimit = 10000;
}
minimize staticLex(max(i in Jobs, o in Ops: o.pos==jlast[i]) endOf(ops[o]),-sum(i in Jobs,j in Oper, k in Mchs) s[i][j][k]);
subject to {
forall (i in Jobs, j in Oper,o in Ops, md in Modes: md.jobId==i && md.opId==j && md.opId == o.id)
sum (k in Mchs) X[i][j][k] == 1;
forall (i in Jobs, j in Oper, k in Mchs)
sum (i in Jobs, j in Oper) X[i][j][k] <= e[i][j][k];
forall (i in Jobs,j in Oper, o in Ops, k in Mchs,
md in Modes: md.jobId==i && md.opId == j && md.mch == k && o.id==md.opId)
ctc1:s[i][j][k] == startOf (modes[md]);
forall (i in Jobs, j in Oper, o in Ops, k in Mchs, md in Modes: md.jobId == i && md.opId == j && md.mch == k && o.id==md.opId)
ctc2:c[i][j][k] == endOf (modes[md]);
//C10
forall (i in Jobs,j in Oper, o in Ops: o.pos==jlast[i])
endOf(ops[o]) >= sum (k in Mchs) c[i][j][k];
//C11
forall (i in Jobs, o in Ops: o.pos==jlast[i])
max(i in Jobs, o in Ops: o.pos==jlast[i]) endOf(ops[o]) >= endOf(ops[o]);
//C12
forall (i in Jobs,j in Oper, k in Mchs)
c[i][j][k] >= 0;
forall (i in Jobs, j in Oper, k in Mchs)
s[i][j][k] >= 0;
forall (i in Jobs, j in Oper, k in Mchs)
p[i][j][k] >= 0;
forall (j in Jobs, o1 in Ops, o2 in Ops: o1.jobId==j && o2.jobId==j && o2.pos==1+o1.pos)
endOf (ops[o1]) <= startOf (ops[o2]);
//Operations on a given machine m cannot overlap
forall (m in Mchs)
noOverlap(mchs[m]);
//Alternative machines for a given operation o
forall (o in Ops)
alternative(ops[o], all(md in Modes: md.opId==o.id) modes[md]);
}
main {
//Model for first essay
var Modelt1Source = new IloOplModelSource("main-Bilevel-instance-brandimarte-10,6-MK01.mod");
var Modelt1Def = new IloOplModelDefinition(Modelt1Source);
var oplmodel1 = new IloOplModel(Modelt1Def, cp);
var Modelt1data = new IloOplDataSource("Bilevel-instance-brandimarte-10,6-MK01 (Data).dat");
oplmodel1.addDataSource(Modelt1data);
oplmodel1.generate();
cp.solve();
var obj = cp.getObjValue();
writeln("The Value of the Objective Function Value is (Total Cost): ", obj);
writeln("Solving CPU Elapsed Time in (Seconds): ", cp.getCpTime());
oplmodel1.postProcess();
var cp=new IloCp();
//Model for second essay
var Modelt2Source = new IloOplModelSource("Bilevel-instance-brandimarte-10,6-MK01.mod");
var Modelt2Def = new IloOplModelDefinition(Modelt2Source);
var oplmodel2 = new IloOplModel(Modelt2Def, cp2);
var Modelt2data = new IloOplDataSource("Bilevel-instance-brandimarte-10,6-MK01 (Data).dat");
oplmodel2.addDataSource(Modelt2data);
oplmodel2.generate();
writeln("cp solve gives",cp.solve());
}
Second part: (.MOD)
using CP;
int L = 1000;
tuple paramsT{
int nbJobs;
int nbMchs;
int nbOper;
int nbOpertotal;
};
paramsT Params = ...;
int nbJobs = Params.nbJobs;
int nbMchs = Params.nbMchs;
int nbOper = Params.nbOper;
int nbOpertotal = Params.nbOpertotal;
range Jobs = 1..nbJobs;
range Mchs = 1..nbMchs;
range Oper = 1..nbOper;
range Opertotal = 1..nbOpertotal;
tuple Operation {
int id; // Operation id
int jobId; // Job id
int pos; // Position in job
};
tuple Mode {
int opId; // Operation id
int jobId;
int mch; // Machine
int pt; // Processing time
};
{Operation} Ops = ...;
{Mode} Modes = ...;
// Position of last operation of job j
int jlast[j in Jobs] = max(o in Ops: o.jobId==j) o.pos;
dvar interval ops [Ops];
dvar interval modes[md in Modes] optional size md.pt;
dvar sequence mchs[m in Mchs] in all(md in Modes: md.mch == m) modes[md];
dvar int c[i in Jobs][j in Oper][k in Mchs] in 0..1000 ;
dvar int s[i in Jobs][j in Oper][k in Mchs] in 0..1000;
int p[i in Jobs][j in Oper][k in Mchs];
int c1[i in Jobs];
dvar int r[u in Opertotal][k in Mchs];
dvar boolean X[i in Jobs][j in Oper][k in Mchs];
dvar int+ e[i in Jobs][j in Oper][k in Mchs];
dvar boolean y[i1 in Jobs][j1 in Oper][i2 in Jobs][j2 in Oper][k in Mchs];
execute {
cp.param.FailLimit = 10000;
}
minimize staticLex(max(i in Jobs, o in Ops: o.pos==jlast[i]) endOf(ops[o]),-sum(i in Jobs,j in Oper, k in Mchs) s[i][j][k]);
subject to {
forall (i in Jobs, j in Oper,o in Ops, md in Modes: md.jobId==i && md.opId==j && md.opId == o.id)
sum (k in Mchs) X[i][j][k] == 1;
forall (i in Jobs, j in Oper, k in Mchs)
sum (i in Jobs, j in Oper) X[i][j][k] <= e[i][j][k];
forall (i in Jobs,j in Oper, o in Ops, k in Mchs,
md in Modes: md.jobId==i && md.opId == j && md.mch == k && o.id==md.opId)
ctc1:s[i][j][k] == startOf (modes[md]);
forall (i in Jobs, j in Oper, o in Ops, k in Mchs, md in Modes: md.jobId == i && md.opId == j && md.mch == k && o.id==md.opId)
ctc2:c[i][j][k] == endOf (modes[md]);
//C10
forall (i in Jobs,j in Oper, o in Ops: o.pos==jlast[i])
endOf(ops[o]) >= sum (k in Mchs) c[i][j][k];
//C11
forall (i in Jobs, o in Ops: o.pos==jlast[i])
max(i in Jobs, o in Ops: o.pos==jlast[i]) endOf(ops[o]) >= endOf(ops[o]);
//C12
forall (i in Jobs,j in Oper, k in Mchs)
c[i][j][k] >= 0;
forall (i in Jobs, j in Oper, k in Mchs)
s[i][j][k] >= 0;
forall (i in Jobs, j in Oper, k in Mchs)
p[i][j][k] >= 0;
forall (j in Jobs, o1 in Ops, o2 in Ops: o1.jobId==j && o2.jobId==j && o2.pos==1+o1.pos)
endOf (ops[o1]) <= startOf (ops[o2]);
//Operations on a given machine m cannot overlap
forall (m in Mchs)
noOverlap(mchs[m]);
//Alternative machines for a given operation o
forall (o in Ops)
alternative(ops[o], all(md in Modes: md.opId==o.id) modes[md]);
}
main {
//Model for first essay
var Modelt1Source = new IloOplModelSource("main-Bilevel-instance-brandimarte-10,6-MK01.mod");
var Modelt1Def = new IloOplModelDefinition(Modelt1Source);
var oplmodel1 = new IloOplModel(Modelt1Def, cp);
var Modelt1data = new IloOplDataSource("Bilevel-instance-brandimarte-10,6-MK01 (Data).dat");
oplmodel1.addDataSource(Modelt1data);
oplmodel1.generate();
cp.solve();
var obj = cp.getObjValue();
writeln("The Value of the Objective Function Value is (Total Cost): ", obj);
writeln("Solving CPU Elapsed Time in (Seconds): ", cp.getCpTime());
oplmodel1.postProcess();
var cp=new IloCp();
//Model for second essay
var Modelt2Source = new IloOplModelSource("Bilevel-instance-brandimarte-10,6-MK01.mod");
var Modelt2Def = new IloOplModelDefinition(Modelt2Source);
var oplmodel2 = new IloOplModel(Modelt2Def, cp2);
var Modelt2data = new IloOplDataSource("Bilevel-instance-brandimarte-10,6-MK01 (Data).dat");
oplmodel2.addDataSource(Modelt2data);
oplmodel2.generate();
writeln("cp solve gives",cp.solve());
}
.DAT:
Params = <10, 6, 3, 115>;
Ops = {
<1,1,0>,
<2,1,1>,
<3,1,2>,
<4,1,3>,
<5,1,4>,
<6,1,5>,
<7,2,0>,
<8,2,1>,
<9,2,2>,
<10,2,3>,
<11,2,4>,
<12,3,0>,
<13,3,1>,
<14,3,2>,
<15,3,3>,
<16,3,4>,
<17,4,0>,
<18,4,1>,
<19,4,2>,
<20,4,3>,
<21,4,4>,
<22,5,0>,
<23,5,1>,
<24,5,2>,
<25,5,3>,
<26,5,4>,
<27,5,5>,
<28,6,0>,
<29,6,1>,
<30,6,2>,
<31,6,3>,
<32,6,4>,
<33,6,5>,
<34,7,0>,
<35,7,1>,
<36,7,2>,
<37,7,3>,
<38,7,4>,
<39,8,0>,
<40,8,1>,
<41,8,2>,
<42,8,3>,
<43,8,4>,
<44,9,0>,
<45,9,1>,
<46,9,2>,
<47,9,3>,
<48,9,4>,
<49,9,5>,
<50,10,0>,
<51,10,1>,
<52,10,2>,
<53,10,3>,
<54,10,4>,
<55,10,5>,
};
Modes = {
//job 1
<1,1,1,5>,
<1,1,3,4>,
<2,1,5,3>,
<2,1,3,5>,
<2,1,2,1>,
<3,1,3,4>,
<3,1,6,2>,
<4,1,6,5>,
<4,1,2,6>,
<4,1,1,1>,
<5,1,3,1>,
<6,1,6,6>,
<6,1,3,6>,
<6,1,4,3>,
//job 2
<7,2,2,6>,
<8,2,3,1>,
<9,2,1,2>,
<10,2,2,6>,
<10,2,4,6>,
<11,2,6,5>,
<11,2,2,6>,
<11,2,1,1>,
//job 3
<12,3,2,6>,
<13,3,3,4>,
<13,3,6,2>,
<14,3,6,5>,
<14,3,2,6>,
<14,3,1,1>,
<15,3,3,4>,
<15,3,2,6>,
<15,3,6,6>,
<16,3,1,1>,
<16,3,5,5>,
//job 4
<17,3,6,5>,
<17,3,2,6>,
<17,3,1,1>,
<18,3,2,6>,
<19,3,3,1>,
<20,3,5,3>,
<20,3,3,5>,
<20,3,2,1>,
<21,3,3,4>,
<21,3,6,2>,
//job 5
<22,5,5,3>,
<22,5,3,5>,
<22,5,2,1>,
<23,5,6,5>,
<23,5,2,6>,
<23,5,1,1>,
<24,5,2,6>,
<25,5,1,5>,
<25,5,3,4>,
<26,5,2,6>,
<26,5,4,6>,
<27,5,3,4>,
<27,5,2,6>,
<27,5,6,6>,
//job 6
<28,6,3,4>,
<28,6,6,2>,
<29,6,1,2>,
<30,6,3,4>,
<30,6,2,6>,
<30,6,6,6>,
<31,6,2,6>,
<32,6,6,5>,
<32,6,2,6>,
<32,6,1,1>,
<33,6,1,3>,
<33,6,4,2>,
//job 7
<34,7,6,1>,
<35,7,1,3>,
<35,7,4,2>,
<36,7,3,4>,
<36,7,2,6>,
<36,7,6,6>,
<37,7,2,6>,
<37,7,5,1>,
<37,7,1,6>,
<38,7,3,1>,
//job 8
<39,8,3,4>,
<39,8,6,2>,
<40,8,3,4>,
<40,8,2,6>,
<40,8,6,6>,
<41,8,6,5>,
<41,8,2,6>,
<41,8,1,1>,
<42,8,2,6>,
<43,8,2,6>,
<43,8,4,6>,
//job 9
<44,9,6,1>,
<45,9,1,1>,
<45,9,5,5>,
<46,9,6,6>,
<46,9,3,6>,
<46,9,4,3>,
<47,9,1,2>,
<48,9,3,4>,
<48,9,2,6>,
<48,9,6,6>,
<49,9,2,6>,
<49,9,4,6>,
//job 10
<50,10,3,4>,
<50,10,6,2>,
<51,10,3,4>,
<51,10,2,6>,
<51,10,6,6>,
<52,10,5,3>,
<52,10,3,5>,
<52,10,2,1>,
<53,10,6,1>,
<54,10,2,6>,
<54,10,4,6>,
<55,10,1,3>,
<55,10,4,2>,
};
Please help me to get a feasible result. Thank you.
#CPLEXOptimizers#DecisionOptimization