Originally posted by: SystemAdmin
[deborah said:]
Hi!!
I review my code. I try to attach my models and .dat file, but I receive this message:
"The upload folder is full. Please try a smaller file and/or contact an administrator"... so :
DATA AND PREPROCESSING (this is the same in the models):
using CP;
int n = ...;
int nJobs = n-1;
assert{
nJobs>=0;
}
tuple job {
int id;
float releaseData;
float dueDate;
float XF;
float XT;
float YF;
float YT;
}
job Jobs[0..nJobs]=...;
int m = ...;
int mMachine = m-1;
assert{
mMachine>=0;
}
tuple machine {
int id;
float speed;
float empty_speed;
}
machine Machines[0..mMachine]=...;
float processamento[0..nJobs];
execute{
for (var j = 0; j <= nJobs; j++) <br /> for(var sc= 0; sc <= mMachine; sc++){ <br /> if(j==0 || j==nJobs)
processamento[j] = 0;
else{
var handling1 = Jobs[j].XT - Jobs[j].XF;
if(handling1 < 0)<br /> handling1 = - handling1;
var handling2 = Jobs[j].YT - Jobs[j].YF;
if(handling2 < 0)<br /> handling2 = - handling2;
var handling = (handling1 + handling2)/1;
processamento[j] = handling;
}
}
writeln("PROCESSAMENTO : "+processamento);
}
float s[0..nJobs][0..nJobs]; //tempi di set-up
execute{
for (var j = 0; j <= nJobs; j++) <br /> for (var l = 0; l <= nJobs; l++) <br /> for(var sc= 0; sc < mMachine; sc++) {<br /> if(j == 0 || l == nJobs || l == 0 || j == nJobs || l == j)
s[j][l] = 0;
else{
var deltaX = Jobs[j].XF - Jobs[j].XT;
if(deltaX < 0)<br /> deltaX = - deltaX;
var deltaY = Jobs[l].YF - Jobs[l].YT;
if(deltaY < 0)<br /> deltaY = - deltaY;
var setup = deltaX + deltaY;
s[j][l] = setup/1;
}
}
writeln("SET UP : "+s);
}
int minMachineSPEED;
execute{
minMachineSPEED = 0;
var minSPEED = Machines[minMachineSPEED].speed;
for(var sc= 1; sc <= mMachine; sc++){<br /> var speed = Machines[sc].speed;
if(speed < minSPEED){<br /> minSPEED = speed;
minMachineSPEED = sc;
}
}
}
MP model:
float M ;
execute{
M+=Number.MAX_VALUE;
}
dvar int W[0..nJobs][0..nJobs][0..mMachine] in 0..1; //W[j][l][m]=1 if the machine 'k' run job 'l' soon after job 'j', otherwise W[j][l][m]=0.
dvar int R[0..nJobs]; //Delay of job j
dvar int t[0..nJobs]; //Start time of job j
minimize sum(j in 1..nJobs-1) (R[j]);
constraints{
forall(j in 0..nJobs) R[j]>=0;
forall(j in 0..nJobs) t[j]>= Jobs[j].releaseData;
forall(j in 1..nJobs-1) R[j] >= t[j] + processamento[j] - Jobs[j].dueDate;
forall(m in 0..mMachine) sum(l in 1..nJobs) W[0,l,m] == 1;
forall(m in 0..mMachine) sum(j in 0..nJobs-1) W[j,nJobs,m] == 1;
forall(j in 1..nJobs-1) sum(m in 0..mMachine, l in 1..nJobs: l != j) W[j,l,m] == 1;
forall(j in 1..nJobs-1, m in 0..mMachine) sum(l in 1..nJobs: l != j) W[j,l,m]-sum(l in 0..nJobs-1: l !=j) W[l,j,m] == 0;
forall(l in 1..nJobs, j in 0..nJobs-1 : l!=j) (1- (sum(m in 0..mMachine)W[j,l,m]))*M + t[l] - t[j] >= processamento[j] + s[j,l];
}
CP model:
dvar int R[1..nJobs-1]; //Delay of job j
dvar interval tasks[i in 1..nJobs-1] in Jobs[i].releaseData..(maxint div 2)-1 size processamento[i];
dvar interval tasksOnMachines[k in 0..mMachine][i in 1..nJobs-1] optional;
dvar sequence machines[k in 0..mMachine] in all(i in 1..nJobs-1) tasksOnMachines[k][i] types all(i in 1..nJobs-1) i;
tuple triplet { int loc1; int loc2; int value; };
{triplet} transitionTimes = { <i,j, s[i][j]> | i in 1..nJobs-1, j in 1..nJobs-1};
minimize sum(j in 1..nJobs-1) (R[j]);
constraints {
forall(i in 1..nJobs-1) alternative(tasks[i], all(k in 0..mMachine) tasksOnMachines[k][i]);
forall(k in 0..mMachine) noOverlap(machines[k],transitionTimes);
forall(j in 1..nJobs-1) R[j]>=0;
forall(j in 1..nJobs-1) R[j] >= endOf(tasks[j]) - Jobs[j].dueDate;
}
.dat file:
n=17;
Jobs = #[
0: <0 0 0 0 0 0 0>,
1: <1 2171 168 2359 377 120 600>,
2: <2 2171 168 2459 358 240 720>,
3: <3 2171 168 2380 255 360 840>,
4: <4 2171 168 2363 383 480 960>,
5: <5 2171 168 2483 346 600 1080>,
6: <6 2171 168 2483 346 720 1200>
7: <7 2171 168 2342 267 840 1320>
8: <8 2171 168 2371 218 960 1440 >
9: <9 2171 168 2342 267 1080 1560 >
10: <10 2516 239 2415 170 0 120 >
11: <11 2545 215 2415 170 0 240 >
12: <12 2305 301 2415 170 0 360 >
13: <13 2686 276 2415 170 0 480 >
14: <14 1775 641 2415 170 0 600 >
15: <15 2342 267 2415 170 120 720>
16: <16 0 0 0 0 0 0>
]#;
m= 8;
Machines = #[
0: <0 170 1>,
1: <1 170 1>,
2: <2 252 1>,
3: <3 170 1 >,
4: <4 170 1 >,
5: <5 408 1 >,
6: <6 334 1 >,
7: <7 280 1 >
]#;
Thanks to all
deborah
#DecisionOptimization#OPLusingCPOptimizer