• Aucun résultat trouvé

Cas général : Heuristiques inspirées des algorithmes classiques de bin packing

Chapitre 5 : Minimisation des encours

5.4. Cas général : Heuristiques inspirées des algorithmes classiques de bin packing

Enfin,

6

CJ2 j C < BI + 2BI 1

6

CJ2 j C < 3BI 4

5.4. Cas général : Heuristiques inspirées des algorithmes

classiques de bin packing

Dans cette section, nous allons proposer des méthodes rapides pour la résolution du problème P | p-batch, pj=p, rj, vj, B | 8Cj. Ces heuristiques sont aussi basées sur les algorithmes classiques du bin packing. Après avoir trié les tâches en ordre croissant des dates de disponibilité, nous définissons des intervalles de temps dans lesquelles nous cherchons les tâches pour former des batch. La longueur de l’horizon du temps est comprise entre les dates de disponibilité de la première et de la dernière tâche. Ensuite, cet horizon est divisé

en intervalles de longueur p. Pour chaque intervalle, nous appliquons une version modifiée des heuristiques FF, BF et WF. La raison de former des batch avec des tâches appartenant à un même intervalle de temps est d’éviter les attentes longues. Par conséquent, nous essayons d’empêcher de mettre dans un même batch les tâches de date de disponibilité petites avec les tâches de date de disponibilité grandes. Nous supposons que les tâches sont préalablement triées en ordre croissant des dates de disponibilité.

5.4.1. Intervalle First Fit Modifié

Cette heuristique fonctionne d’abord en divisant l’horizon de temps en intervalles de longueur égale à p. Ensuite, pour chaque intervalle de temps, l’heuristique crée des listes avec des tâches dont les dates de disponibilité sont dans l’intervalle correspondant. Pour les tâches de chaque intervalle, FF est appliqué aux tâches qui sont triées en ordre croissant des dates de disponibilité.

Intervalle First Fit Modifié (IFFM)

1. Trier les jobs en ordre croissant des dates de disponibilité rj

2. Soit le nombre d’intervalles, nbr_intervalle, égal à

1

(rNr1)/p

2

3. Mettre dans une liste, L1, les tâches dont les dates de disponibilité sont égales à 0.

4. Pour i de 1 jusqu’à nbr_intervalle

4.1. S’il y a au moins une tâche dans l’intervalle] (i-1)*p, i*p],

4.1.1. Mettre dans L1 les tâches dont les dates de disponibilité

sont dans] (i-1)*p, i*p]

4.1.2. Trier les tâches de L1 en ordre croissant des dates de disponibilité

4.1.3. Appliquer FF sur L1 pour créer des batch. Effacer de L1

les tâches qui sont mises dans un batch. Fin si

Fin pour

5. Fixer pour chaque batch la date au plus tôt égale à la plus grande date de disponibilité des tâches qu’il contient.

6. Ordonnancer les batch consécutivement en ordre croissant des dates au plus tôt sur les machines.

Pour calculer la compléxité de cette algorithme, notons D le nombre d’intervalles trouvé à l’étape 2. Alors, on entre dans la boucle « pour » à l’étape 4 au plus D fois. N étant le nombre de tâches total, soit N/c le nombre de tâche dans l’intervalle d avec c une constante et d = 1, 2,…, D. L’étape 4.1 est exécutée pour chaque différente valeur de d. La complexité de l’étape 4.1 dépend de l’étape 4.1.2 (ou également 4.1.3). Ainsi, pour N/c tâches, l’étape 4.1 a une complexité

qui est égale à (N/c)log(N/c). Enfin, la complexité finale d’IFFM peut être exprimée par O(DNlogN).

5.4.2. Intervalle Best Fit Modifié

Intervalle Best Fit Modifié (IBFM)

1. Trier les jobs en ordre croissant des dates de disponibilité rj

2. Soit le nombre d’intervalles, nbr_intervalle, égal à

1

(rNr1)/p

2

