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 16
CJ2 j C < 3BI 45.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
(rN −r1)/p2
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
(rN −r1)/p2
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
(rN −r1)/p2
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)/602
=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).