• Aucun résultat trouvé

Dans ce qui suit, nous pr´esentons tout d’abord des notations utilis´ees dans l’heuristique HA, ensuite nous pr´esentons sa structure g´en´erale.

6.3.1

Les notations propres `a l’heuristique HA

Il convient de rappeler que les notations d’ordre g´en´eral relatives au probl`eme ont ´et´e pr´esent´ees dans la section 2.3 du chapitre 2.

— N 0 : racine de l’arbre o`u aucun job n’est fix´e — LB0 : borne inf´erieure initiale

— U B0 : borne sup´erieure initiale correspond `a N0 — δ : ensemble de tous les jobs non encore fix´es

— δi : ensemble des jobs non encore fix´es passant sur Ai

— LJ : liste des jobs suivant l’ordre des groupes

— σ : ordonnancement partiel dans lequel les jobs ne sont pas tous fix´es — U B∗

: meilleure borne sup´erieure enregistr´ee — σ∗

: ordonnancement correspondant `a U B∗

— N p : le nœud-parent du nœud N

— LB(N ) : borne inf´erieure de l’ordonnancement partiel σ — U B(N ) : borne sup´erieure calcul´ee au niveau du nœud N — N iv(N ) : niveau du nœud N

— Q : la pile des nœuds qui sera aliment´ee `a chaque exploration Dans ce chapitre, l’algorithme propos´e se base sur 3 ´etapes :

1. ´Etape 1 : cr´eation de la liste des jobs (LJ) suivant l’ordre chronologique des groupes. - cr´eer deux sous-listes L1 et L2. L1 correspond au jobs qui passent sur M1 et qui sont assembl´es suivant le groupe. L2 correspond aux jobs qui passent sur M2 et qui sont assembl´es suivant le groupe.

- cr´eer une liste LJ qui combine L1 et L2. Il faut signaler que les jobs de LJ sont s´electionn´es des deux listes L1 et L2 alternativement, c.`a.d. le premier job de LJ est copi´e de L1, le deuxi`eme job est copi´e de L2, le troisi`eme est de L1 ainsi de suite jusqu’`a copier tous les jobs.

2. ´Etape 2 : cr´eation et exploration de l’arbre : 1. Initialisation : cr´eer le nœud racine (N0)