3. Mettre dans une liste, L1, les tâches dont les dates de disponibilité sont égales à 0.

4. Pour i de 1 jusqu’à nbr_intervalle

4.1. S’il y a au moins une tâche dans l’intervalle ] (i-1)*p, i*p],

4.1.1. Mettre dans L1 les tâches dont les dates de disponibilité

sont dans] (i -1) * p, i * p]

4.1.2. Trier les tâches de L1 en ordre croissant des dates de disponibilité

4.1.3 Créer une liste, L2, contenant les tâches de L1 en ordre décroissant des tailles

4.1.4. Tant que L1 n’est pas vide

4.1.4.1. Mettre la première tâche, jk, de L1 dans un

nouveau batch, Bk

4.1.4.2. Effacer jk des listes L1 et L2 4.1.4.3. Pour toutes les tâches, jl, de L2

4.1.4.3.1. Si jl entre dans Bk Bk = Bk jl

Effacer jl de L1 et L2

Fin si Fin pour

Fin tant que Fin si

4.2. Poser i = i +1 Fin pour

5. Fixer pour chaque batch la date au plus tôt égale à la plus grande date de disponibilité des tâches qu’il contient.

6. Ordonnancer les batch consécutivement en ordre croissant des dates au plus tôt sur les machines.

Après avoir déterminé les intervalles de temps, cette heuristique crée 2 listes pour chaque intervalle. La première liste contient des tâches en ordre croissant des dates de disponibilité. Cette liste fournit toujours le premier élément des batch. Ensuite, la deuxième liste est parcourue pour remplir un batch ouvert.

La deuxième liste contient des tâches en ordre décroissant des tailles. Le but de trier la deuxième liste de cette façon est qu’on range les tâches dans les boîtes les mieux remplies qui puissent les contenir, donc BF. D étant le nombre d’intervalles, la boucle « pour » à l’étape 4 est exécutée D fois. La boucle de l’étape 4.1.4 est exécutée au plus N fois. La boulce de l’étape 4.1.4.3 est exécutée

au plus N-1 fois. La complexité de l’algorithme est donc de O(DN2).

5.4.3. Intervalle Worst Fit Modifié

Intervalle Worst Fit Modifié (IWFM)

1. Trier les jobs en ordre croissant des dates de disponibilité rj

2. Soit le nombre d’intervalles, nbr_intervalle, égal à

1

(rNr1)/p

2

3. Mettre dans une liste, L1, les tâches dont les dates de disponibilité sont égales à 0.

4. Pour i de 1 jusqu’à nbr_intervalle

4.1. S’il y a au moins une tâche dans l’intervalle] (i-1)*p, i*p],

4.1.1. Mettre dans L1 les tâches dont les dates de disponibilité

sont dans] (i -1) * p, i * p]

4.1.2. Trier les tâches de L1 en ordre croissant des dates de disponibilité

4.1.3 Créer une liste, L2, contenant les tâches de L1 en ordre croissant des tailles

4.1.4. Tant que L1 n’est pas vide

4.1.4.1. Mettre la première tâche, jk, de L1 dans un

nouveau batch, Bk

4.1.4.2. Effacer jk des listes L1 et L2 4.1.4.3. Pour toutes les tâches, jl, de L2

4.1.4.3.1. Si jl entre dans Bk Bk = Bk jl

Effacer jl de L1 et L2 Fin si

Fin pour Fin tant que Fin si

4.2. Poser i = i +1 Fin pour

5. Fixer pour chaque batch la date au plus tôt égale à la plus grande date de disponibilité des tâches qu’il contient.

6. Ordonnancer les batch consécutivement en ordre croissant des dates au plus tôt sur les machines.

Cette heuristique est la même que IBFM sauf l’étape de tri dans l’étape 4.1.3. La

complexité de l’heuristique est la même que celle de IBFM, soit O(DN2).

5.4.4. Exemple illustratif

Pour mieux comprendre la démarche des heuristiques IFFM, IBFM et

