Ordonnancement sur une machine Module MOP-Cours 2 Spécialité IAD Philippe Chrétienne Critères MinMax 1 / prec / f max 1 / prec,pmtn,r j / f max 1 / prec, r j, p mtn,l max 1 / rj,qj / Cmax Flowtime 1 / /!w j C j 1 / r j, pmtn /!w j C j Plan
Notations Enoncé d un problème : E ; Paramètres de E : les jobs : J= {J 1,.,J n } les durées p j ; les contraintes de précédence : (J i,j j ) les dates de disponibilité r j les deadlines d j ; les durées de latence q j ; la préemption : pmtn la fonction coût : f j (C j ). E = <J;G(J);p j,j"j;r j,j"j;d j,j"j;f j,j"j> f*(e) coût minimum d un ordonnancement de E. Algorithme de résolution d un problème : A Solution fournie par A pour l énoncé E : A(E) 1 / prec / f max Un coût f j (C j ) est attaché à la terminaison du job J j à la date C j. Les fonctions f j sont croissantes au sens large. Idée de base de l algorithme : En raison de la monotonie des fonctions de coût, il existe un ordonnancement optimal sans temps mort. Une solution du problème sera donc représentée par une séquence des n jobs. L algorithme de Lawler construit un séquencement optimal de la dernière à la première tâche de la séquence.
Algorithme A1(E) ; Si Card(J)=1 alors Retourner((J 1 )) ; Choisir une sortie J k de G dont le coût f k (! J p j ) est minimum ; Ê := <J-{J k };p j, j"j-{j k };G(J-J k );f j, j"j-{j k }> ; Retourner ((A1(Ê),J k )). Propriété de A1. Soit E un énoncé, Ô= A1(E) et soit J k le dernier job de Ô. Il existe une solution optimale de E dont le dernier job est J k. Preuve : Soit O* une solution optimale dont le dernier job est J i où i!k. Notons O*=O 1 J k O 2 J i la séquence des jobs dans O*. La séquence O = O 1 O 2 J i J k est réalisable ; La solution O satisfait f max (O ) " f max (O*). Preuve de A1 (récurrence sur n). P(n): Si Card(J)=n, A1(E) est un ordonnancement optimal. P(1) est vraie. Supposons que P(n-1) soit vraie. Considérons un énoncé E à n jobs. Soit Ô=A1(E) = O 1 J k. O 1 est optimal pour J-{J k } (induction et structure récursive de l algorithme) D après la propriété précédente, il existe un ordonnancement optimal O* = O 2 J k. On a alors : f max (Ô) = max{f max (O 1 ),f k (P)} " max{f max (O 2 ),f k (P)} = f max (O*) Il en résulte que Ô est optimal.
1 / prec, pmtn, r j / f max Première étape : Rendre les dates de disponibilité r j «$compatibles$» avec G. Propriété : Soit O un ordonnancement quelconque. Si (J i,j j ) " prec alors : S j # r i + p i. max{r i +p i, r j } est donc aussi une date de disponibilité pour J j. Algorithme pour modifier les dates de disponibilité r j. Supposons que (J 1,J 2,,J n ) soit une liste topologique de prec. (i.e : (J i,j j ) " prec # i < j) Algorithme B1(E) r 1 := r 1 ; Pour j de 2 à n faire r j := max (Ji,Jj) "prec {r i + p i } FinPour ; Retourner(r ). Propriété des dates r j : Les valeurs r j sont des dates de disponibilité pour E. Pour tout J j, r j # r j ; Pour tout (J i,j j ) " prec : r j # r i. On supposera dans la suite que les dates de disponibilité r j sont compatibles avec prec.
Deuxième étape : Calcul de l ordonnancement au plus tôt non préemptif O pour la séquence des jobs associée aux r j croissants au sens large. Notations : B : bloc ; Un bloc B possède : une date de début notée début(b) ; une date de fin notée fin(b) ; un ensemble de jobs noté jobs(b). Rappel : On suppose que : 1. les r j sont compatibles avec G ; 2. r 1 " r 2 " " r n Algorithme B2(E) ; % retourne la liste des blocs de l ordonnancement O% i := ArgMin{r j,j"j} ; t := Min{r j,j"j} ; début(b) := t ; jobs(b) := {i} ; Tantque i < n et r i+1 " t + p i faire jobs(b) := jobs(b) $ {J i+1 } ; t := t + p i ; i := i + 1 FinTantque ; fin(b) := t +p i ; Si jobs(b)=j alors retourner((b)) sinon Ê := <J-B ; G(J-B) ; p j,j"j-b ; r j,j"j-b ; f j,j"j-b > ; Retourner ((B,B2(Ê))) FinSi
Exemple : n=6 ; r 1 = 0, r 2 = r 3 = 1, r 4 = 5, r 5 = 7, r 6 = 10 ; p 1 = p 2 = 2, p 3 = p 4 = 1 ; p 5 =2 ; p 6 = 1 ; 1 2 3 4 5 6 r 1 =0 r 2 =r 3 =1 r 4 =5 r 5 =7 r 6 =10 temps Un ordonnancement O à 3 blocs Propriétés de l ordonnancement O : Soient : (B 1, B 2,, B q ) la suite des blocs obtenus ; u 1, u 2,., u q les dates de début des blocs ; v 1, v 2,., v q les dates de fin des blocs. Propriété 1: Les dates u k sont des dates de disponibilité r j. Si le job J j appartient à jobs(b k ), alors r j # u k. Preuve : (exercice) Propriété 2 : Soit O* un ordonnancement optimal de l énoncé E du problème (préemptif) initial. Dans O*, tous les jobs de jobs(b k ) sont exécutés dans la fenêtre [u k,v k ].
Preuve de la propriété 3 : Supposons que [u k,v k ] soit le premier intervalle non totalement occupé par les jobs de jobs(b k ). Soit alors [s,t] la fenêtre de temps-mort de cet intervalle. u k s t Il existe un job J i tel que r i " s et non terminé à la date s. Sinon, soit T k l ensemble des jobs exécutés après s. On aurait Min{r j /J j " T k } > s et O comporterait un temps mort dans [u k,v k ] (structure de B2(E) ). Soit alors R i la durée résiduelle de J i au temps s. On peut alors : exécuter J i, sur l intervalle [s, s+min{r i,t-s}] ; supprimer les Min{R i,t-s} dernières unités de temps de J i dans O*; On obtient alors un ordonnancement O tel que : f max (O )" f max (O*) v k D après la propriété 3, on peut réduire le problème aux seuls jobs d un bloc B. Soit [deb(b),fin(b)] la fenêtre de B. E(B) énoncé associé aux seuls jobs de jobs(b). Soit O*(B) un ordonnancement optimal de E(B). Soit G(B) le graphe de précédence des jobs de jobs(b). Soit S(B) l ensemble des jobs sans successeurs dans G(B).
2 bornes inférieures de f*(j) : f l (fin(b)) = Min S(B) {f j (fin(b))} ; f*(e(b-{j l })) (où E(B-{J l }) est l énoncé associé aux seuls jobs de jobs(b)-{j l }) Preuve des bornes : O* se termine par un morceau d un job de S(B) ; En remplaçant dans O* les morceaux de J l par des temps-morts, on obtient un ordonnancement O de E(B-{J l }) tel que : f max (O*) = max{f max (O ), f l (fin(b))) }. Il en résulte que : f*(e(b)) # f max (O )# f*(e(b-{j l })) Construction (récursive) d un ordonnancement optimal. Supposons connu un ordonnancement O optimal pour E(B-{J l }) ; Soient : B 1, B 2,, B q les blocs de O (associés à B2(E(B-{J l })); g 1, g 2,., g q les dates de début des blocs de O ; d 1, d 2,., d q les dates de fin des blocs de O. En remplaçant dans O les temps morts par des morceaux d exécution de J l, on obtient un ordonnancement O de E(B) dont le coût est égal à max{f max (O ), f l (fin(b)) }. O est donc un ordonnancement optimal.
Exemple : i 1 2 3 4 5 6 7 p i 6 5 7 6 4 3 2 r i 0 10 11 13 20 35 35 d i 33 43 36 24 29 42 50 f i (t) = Max{0, t-d i } i 1 2 3 4 5 6 7 p i 6 5 7 6 4 3 2 r i 0 10 11 13 20 35 35 d i 23 33 26 14 19 32 40 6 2 3 4 5 6 7 0 6 10 15 22 28 32 35 38 40 6 2 3 4 5 6 7 0 6 10 15 22 28 32 35 38 40 6 2 3 4 5 2 6 7 0 6 10 18 24 28 32 35 38 40 6 2 3 4 3 5 3 2 6 7 0 6 10 13 20 28 32 35 38 40
Algorithme (récursif) B3(E(B)) pour ordonnancer un seul bloc B de B2(E). Algorithme B3(E(B)) ; Si Card(jobs(B))=1 alors O := placerjob( jobs(b),deb(b),fin(b),o) sinon Soit J l une sortie de G(B) de coût f l (fin(b)) minimum ; (B 1,B 2,,B p ) := B2(E(B-{J l })) ; Pour k de 1 à p faire O := B3(E(B k )) ; %appel récursif% O[deb(B k ),fin(b k )] := O ; remplacertempsmort(j l,deb(b),fin(b),o) FinPour ; FinSi ; Retourner(O). Remarques sur B3(E) La procédure placerjob( J i, u,v,o) place le job Ji dans la fenêtre [u,v] d un ordonnancement O ; La procédure remplacertempsmort(j i,u,v,o) remplace les temps morts d un ordonnancement O par des morceaux d exécution du job J i. Algorithme général A2(E) pour 1 / prec,r j,pmtn / f max. Algorithme A2(E) ; (B 1,B 2,,B p ) := B2(E(B)) ; Pour k de 1 à p faire O*.[deb(B k ),fin(b k )]:= B3(E(B k )) FinPour ; Retourner O*.
1 / prec, r j, pmtn / L max Etape 1 : Modification des deadlines. Supposons que (J 1,J 2,,J n ) soit une liste topologique de prec. Algorithme de modification des deadlines : Algorithme B4(E) d n := d n ; Pour i de n-1 à 1 faire d i := min (Ji,Jj) "prec {d j - p j } FinPour. Propriété des dates d j : Les valeurs d j sont des deadlines telles que : pour tout J j, d j " d j ; (J i,j j ) " prec # d i " d j. Algorithme A3(E) : d := B4(E) ; t := Min J {r j }; Tantque (tous les jobs ne sont pas terminés) faire Choisir un job J i tel que (r i " t) dont le deadline modifié est minimum ; Exécuter J i jusqu au plus petit instant u>t tel que : - soit J i est terminé ; - soit t est une date de disponibilité. t := u ; FinTantque.
Exemple pour 1 / prec,pmtn,r j / L max 1 / r j,q j / C max Définition du problème. n jobs non préemptifs indépendants. Pour chaque job J j : une date de disponibilité r j ; une durée de latence q j. La durée de latence q j représente le temps minimum nécessaire entre la fin de fin C j de J j et la fin de l ordonnancement. La machine n est pas requise par Jj entre C j et C j +q j. C max = Max J {C j + q j } Il faut minimiser C max.
Complexité de 1 / r j,q j / C max Propriété : 1 / r j,q j / C max est NP-complet au sens fort Preuve : Réduction pseudo-polynomiale de 3-PARTITION Remarque : C max " C ( ' j, C j " C - q j. Il en résulte que : 1 / r j,q j / C max ( 1 / prec,r j,d j / - On montre que 1 / prec,r j,d j / - est NP-complet au sens fort. 3-PARTITION: Donnée: A={a 1,, a 3n }; s:a%& telle que : s(a)=nb et 'i"{1,..,3n} B/4 < s(a i ) < B/2 Question: Peut-on réaliser une partition de A en n classes de même poids? Si la réponse est «!oui!», chaque classe contient exactement 3 éléments de A et est de taille B.
On montre que 3-PARTITION ) ps OMS Réduction pseudo-pôlynomiale : Enoncé de 3-PARTITION: I=(A,s) où Card(A)=3n ; s(a)=nb ; 'a"a, B/4<s(a)<B/2. Enoncé f(i) de OMS: 3n tâches T i : (p i = s(a i ), r i =0, d i =nb+n-1) n-1 tâches D j : (p j =1, r j = jb+j-1, d j = jb+j) Supposons l$ énoncé (A,s) à réponse «$oui$». Soit alors C 1,..,C n les sous-ensembles de 3 tâches T i associées aux n classes de A de poids B. L$ ordonnancement de f(i) suivant est réalisable: C 1 D 1 C 2 D 2 D n-1 C n 0 B B+1 2B+1 2B+2 nb+n-1 Réciproquement, supposons qu$ il existe un ordonnancement de l$ énoncé f(i) de OMS. Les n-1 tâches D j sont bloquées dans les intervalles [jb+j-1,jb+j]. L$ espace libre restant de l$ intervalle [0, nb+n-1] est juste suffisant pour les autres tâches T i. On peut donc partitionner A en n classes de poids B.
Résolution de 1 / r j,q j / C max 1) Recherche d une bonne solution approchée par l algorithme de Jackson ; 2) Propriétés fondamentales de la solution de Jackson ; 3) Mise en œuvre d une méthode arborescente fondée sur 2). L algorithme de Jackson construit une solution notée O 0 en appliquant la règle simple suivante (règle de Jackson) : Initialiser le temps t à Min J {r j } ; Si t est une date de disponibilité ou de terminaison d un job : si l ensemble des jobs prêts à t n est pas vide, alors ordonnancer le job prêt de durée de latence maximum sinon créer un temps-mort jusqu à la prochaine date de disponibilité. Algorithme de Jackson : Algorithme B5(E) ; Si J!$* alors u := Min J {r j } ; Choisir J i dans J tel que r i =u et q i maximum ; O.[u,u+p i ]:=J i ; J:=J-{J i } ; Pour tout Jj de J faire r j := Max{r j,u+p i } Ê := <J,p,r,q> ; Retourner(B5(Ê)) ; %appel récursif% FinSi. La notation O.[u,v]:= J i signifie que la fenêtre [u,v] est affectée au job J i.
Exemple : j 1 2 3 4 5 6 7 r j 10 13 11 20 32 0 32 p j 5 6 7 1 3 6 2 q j 7 26 24 21 8 17 0 6 1 2 3 4 5 7 0 6 10 15 21 28 29 32 35 37 Propriétés de la solution de Jackson Borne inférieure : Soit I une partie quelconque de J, la valeur h(i) = Min I {r j } +! I p j + Min I q j est une évaluation par défaut de la durée optimale f*. Il en résulte que : Max I h(i) " f*. Solution de Jackson et évaluation par excès de f*. Soit O 0 la solution de Jackson et f 0 sa valeur. 1) On a : f 0 - f* " Max J {p j } 2) Si O 0 n est pas optimal, on peut déterminer une partie D de J et un job c dans J-D tels que : f* - h(d) < p c.
Preuve : Supposons que le séquencement de O 0 soit (J 1,J 2,, J n ). O 0 est donc l ordonnancement au plus tôt du graphe valué G(0 0 ) suivant : r 1 1 2 p 1 p 2 p 1 +q 1 0 r j j p j +q j n+1 p j r n n-1 n p n +q n Définition d un chemin critique «$maximal$» de G(O 0 ). l : plus grand indice par lequel passe un chemin critique. r 1 1 p 1 +q 1 h : plus petit indice tel que (0,h,h+1,,l,n+1) est critique. r h h p h +q h 0 r c p c +q c r c+1 p c+1 +q c+1 n+1 c : plus grand indice de h..l tel que q c <q l (c = h-1 si cet indice n existe pas) r l l p l +q l D = {c+1..l}. (sommets violets) n
Dans O 0, le slot [r h -1,r h ] est un temps mort. Sinon le job J j en exécution sur ce slot se termine en r h et t j + p j +! h..l p i + q l = r h +! h..l p i + q l =f 0. On a : t i = r i et j<h. (0,j,..,h,..,l,n+1) est donc critique. Contradiction. r 1 r h 1 h p 1 +q 1 p h +q h 0 r c c p c +q c n+1 On a : r h = Min h..l {r i }. Evident si h=1; Sinon, soit J j le job qui précède J h dans O 0 ; L intervalle [t j +p j, t h ] est un temps mort de O 0 ; Donc, lors de la terminaison de J j, il vient : t h =r h =Min h..n {r i } et donc r h = Min h..l {r i }. r l l n p l +q l Considérons les 2 cas : 1) q l = Min h..l {q i }. On a alors D = h..l ; O 0 est alors optimal car f 0 = h(d) 2) q l! Min h..l {q i }. D après la définition de c et D, on a : (1) q l = Min D {q i } ; (2) q c < q l. Il en résulte que : Pour tout j dans D : q j > q c. Montrons que : pour tout j dans D : r j > t c. Supposons j dans D tel que t c " r j ; A la date t c, j est disponible et q j > q c. Contradiction.
On a donc : t c < Min D {r j }. Comme t c = t h +p h + + p c-1 et q l = Min D {q j }, il vient en remplaçant t c par son expression : h(d) = Min D {r j } +! D p j + Min D q j > r h +! h..l p j + q l -p c. D où : h(d) > f 0 - p c. Conclusion : Si f* est la solution optimale, le couple (c,d) associé à la solution de Jackson O 0 satisfait : f 0 - h(d) " p c -1. Il en résulte que dans une solution optimale : soit le job c est exécuté avant tous les jobs de D soit le job c est exécuté après tous les jobs de D. En effet, dans le cas contraire, il existerait dans le graphe G(O*) un chemin de 0 à n+1 de longueur supérieure à h(d)+p c > f*. Propriété (Calcul de Max I+J {h(i)}). Soit E l énoncé associé à E pour lequel la préemption est autorisée. Max I+J {h(i)} est la valeur du makespan de la solution fournie par l algorithme de Jackson préemptif pour l énoncé E. Propriété : L algorithme de Jackson préemptif calcule un ordonnancement optimal pour le problème 1 / r j,q j,pmtn / C max. Règle simple de l algorithme de Jackson préemptif : A chaque fin de job ou nouvelle date disponibilité on exécute le job disponible de latence maximale
Solution de Jackson pour E : Algorithme B6(E ) ; t := Min J {r j } ; Tantque J! * faire Si l ensemble des jobs prêts à t n est pas vide, alors Choisir le job prêt J i de latence maximum ; Exécuter dans O J i jusqu au plus petit instant u>t tel que : J i est terminé à u ou u est une date de disponibilité ; Si J i est terminé à u alors J := J-{J i } ; sinon créer dans O un temps-mort jusqu au plus petit instant u>t tel que u soit une date de disponibilité FinSi t := u ; FinTantque ; Retourner(O). Exemple : j 1 2 3 4 5 6 7 r j 10 13 11 20 32 0 32 p j 5 6 7 1 3 6 2 q j 7 26 24 21 8 17 0 6 1 3 2 3 4 1 5 7 0 6 10 11 13 19 24 25 29 32 35 37 15
Algorithme Branch & Bound pour 1 / r j,q j / C max Chaque sommet S de l arborescence de recherche correspond à un énoncé de «$1 / r j,q j / C max$» que l on note E(S)=(r,p,q). On note (c(s),d(s)) le couple (c,d) associé à E(S). La racine correspond à l énoncé initial E 0. La fonction d évaluation par défaut est définie par : g(s) = Max I+J {h(i)} Rappel : g(s) = B6(E(S) ) (algorithme de Jackson préemptif) Séparation d un sommet S. On sépare le sommet S en 2 nouveaux problèmes : - le problème avant pour lequel c(s) est exécuté avant tous les jobs de D(S) ; - le problème après pour lequel c(s) est exécuté après tous les jobs de D(S) ; Le problème avant est associé au nœud S av et défini par le triplet (r,p,q ) où : pour j!c(s), q j = q j ; q c(s) = Max{q c(s), p(d(s))+min D(S) {q j }. Le problème après est associé au nœud S ap et défini par le triplet (r,p,q) où : pour j!c(s), r j = r j ; r c(s) = Max{r c(s), p(d(s))+min D(S) {r j }.
Soit ê la valeur de la meilleure solution connue lors de l examen du sommet S. Il résulte de la propriété fondamentale de la solution de Jackson de l énoncé E = (r,p,q) que : pour tout job J k de J-D tel que p k > ê - h(d), alors dans toute solution optimale, soit J k est exécuté avant tous les jobs de D ; soit J k est exécuté après tous les jobs de D. Propriété de dominance : Soit K = {J k " J-D/p k > ê - h(d)} et k " K. Si r k + p(d) + p k + p l > ê alors dans toute solution optimale, J k est exécuté après tous les jobs de D ; Si Min D r j + p(d) + p k + q k > ê alors dans toute solution optimale, J k est exécuté avant tous les jobs de D.