Bonjour,
j'ai des jobs (i), qui s'exécutent en plusieurs taches (j) chacun sur une machine (k) à plusieurs instants (a)
J'ai une variable binaire qui est un tableau contenant ces paramètres x[i,j,k,a] qui est égal à 1 si la tache j du job i s'exécute sur la machine k à l'instant a.
Ce que je souhaite modéliser c'est le job j doit s'exécuter après le job j-i.
J'ai une modélisation qui fonctionne qui dit : pour chaque job/tache/machine/instant, quand le job j s'arrête, la durée du job j plus la somme des exécutions de j+1 de l'instant 1 à l'instant où le job j s'arrête sont plus petites ou égales à la somme des exécutions du job j dans cet interval.
subject to cont4{i in 1..n,j in 1..(OFi[i]-1), k in 1..m, a in 1..BS-1} :
(x[i,j,k,a] - x[i,j,k,a+1]) * p[i,j,k] + sum{kk in 1..m, aa in 1..a} x[i,j+1,kk,aa] <= sum{c in 1..m, l in 1..a}x[i,j,c,l];
mais c'est très coûteux en RAM et je cherche un autre moyen.
entre autre, ceci devrait marcher :
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));
la date d'arrêt de j-1 est plus petite que la date de début de j. mais soit le sum prend en compte un mauvais truc, soit y a une erreur dans mon modèle ailleurs mais ça ne marche pas.
Je peux écrire mon modèle en entier si besoin...
Merci pour toute réponse ou idées.
# mon modèle
Posté par matthieu bollot (site web personnel, Mastodon) . É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];
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.