• Aucun résultat trouvé

Chapitre 4 : Minimisation de la durée totale de lavage

4.5 Méthodes exactes et approchées pour le problème :

4.5.2 Algorithme de 2-approximation

Dans la partie 4.4.1, nous avons proposé un algorithme exact (algorithme

split job) qui est capable de trouver la solution optimale du problème lorsqu’il est

permis de couper les tâches. Comme nous l’avons vu précédemment, cet algorithme est aussi un algorithme de borne inférieure du problème. Ainsi, dans le cas où il trouve une solution avec des tâches non-coupées, cette solution est la solution optimale du problème. Dans cette section, nous développons un algorithme de 2-approximation appelé « combine job » utilisant l’algorithme split

job et cherchant à reformer les tâches originales.

Ce nouvel algorithme commence par exécuter split job afin de trouver une

première solution. Ensuite, dans chaque batch, il cherche les tâches coupées. S’il en trouve, les tâches coupées sont enlevées des batch dans lesquels elles ont été mises et une liste contenant ces tâches en ordre décroissant des tailles est créée. L’étape suivante de l’algorithme est d’essayer de mettre ces tâches dans les batch déjà existants en respectant leurs dates de début d’exécution. C’est-à-dire que si une tâche peut être mise dans un batch en respectant la contrainte de capacité, sa date de disponibilité doit être inférieure ou égale au début d’exécution de ce batch. Enfin, s’il y a encore des tâches qui ne sont pas mises dans un batch, l’algorithme applique FFD sur ces tâches restantes et les batch ainsi formés sont ordonnancés après les batch formés par l’algorithme split job.

Algorithme « Combine Job »

1. Exécuter split job.

2. Enlever les tâches coupées des batch créés à l’étape 1 et les mettre dans une liste : L

3. Trier les batch par ordre croissant des dates au plus tôt 4. Trier les tâches de L selon l’ordre décroissant de leur taille

5. Pour tous les batch, bb, créés dans l’étape 1 et pour toutes les tâches, jL, de

L

5.1. Si la tâche jL peut être mise dans le batch bb et si sa date de disponibilité est inférieure ou égale à la date de début d’exécution de

bb, placer jL dans bb et l’effacer de L

6. Pour toutes les tâches qui n’ont pas encore été mises dans un batch, appliquer FFD. Trier les batch ainsi formés par ordre croissant des dates au plus tôt et les ordonnancer après les batch créés à l’étape 1.

La complexité de l’algorithme dépend de l’étape 5. Le nombre de batch trouvé par l’algorithme split job est borné par le nombre de tâche, N, dans le problème. De plus, si chaque batch contient une tâche coupée, on a N-1 tâches coupées. Alors, pour chaque tâche coupée, au plus N itérations sont faites dans

Illustrons sur un petit exemple la démarche suivie par combine job. Supposons que l’on a 10 tâches dans le problème, avec les tailles et dates de disponibilité précisées dans le tableau 4.3. Soit la capacité des machines égale à 6 et le nombre de machines fixé à 2. La durée d’exécution d’un batch est égale à 60 minutes. Nous allons détailler l’exécution de l’algorithme, étape par étape, sur des diagrammes de Gantt.

Tableau 4.3. Exemple illustratif pour l’algorithme combine job tâche 1 2 3 4 5 6 7 8 9 10 date de disponibilité 0 0 10 20 30 40 50 60 70 80 taille 4 3 2 1 5 4 3 2 5 4

Etape 1 de combine job : Après avoir exécuté l’étape 1 de combine job, on obtient

une solution initiale avec 6 batch et une durée de Cmax égale à 190. Le diagramme

de Gantt ci-dessous montre les batch ainsi que les tâches qu’ils contiennent. L’indice « c » précise quelles sont les tâches coupées.

Figure 4.15. Etape 1 de l’algorithme combine job

Etape 2 de combine job : Les tâches coupées sont enlevées des batch, et donc, on

obtient les batch avec des tâches non-coupées présentés sur la figure 4.16.

Figure 4.16. Etapes 2 et 3 de l’algorithme combine job

Etape 3 de combine job : Après avoir sorti les tâches coupées, on obtient une liste

Etape 4 de combine job : Pour les tâches 9, 1 et 7, l’algorithme essaie maintenant

de voir si les tâches peuvent être mises dans les batch créés précédemment en respectant la contrainte de capacité et les dates au plus tôt de ces batch.

De par sa taille, la tâche 9 peut être placée dans le batch 1 mais sa date de disponibilité est supérieure à la date de début d’exécution de ce batch. Le reste des batch n’ont pas assez d’espace pour accepter la tâche 9. Donc, la tâche 9 n’est mise dans aucun batch à cette étape.

La tâche 1, elle est mise dans le batch 1. Ensuite, la tâche 7 est placée dans le batch 5.

Etape 5 de combine job : FFD est appliqué sur la tâche 9, et un batch est créé

pour cette tâche. Puis, ce batch est ordonnancé après les batch créés dans l’étape

1. Donc, ce nouveau batch (le 7ème batch) est exécuté juste après le batch 5.

La solution finale est présentée sur la figure 4.17.

Figure 4.17. Solution obtenue par l’algorithme combine job

Théorème 9. Combine job est un algorithme de 2-approximation pour le

problème P | p-batch, rj, pj=p, vj, B | Cmax.

Preuve. Soit CmaxLB le Cmax trouvé par split job (LB pour « lower bound » en anglais), et Cmax* la solution optimale. Il est clair que CmaxLB 5Cmax* . Posons

max

C la solution trouvée par combine job. Nous voyons que jusqu’à la fin de

l’étape 4, la valeur de Cmaxest la même que celle trouvée par split job. A partir

de l’étape 5, combine job peut avoir un Cmax plus grand.

Supposons que split job crée nb batch. Alors dans le pire cas, il y a au moins une tâche coupée entre chaque batch et donc le nombre de tâches coupées

mises dans des batch déjà existants, ni ensemble dans un nouveau batch. Ces nb-1 tâches donnent alors lieu chacune à la création d’un batch.

Supposons qu’il y ait M machines et que chaque machine m exécute nbm batch,

avec 15m5M, dans la solution trouvée par split job. Alors,

{ }

LB

m M m C p nb max 1 * max ≤ = .

Notons qu’après avoir ordonnancé les nb-1 batch nouvellement créés après les nb

premiers batch, chaque machine peut avoir au plus M

{ }

m

m

nb

1

max

= batch de plus dans

la nouvelle solution. La relation entre CmaxLB et Cmax devient :

{ }

nb p C C m M m LB * max 1 max max = + ≤ En outre,

{ }

* max max 1 max max nb *p 2C 2C C m LB M m LB + ≤ ≤ = On obtient alors * max max 2C C ≤ 4