Forum Programmation.autre modelistation glpk

Posté par  (site web personnel, Mastodon) .
Étiquettes : aucune
0
26
jan.
2008
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  (site web personnel, Mastodon) . Évalué à 2.

    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];

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.