2. Cr´eer les nœuds de premier niveau, dans chaque nœud, on fixe un job de la liste LJ 3. Calculer les bornes inf´erieures des nœuds du premier niveau pour choisir le nœud `a s´eparer ; 4. S´eparation du nœud ayant la borne inf´erieure minimale ;

5. Arrˆeter l’exploration de l’arbre si condition d’arrˆet est satisfaite ;

3. ´Etape 3 : appliquer une recherche locale l´eg`ere sur la solution finale (arrˆet apr`es 3 am´eliora- tions) pr´esent´ee dans le chapitre 5 ;

4. ´Etape 4 : Explorer partiellement des solutions de non permutation :

- parcourir la permutation finale, si deux jobs i et j sont deux jobs successifs sur la mˆeme machine d´edi´ee ayant li > pi,1, alors inverser l’ordre de i et j sur l’E1 sans modifier l’ordre

sur l’E2.

- V´erifier si la solution modifi´ee est meilleure que la solution de permutation. Cette instruction est bas´ee sur l’observation de quelques solutions optimales trouv´ees par les deux MIPs. En effet, nous avons observ´e, que lorsque le time lag est sup´erieur `a la dur´ee de traitement d’un job, une solution de non-permutation peut dominer une solution de permutation.

6.3.2

Sch´ema de branchement

Nous avons impl´ement´e un sch´ema de branchement classique connu dans la litt´erature comme suit : nous partons d’un nœud-racine o`u aucun job n’est fix´e. Le premier niveau de l’arbre contient n branches (n est le nombre de jobs). La premi`ere branche s´equencera le premier job de la liste LJ dans la premi`ere position disponible, la deuxi`eme branche s´equence le deuxi`eme job de LJ dans la premi`ere position, ainsi de suite jusqu’`a fixer tous les jobs dans l’ordre. Nous avons opt´e pour une exploration en profondeur. A chaque exploration, on fixe un job de LJ.

Pour g´erer les nœuds `a s´eparer, nous avons mis en place une pile Q. A chaque branche visit´ee, les nœuds explorables sont ajout´es `a Q suivant l’ordre croissant des LB. La tˆete de Q sera toujours le nœud `a visiter. La proc´edure de Backtraking est g´er´ee automatiquement par la pile Q. Une fois qu’un nœud est explor´e, il sera supprim´e de la pile Q.

6.3.3

Estimation des bornes au niveau des nœuds

Dans ce qui suit, nous pr´esentons les bornes inf´erieures et sup´erieures calcul´ees au niveau de chaque nœud de l’arbre afin de r´eduire l’espace de recherche.

Borne sup´erieure au niveau du nœud racine

La borne sup´erieure est appel´ee en premier temps au niveau du nœud-racine ≪ root ≫. Elle

est calcul´ee `a partir des deux algorithmes g´en´etiques pr´esent´es dans le chapitre pr´ec´edent AG1 et AG2. Ainsi, la borne sup´erieure initiale UB0 est donn´ee par la meilleure valeur de Cmax trouv´ee par les deux AGs : UB0 = min { Cmax(AG1+ RLI) ;Cmax(AG2+RLI) }.

Calcul des bornes sup´erieures `a l’int´erieure de l’arbre

Une borne sup´erieure est calcul´ee si un nœud est une feuille. Autrement, un ordonnancement complet est construit en passant par tous les niveaux de l’arbre.

Calcul des bornes inf´erieures `a l’int´erieur de l’arbre

Nous signalons tout d’abord que la d´etermination de la borne inf´erieure au niveau de la racine a ´et´e pr´esent´ee au chapitre 4 (lorsqu’aucun job n’est fix´e). Nous proposons quatre bornes inf´erieures (LBs), afin d’´evaluer la faisabilit´e des nœuds explor´es. A chaque exploration, nous calculons les LBs.

1. 1`ere borne inf´erieure :

Cette borne est une extension de LB4 (`a la racine), pr´esent´ee `a la section 4.2.

LB1 = M ax              CTM 1+ P j∈δ1 Pj,1+ u1 P i=1 Si,1.βi + M in Pj,2 | {z } j∈δ1 , CTM 2+ P j∈δ2 Pj,1+ u2 P i=1 Si,2.βi + M in Pj,2 | {z } j∈δ2

En effet, la fin de traitement sur chaque machine d’E1 ne peut pas ˆetre inf´erieure `a la disponibilit´e des machines sur E1, plus la dur´ee totale de traitement des jobs non encore affect´ee et la dur´ee minimale des setups. Au niveau de l’E2, on consid`ere que le dernier jobs ordonnanc´e est celui ayant la dur´ee de traitement minimale sur cet ´etage.

2. 2`eme borne inf´erieure :

On sait que la dur´ee moyenne des traitements est une borne inf´erieure pour les machines parall`eles identiques ([Gupta et al., 1997]). On consid`ere les dur´ees de fin de traitement des jobs ordonnanc´es sur E1 et la dur´ee moyenne de traitement des jobs non ordonnanc´es sur E2.Cette borne est une extension de LB5 pr´esent´ee dans le chapitre 4

LB2 = M in          CTM 1+ M in P j,1 | {z } j∈δ1 CTM 2+ M in P j,1 | {z } j∈δ2          . + 1/mX j∈δ Pj,2

3. 3`eme borne inf´erieure

Cette borne suppose que suite aux jobs ordonnanc´es, la disponibilit´e des machines parall`eles `a l’E2 ne peut pas ˆetre inf´erieure `a la premi`ere machine disponible sur E2 (inspir´e de [Wang et al., 2015]) LB3 = M in AV i | {z } i∈M2 +1/mX j∈δ Pj,2

4. 4`eme borne inf´erieure

On peut am´eliorer LB3 si on assimile les AVi (i=1..10) `a des dur´ees de traitement de 10 jobs fictifs. Dans ce cas :

LB4 = 1/m m X i=1 AV i + 1/mX j∈δ Pj,2

Au niveau de chaque nœud ≪ N ≫, on d´etermine LB1, LB2 et LB4 (´etant donn´e que LB4

domine toujours LB3) ensuite on choisit la meilleure.

6.3.4

Synth`ese de l’algorithme HA

L’ algorithme ci-dessous (algorithme 6) ne pr´esente pas les ´etapes 3 et 4 de la proc´edure propos´ee dans ce chapitre.

Algorithme 6 Pseudo code de HA D´ebut

1: Etape 1 : initialisation : cr´eer la liste LJ ; cr´eer le nœud N0,´

2: niv(N0)=0, UB(N0), LB0 , Np=N0 ; 3: U B∗

= UB(N0) ;

4: Etape 2 : s´eparation du nœud Np´

5: Pour chaque j ∈ LJ faire

6: Cr´eation du nœud N descendant du Np

7: niv(N)= niv(Np)+1 ;

8: Si niv(N) = n-1 alors N est une feuille 9: Si (UB(feuille)< UB* alors MAJ UB*

10: Calculer LB (N)

11: Si (LB (N) > LB0 (1+ α)) alors 12: ne pas explorer ce nœud

13: Si (LB (N) ≥ UB*) alors

14: ce nœud ne garantit pas une solution meilleure et donc supprimer le nœud N 15: Si (LB (N) < UB*) alors

16: ajouter le nœud N `a la pile Q

17: Etape 3 : s´election du nœud `a s´eparer´ 18: Si Q est vide alors sortir (aller `a l’´etape 4)

19: Sinon s´electionner le nœud N qui attend en premier (la tˆete de la pile)

20: N p ← N (Q.tete) 21: aller `a l’´etape 2

22: Etape 4 : arrˆeter l’exploration de l’arbre´

23: Si UB* = LB0

24: Si la dur´ee d’ex´ecution fix´ee est atteinte (60 secondes pour n=20 jobs, 150 secondes pour n = 50 jobs, 300 secondes pour n = 100 jobs, 500 secondes pour n = 200 jobs)

Fin

25: