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: