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.
Forum Programmation.autre modelistation glpk
26
jan.
2008
# 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.