• # mon modèle

    Posté par (site web personnel, Mastodon) . En réponse au message modelistation glpk. É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];