Voici le modèle en entier, des fois que cela aide à comprendre ou si il y a une erreur flagrante...
#=========Données========
param n; #nombre de travaux
param OFi{i in 1..n}; #nombre de job par travail
param m; #nombre de machines
param p{i in 1..n,j in 1..OFi[i],k in 1..m}; #durée du travail j
param d{i in 1..n}; #date dû du travail i
param BS; #une grande valeur
param trmax;
param I; #nombre d'ilots
param mk{k in 1..I}; #nbre de machines par îlot
param mi{l in 1..I,k in 1..m} binary; #1 si la machine m est dans l'îlot
param tr{k1 in 1..m,k2 in 1..m}; #1 si la machine m est dans l'îlot k 0 sinon
#=========Variables======
var r{i in 1..n}>=0; #retard du travail i
var x{i in 1..n,j in 1..OFi[i],k in 1..m, l in 1..BS} binary; # =1 si i s’exectue sur la machine j a l’instant k
var lmax;
var wmax;
var z{i in 1..n, j in 1..OFi[i],k in 1..m} binary;
#=========Contraintes====
#Objectif : minimisation du retard / répartition de la charge
minimize optimum1 : lmax;
minimize optimum2 : wmax;
#(1) def du retard
subject to deflmax{i in 1..n} : lmax >= r[i];
subject to defretard{i in 1..n, j in 1..OFi[i], k in 1..m, l in 1..BS} : r[i]>=((l*x[i,j,k,l]+1)-d[i]);
#(2) def de la charge des ilots
subject to defwmax {l in 1..I} : wmax>=1/mk[l]*sum{i in 1..n, j in 1..OFi[i], k in 1..m, t in 1..BS}(x[i,j,k,t]*mi[l,k]);
#(3) ressources disjonctives
#(3) une machine ne peut faire qu’une opération a la fois
subject to cont3{k in 1..m,l in 1..BS} : sum{i in 1..n,j in 1..OFi[i]}x[i,j,k,l] <= 1;
#(4) gammes opératoires (contrainte de précédence)
subject to cont4{i in 1..n, j in 2..OFi[i],k in 1..m, a in 1..BS-1} :
(x[i,j-1,k,a]-x[i,j-1,k,a+1])*a<=sum{kk in 1..m, aa in 1..BS-1}((x[i,j,kk,aa+1] - x[i,j,kk,aa])*(aa+1));
#(5) une opération s’execute en pij unités de temps
subject to cont5{i in 1..n, j in 1..OFi[i], k in 1..m} : sum{l in 1..BS}x[i,j,k,l] = p[i,j,k]*z[i,j,k];
subject to cont51{i in 1..n, j in 1..OFi[i]} : sum{k in 1..m, l in 1..BS}x[i,j,k,l] >=1 ;
#(6) non splitting
subject to cont6{i in 1..n, j in 1..OFi[i], l in 1..BS} : sum{k in 1..m}x[i,j,k,l]<=1;
#(7) non préemption
#(7) une opération se fait en un seul bloc
subject to cont7{i in 1..n,j in 1..OFi[i], k in 1..m,l in 1..(BS-2)} :
p[i,j,k]*(x[i,j,k,l]-x[i,j,k,l+1])+sum{b in (l+2)..BS}x[i,j,k,b] <= p[i,j,k];
# mon modèle
Posté par matthieu bollot (site web personnel, Mastodon) . En réponse au message modelistation glpk. Évalué à 2.
#=========Données========
param n; #nombre de travaux
param OFi{i in 1..n}; #nombre de job par travail
param m; #nombre de machines
param p{i in 1..n,j in 1..OFi[i],k in 1..m}; #durée du travail j
param d{i in 1..n}; #date dû du travail i
param BS; #une grande valeur
param trmax;
param I; #nombre d'ilots
param mk{k in 1..I}; #nbre de machines par îlot
param mi{l in 1..I,k in 1..m} binary; #1 si la machine m est dans l'îlot
param tr{k1 in 1..m,k2 in 1..m}; #1 si la machine m est dans l'îlot k 0 sinon
#=========Variables======
var r{i in 1..n}>=0; #retard du travail i
var x{i in 1..n,j in 1..OFi[i],k in 1..m, l in 1..BS} binary; # =1 si i s’exectue sur la machine j a l’instant k
var lmax;
var wmax;
var z{i in 1..n, j in 1..OFi[i],k in 1..m} binary;
#=========Contraintes====
#Objectif : minimisation du retard / répartition de la charge
minimize optimum1 : lmax;
minimize optimum2 : wmax;
#(1) def du retard
subject to deflmax{i in 1..n} : lmax >= r[i];
subject to defretard{i in 1..n, j in 1..OFi[i], k in 1..m, l in 1..BS} : r[i]>=((l*x[i,j,k,l]+1)-d[i]);
#(2) def de la charge des ilots
subject to defwmax {l in 1..I} : wmax>=1/mk[l]*sum{i in 1..n, j in 1..OFi[i], k in 1..m, t in 1..BS}(x[i,j,k,t]*mi[l,k]);
#(3) ressources disjonctives
#(3) une machine ne peut faire qu’une opération a la fois
subject to cont3{k in 1..m,l in 1..BS} : sum{i in 1..n,j in 1..OFi[i]}x[i,j,k,l] <= 1;
#(4) gammes opératoires (contrainte de précédence)
subject to cont4{i in 1..n, j in 2..OFi[i],k in 1..m, a in 1..BS-1} :
(x[i,j-1,k,a]-x[i,j-1,k,a+1])*a<=sum{kk in 1..m, aa in 1..BS-1}((x[i,j,kk,aa+1] - x[i,j,kk,aa])*(aa+1));
#(5) une opération s’execute en pij unités de temps
subject to cont5{i in 1..n, j in 1..OFi[i], k in 1..m} : sum{l in 1..BS}x[i,j,k,l] = p[i,j,k]*z[i,j,k];
subject to cont51{i in 1..n, j in 1..OFi[i]} : sum{k in 1..m, l in 1..BS}x[i,j,k,l] >=1 ;
#(6) non splitting
subject to cont6{i in 1..n, j in 1..OFi[i], l in 1..BS} : sum{k in 1..m}x[i,j,k,l]<=1;
#(7) non préemption
#(7) une opération se fait en un seul bloc
subject to cont7{i in 1..n,j in 1..OFi[i], k in 1..m,l in 1..(BS-2)} :
p[i,j,k]*(x[i,j,k,l]-x[i,j,k,l+1])+sum{b in (l+2)..BS}x[i,j,k,b] <= p[i,j,k];