IWFM, nous donnons ici un exemple illustratif. La seule différence entre ces

heuristiques est l’application des heuristiques classiques de bin packing (FF, BF et WF) dans l’étape 4.1. Puisque toutes ces heuristiques se ressemblent beaucoup, l’exemple ne sera expliqué que sur IBFM.

Exemple illustratif : Nous avons 6 tâches dont les dates de disponibilité et les

tailles sont données dans le tableau 5.1. Deux machines de capacité 6 sont disponibles à l’instant 0. La durée d’exécution d’un batch est de 60 minutes.

Tableau 5.1. Données de l’exemple illustratif

tâche 1 2 3 4 5 6

rj 0 10 50 70 130 150

vj 1 3 4 2 4 1

Résolution de l’exemple illustratif

Etape1 : Les tâches sont déjà triées dans l’ordre croissant des dates de

disponibilité.

Etape2 : nbr_intervalle=

1

(150−0)/60

2

=3.

(L’étape 4.1 va calculer ces 3 intervalles comme ]0, 60], ]60, 120] et ]120, 180].)

Etape 3 : Pour que les tâches dont la date de disponibilité est 0 soient incluses

dans l’intervalle 1, l’algorithme les met dans la liste L1.

Etape 4 : On a 3 intervalles. Donc, cette étape va étre exécutée 3 fois.

Etapes 4.1, 4.1.1 et 4.1.2 : L1 contient les tâches 1, 2 et 3.

Etape 4.1.3 : Les tâches de L1 sont copiées dans une 2ème liste, L2, en ordre

décroissant des tailles. Ainsi, L2 contient les tâches 3, 2 et 1.

Etape 4.1.4 : Cette étape consiste à former des batch jusqu’à ce qu’il n’y ait plus

Etapes 4.1.4.1 et 4.1.4.2. : Pour être sensible à la date de disponibilité des

tâches, quand l’algorithme ouvre un nouveau batch, L1 fournit le premier élément

de ce batch. Dans notre exemple, le batch numéro 1 est créé, et le premier élément

de L1, la tâche 1, est mise dedans. Ensuite, cette tâche est effacée des listes L1 et

L2.

Etapes 4.1.4.3 et 4.1.4.3.1 : L’étape 4.1.4.3 a pour but de remplir le batch

actuellement ouvert avec la logique de BF. Pour mieux remplir le batch, la liste L2

est parcourue en commençant par le premier élément, et on essaie de mettre le plus grand élément dans le batch. Dans notre exemple, la tâche 3 est mise dans le batch qui a maintenant une taille égale à 5. Il n’y a plus assez d’espace pour la tâche 2 dans ce batch (car sa capacité est 6), donc le batch numéro 1 est fermé. La tâche 3 est effacée des listes L1 et L2.

Mais, il y a encore un élément dans L1 (tâche 2). Donc, un deuxième batch est

créé. Pour l’intervalle 1, nous avons donc formé 2 batch.

Enfin, il n’y a plus de tâche dans l’intervalle 1, toutes ont été mises dans un batch. L’algorithme effectue les mêmes opérations pour les intervalles 2 et 3, respectivement. Une fois que toutes les tâches sont mises dans un batch, les étapes 5 et 6 déterminent la date au plus tôt des batch et les ordonnance sur les machines. Un diagramme de Gantt est donné dans la figure 5.2 pour montrer la solution de l’exemple illustratif avec IBFM.

Figure 5.2. Résolution de l’exemple avec illustratif IFBM

Nous obtenons la valeur 840 pour la fonction objectif. Nous pouvons calculer l’attente des tâches avant leur exécution pour mieux évaluer les attentes dans le stock de lavage. Il n’y a que les tâches 1 et 6 qui attendent 50 minutes et 20 minutes, respectivement, dans le stock de lavage. Alors, nous avons une durée d’attente totale qui est égale à 70 minutes, ou encore une attente moyenne qui est égale à 11.6 minutes (70 minutes / N avec N le nombre de tâches).