Chapitre 4 : Minimisation de la durée totale de lavage
4.3 Relation entre le bin packing et la minimisation du C max
4.3.1. Heuristiques inspirées des algorithmes classiques de bin packing
Dans cette section, nous présentons des algorithmes inspirés des heuristiques classiques de bin packing pour notre problème. Nous avons vu dans la section précédente que minimiser le nombre de batch ne minimise pas
forcément la valeur de Cmax. Rappelons-nous du contre exemple que nous avons
donné pour le lemme 1. Dans ce contre exemple, nous avons 6 tâches, le nombre
minimal de batch est 3 (valeur du Cmax 6p) alors que la valeur optimale pour le
Cmax est obtenue avec 4 batch (valeur du Cmax 5p). Alors, avoir un nombre de batch considérablement petit (mais pas forcément minimal) peut aider à minimiser
le Cmax. Donc, même si en minimisant le nombre de batch on ne minimise pas le
Cmax, trouver le nombre de batch minimal, ou considérablement petit, permet
d’avoir une bonne solution approchée pour le Cmax.
Nous proposons 4 heuristiques : First Fit Modifié (FFM), Best Fit Modifié (BFM), Worst Fit Modifié (WFM) et Next Fit Modifié (NFM). Ces algorithmes, qui sont de complexité polynomiale, ont pour but de trouver des solutions rapides en créant un nombre de batch considérablement petit. La première étape de chacune des heuristiques que nous proposons consiste à trier les tâches en ordre croissant des dates de disponibilité. Une fois qu’un batch est ouvert, la première tâche de la liste précédemment créée est placée dans ce batch et elle est effacée de la liste. Ensuite, les algorithmes classiques [25] First Fit, Best Fit, Worst Fit et Next Fit sont appliqués pour les tâches qui n’ont pas encore été placées dans un batch.
Nous donnons ci-après les algorithmes FFM, BFM, WFM, NFM et nous illustrons leur principe en les appliquant tous sur un exemple.
A. First Fit Modifié (FFM)
Tout d’abord, une liste, L1, contenant les tâches en ordre croissant des
dates de disponibilité est créée. A chaque fois qu’une tâche est placée dans un
nouveau batch, nous parcourons la liste L1 contenant le reste des tâches afin de
remplir ce batch. Le but principal de cette heuristique est d’éviter le gaspillage de capacité des batch.
Algorithme FFM
1. Trier les jobs en ordre croissant des dates de disponibilité rj : L1
2. Tant que L1 n’est pas vide
2.1. Choisir le premier élément de L1 et le mettre dans le premier batch où il peut entrer. Si aucun batch ne convient, créer un nouveau batch pour cet élément
2.2 Mettre à jour L1.
Fin tant que
3. Fixer pour chaque batch la date au plus tôt (1) égale à la plus grande date de
disponibilité des tâches qu’il contient.
4. Ordonnancer les batch consécutivement en ordre croissant des dates au plus tôt sur les machines.
En cas d’égalité des dates de disponibilité à l’étape 1 ou des dates au plus tôt à l’étape 4, le choix de l’ordre des tâches dans l’étape 1 et des batch dans l’étape 4 est arbitraire.
Exemple illustratif : Soient 6 tâches ayant les tailles B/4, B/2, B/4+5, 5, 3B/4, 5,
respectivement. Affectons à ces tâches des dates de disponibilité : 20, 10, 30, 60, 100, 80, respectivement et en minutes. Soit la durée d’exécution égale à 100
minutes. Nous avons 2 machines de capacité B. 5 est un nombre très petit.
Numérotons ces tâches de 1 à 6. Notons que pour cet exemple, le nombre minimal
de batch est 2, et le Cmax optimal est 200, ce qui est trouvé avec 2 batch.
Résolution de l’exemple illustratif avec FFM : Après avoir trié les tâches en
ordre croissant des dates de disponibilité, nous obtenons une liste, L1, des tâches
en ordre suivant : 2, 1, 3, 4, 6, 5. Nous pouvons montrer l’arrivée de ces tâches par un diagramme de date de disponibilité/taille (cf. figure 4.5).
Figure 4.5. Diagramme date de disponibilité/taille pour les tâches de l’exemple illustratif
Pour l’instant, aucune tâche n’est placée dans un batch. Le batch à remplir
est le batch numéro 1. Nous prenons le premier élément de L1 (tâche 2) qui est de
taille B/2, et le plaçons dans le batch 1. Le deuxième élément (tâche 1) a la taille
B/4 et peut entrer dans le batch 1. Mais, le troisième élément (tâche 3) a la taille
B/4+5 et ne peut pas entrer dans le batch 1. Alors, on ouvre un nouveau batch,
batch 2, pour cet élément. Le quatrième élément (tâche 4) a la taille 5 et nous
avons assez de place pour lui dans le batch 1. Il est alors placé dans le batch 1. De
même que le 5ème élément (tâche 6). Maintenant, le batch 1 a la taille 3B/4 + 2 5,
et le batch 2 a la taille B/4+5. Le dernier élément de la liste (tâche 5) a la taille
3B/4. Il ne peut entrer ni dans le batch 1 ni dans le batch 2. Alors, il est placé dans
un nouveau batch (batch numéro 3).
Il nous reste à affecter les dates au plus tôt à ces trois batch. La plus grande date de disponibilité des tâches dans le batch 1 est 80 (la date de disponibilité de la tâche 6). Le batch 2 ne contient qu’une seule tâche dont la date de disponibilité fixe la date au plus tôt du batch 2 à l’instant 30. De la même manière, le batch 3 a une date au plus tôt égale à 100.
La dernière étape de FFM est d’affecter ces tâches aux machines. Le batch 2 a la date au plus tôt la plus petite, donc on peut l’affecter à la première machine disponible et commencer son exécution à l’instant 30. Puisque les machines sont identiques et nous avons une durée d’exécution unique, nous pouvons l’affecter à la machine numéro 1. Le batch 1 et 3 ont les dates au plus tôt égales à 80 et 100. On affecte alors le batch 1 à la machine 2. Enfin, le batch 3 est affecté à la
machine 1. Ainsi, la valeur du Cmax trouvé est 230. Cette solution est montrée dans la figure 4.6 par un diagramme de Gantt.
Figure 4.6.Résolution de l’exemple illustratif avec FFM
A part le tri à l’étape 1, FFM est identique à FF. Donc, la complexité de
FFM est égale à la complexité de FF qui est de O(NlogN) [25]. Notons que
l’algorithme FF est un algorithme online. C’est-à-dire que nous n’avons pas besoin de connaître à l’avance les tâches. Elles sont mises dans les batch au fur et à mesure de leur arrivée. Par contre dans notre cas, FFM devient un algorithme offline, car l’étape 1 consiste à trier les tâches d’après les dates de disponibilité. B. Best Fit Modifié (BFM)
A chaque fois qu’un batch est ouvert, une liste contenant les tâches dans l’ordre croissant des dates de disponibilité fournit le premier élément du batch. Ensuite, l’algorithme cherche à placer la tâche qui va laisser le moins d’espace dans le batch.
Algorithme BFM
1. Trier les jobs en ordre croissant des dates de disponibilité rj : L1
2. Trier les jobs en ordre décroissant des tailles vj : L2
3. Tant que L1 n’est pas vide
3.1. Mettre le premier élément de L1 : jk dans un nouveau batch : Bk
3.2. Effacer jk des listes L1 et L2
3.3. Pour tous les éléments jl de L2
3.3.1. Si jl peut entrer dans le batch Bk
Alors Bk = Bk∪ jl
Effacer jl des listes L1 et L2 Fin si
Fin pour Fin tant que
4. Fixer pour chaque batch la date au plus tôt égale à la plus grande date de disponibilité des tâches qu’il contient.
5. Ordonnancer les batch consécutivement en ordre croissant des dates au plus tôt sur les machines.
Machine Temps 1 2 Batch 2 Batch 1 Batch 1 Batch 3 30 130 230
En cas d’égalité des dates ou taille aux étapes 1, 2 ou 5, le choix de l’ordre des tâches ou batch est arbitraire.
Résolution de l’exemple illustratif avec BFM : Nous créons d’abord une
première liste, L1, qui contient les tâches en ordre croissant des dates de
disponibilité. Alors dans L1, nous avons les tâches 2, 1, 3, 4, 6, 5. La deuxième liste, L2, contient les tâches en ordre décroissant des tailles. Alors, l’ordre des
tâches dans L2 est le suivant : 5, 2, 3, 1, 4, 6. Nous pouvons maintenant
commencer à remplir le premier batch.
La liste L1 fournit son premier élément comme le premier élément du batch
1. Alors, la tâche 2 est placée dans le batch 1 et elle est effacée des listes L1 et L2.
Nous allons maintenant continuer à remplir le batch 1 avec les éléments de L2. Le
premier élément de la L2 est la tâche 5 qui a la taille 3B/4. Mais la tâche 2 dans le
batch 1 a la taille B/2. Donc, la tâche 5 ne peut pas être placée dans ce batch. On
continue avec le deuxième élément de L2, la tâche 3, qui a la taille B/4+5. Donc,
on la met dans le batch 1 et on l’efface des listes L1 et L2. L’élément suivant dans
L2 est la tâche 1 et sa taille est B/4. Elle n’entre pas dans le batch 1. Les éléments
restant dans L2 sont les tâches 4 et 6. Elles ont la taille toute petite, 5. Alors, elles
sont placées dans le batch 1. Puisque toute la liste L2 est parcourue, nous fermons
le batch 1.
Les éléments qui restent dans L1 et L2 sont les tâches 1 et 5. Le premier
élément dans L1 est la tâche 1, donc, cette tâche est placée dans un nouveau batch,
i.e. batch 2. Il nous reste seulement la tâche 5 dans L2 (aussi dans L1). Quand on met cette tâche dans le batch 2, on obtient un batch 100% plein. Puisqu’il n’y a
plus d’élément dans L1 (ni dans L2), on passe à l’étape suivante pour affecter les
dates au plus tôt des batch.
La tâche dont la date de disponibilité est la plus grande dans le batch 1 est la tâche 6. Donc, la date au plus tôt du batch 1 est 80. De la même façon, la date au plus tôt du batch 2 est 100. Le batch 1 est alors affecté à la machine 1, et le batch 2 à la machine 2. Puisque l’exécution d’un batch dure 100 minutes, la
valeur du Cmax est trouvée comme 200.
La complexité de BFM dépend principalement de l’étape de 3. Pour
chaque élément de L1, L2 est parcourue afin de trouver des tâches pour mettre
dans un batch. Alors, pour chaque élément de L1 de 1 à N, au pire des cas N
itérations sont effectuées pour rechercher des tâches dans L2. Donc, la complexité
C. Worst Fit Modifié (WFM)
La différence entre WFM et BFM est qu’une fois qu’un batch est ouvert,
WFM essaie de placer d’abord les petites tâches dans ce batch, alors que BFM
chercherait à placer la plus grande. Algorithme WFM
1. Trier les jobs en ordre croissant des dates de disponibilité rj : L1
2. Trier les jobs en ordre croissant des tailles vj : L2
3. Tant que L1 n’est pas vide
3.1. Mettre le premier élément de L1 : jk dans un nouveau batch : Bk
3.2. Effacer jk des listes L1 et L2
3.3. Pour tous les éléments jl de L2
3.3.1. Si jl peut entrer dans le batch Bk
Alors Bk = Bk∪ jl
Effacer jl des listes L1 et L2
Fin si Fin pour
Fin tant que
4. Fixer pour chaque batch la date au plus tôt égale à la plus grande date de disponibilité des tâches qu’il contient.
5. Ordonnancer les batch consécutivement en ordre croissant des dates au plus tôt sur les machines.
Résolution de l’exemple illustratif avec WFM : Comme WFM est très
proche de BFM, nous donnons directement le résultat : Nous obtenons avec WFM trois batch. Le premier batch contient les tâches 1, 2 4 et 6, le deuxième batch contient la tâche 3 et le batch trois contient la tâche 5. Les dates au plus tôt de ces batch sont 80, 30 et 100, respectivement. Alors, le batch 2 est affecté à la machine
1, le batch 1 à la machine 2 et le batch 3 à la machine 1. Le Cmax obtenu est égal à
230.
En adoptant le même raisonnement que pour l’algorithme BFM, nous trouvons pour WFM une complexité de O(N²).
D. Next Fit Modifié (NFM)
A part le tri fait à l’étape 1, cet algorithme n’est pas différent de l’heuristique next fit. Quand on ouvre un batch, on essaie de le remplir avec des tâches qui se succèdent. Contrairement aux algorithmes précédents, dès qu’il y a une tâche qui n’entre pas dans le batch courant, le batch est fermé et un nouveau batch est ouvert pour la tâche suivante.
Algorithme NFM
1. Trier les jobs en ordre croissant des dates de disponibilité rj : L1
2. Ouvrir le premier batch
3. Tant que L1 n’est pas vide
3.1. Choisir le premier élément de L1 et le mettre dans le batch courant.
S’il n’entre pas, fermer ce batch, ouvrir un nouveau batch pour cet élément.
3.2. Mettre à jour L1
Fin tant que
4. Fixer pour chaque batch la date au plus tôt égale à la plus grande date de disponibilité des tâches qu’il contient.
5. Ordonnancer les batch consécutivement en ordre croissant des dates au plus tôt sur les machines.
Après avoir trié les tâches en ordre croissant des dates de disponibilité, les batch sont formés avec des tâches consécutives.
Résolution de l’exemple illustratif avec NFM : Pour cet exemple, le tri
des tâches par rapport aux dates de disponibilité nous donne la liste des tâches suivante : 2, 1, 3, 4, 6, 5. Un batch est ouvert pour la tâche 2 dont la taille est B/2. La taille de la tâche suivante, i.e. tâche 1, est égale à B/4. Alors, on la met dans le premier batch aussi. Mais, il ne reste plus assez de place dans ce batch pour la tâche 3. Donc, on ferme le batch 1 et on ouvre un nouveau batch (batch 2) pour la tâche 3. Les tâches suivantes (tâches 4 et 6) ont des tailles très petites et elles entrent dans le batch 2. De cette façon, le batch a une taille égale à B/4 + 3 5. Mais la dernière tâche (tâche 5) a une taille égale à 3B/4. Donc, le batch 2 est fermé et la tâche 5 est mise dans un nouveau batch (batch 3). Nous fixons les dates au plus tôt de ces batch grâce à l’étape 3. Alors, les dates au plus tôt des batch 1, 2 et 3 sont 20, 80 et 100, respectivement. Quant à l’affectation de ces batch aux machines par l’étape 4, nous affectons le batch 1 à la machine 1, le batch 2 à la machine 2 et enfin le batch 3 à la machine 1. La figure 4.7 montre cette solution via un diagramme de Gantt.
Figure 4.7. Résolution de l’exemple illustratif avec NFM Machine Temps 1 2 Batch 1 Batch 2 Batch 3 20 120 220
Notons que cet algorithme est beaucoup plus sensible aux dates de disponibilité des tâches puisque les batch sont constitués avec des tâches consécutives. La complexité de NFM dépend de l’étape 1 qui a une complexité de
O(NlogN).