• Aucun résultat trouvé

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).