• Aucun résultat trouvé

7 . 3 Définition de nouveaux opérateurs génétiques

La principale fonction des opérateurs génétiques est la création de nouveaux individus en combinant ou en réarrangeant des individus parents de la population actuelle. Cette étape permet de générer une nouvelle population. Il est important de bien choisir les opérateurs les plus adaptés au problème à résoudre afin que les nouveaux individus générés soient légaux et qu'on ne perde pas de temps à générer et évaluer des individus qui sont moins bons que leurs parents.

Nous proposons d'utiliser pour la reproduction des individus, les opérateurs de croisement et mutation standards que nous avons modifié afin qu'ils soient plus appropriés au codage utilisé et à l'objectif visé.

La mutation

Notre codage étant sur m vecteurs, il s'agira d'appliquer la mutation entre deux positions appartenant à des vecteurs différents. En effet, dans un même vecteur, ceci n'est pas nécessaire car l'algorithme d'ordonnancement détermine le meilleur ordre pour l'ensemble des tâches du processeur en question. Le but de la mutation est de réduire les pénalités sur les vecteurs d'un individu donné. Pour cela, nous avons adopté les hypothèses suivantes :

• la mutation n'est appliquée qu'aux individus ayant une pénalité non nulle.

• elle est régie par des règles afin de réduire le nombre de pénalités. Pour ce faire chaque individu sauvegarde pour chaque processeur Pj, en plus de Pen(Pj) la tâche qui correspond à cette pénalité T_Pen(Pj) et le nombre de tâches pénalisées nb_Pen(Pj).

Le principe est de réduire les pénalités en allégeant les processeurs très pénalisés. Pour cela on définit min_pen comme la valeur à partir de laquelle les tâches sont transférées. Dans le cas où un processeur est très pénalisé, il y a transfert de la première tâche ayant une pénalité. Le cas échéant on échange des tâches entre les processeurs très pénalisés et ceux qui le sont moins. Nous avons choisi comme tâche à transférer la première tâche ayant une pénalité, en effet, le retard de celle-ci peut entraîner un retard des tâches ordonnancées après et par conséquent être à l'origine de leur pénalité.

100

• déterminer le processeur de plus haute pénalité Php • déterminer le processeur de plus faible pénalité Pfp • si nb_Pen(Php) > min_pen

prendre T_Pen(Php) et la transférer de Phpvers Pfp sinon

prendre T_Pen(Php) et l'échanger avec une tâche Te de Pfp tel que cl(Te ) = cl(T_Pen(Php) ) (ou supérieure le cas échéant)

si réplication(A) différente de 0

choisir deux processeurs au hasard

choisir une tâche au hasard sur le premier processeur et la transférer vers le second

Cet algorithme permet d'alléger Php s'il contient beaucoup de tâches pénalisées, le cas échéant d'échanger sa tâche la plus pénalisante avec une autre telle que son échéance soit plus grande afin de ne pas tomber dans le cas où on procéderait au remplacement de T_Pen(Php) par une tâche qui risque d'être aussi pénalisante.

Les deux critères de réduction de la pénalité et de la réplication étant antagonistes, le test sur la réplication nulle permet d'éviter à l'algorithme de tomber dans un minimum local quand la pénalité est non nulle. Ainsi, de nouveaux individus peuvent être générés.

Soit l'exemple de la figure 7.3 où on compare l'application de l'échange et du transfert de tâches lors de la mutation :

P1 T1 | 1 T2 | 3T3 | 6 T4 | 8 P2 T5 | 2 T6 | 6T7 | 9 T8 | 11 Pen(P1) = Pen(T3) = 2 Pen(P2) = 1 = max(1,1) = max(Pen(T7),Pen(T8)) nb_Pen(P1) = 1 nb_Pen(P2) = 2 T1 | 1 T2 | 3 T3 | 6 T7 | 9 T5 | 2 T6 | 6 T8 |8 T4 | 10 Pen(P1) = 2 = max(2, 1) = max(Pen(T3), Pen(T7)) min_pen = 2 nb_Pen(P1) = 2 T1 | 1 T2 | 3 T3 | 6 T7 | 9 T4 | 11 T5 | 2 T6 | 6 T8 |8 Pen(P1) = 2 = max(2, 1) =max(Pen(T3), Pen(T7)) min_pen = 1 nb_Pen(P1) = 2

La colonne de gauche représente l'individu sur lequel on va appliquer la mutation. La colonne du centre l'individu obtenu après échange de la première tâche pénalisante sur P2 à savoir T7 avec une de classe supérieure T3 (puisqu'il n'y a pas de tâches de même classe sur le processeur P1). La colonne de droite montre l'individu obtenu après transfert de cette même tâche.

L'opérateur de croisement

La préoccupation majeure lors de l'application de cet opérateur est la génération d'individus complets sans duplication (individus valides). Pour plus de clarté, la figure 7.4 illustre un exemple où le croisement est appliqué en choisissant des points de coupure aléatoirement :

Individu Parent 1 Individu Parent 2 points de coupure P1 T1 | 1 T2 | 3 T3 | 6 T4 | 8 P1 T3 | 3 T5 | 4 T6 | 8 T4 | 10 P2 T5 | 2 T6 | 6 T7 | 9 T8 |11 P2 T1 | 1 T2 | 3 T7 | 6 T8 |8 Individu Fils 1 Individu fils 2

P1 T1 | T2 |T6 | T4| P1 T3 | T5 | T3 | T4 | P2 T5 | T6 |T7 | T8| P2 T1 |T2 | T7 | T8 |

Figure n° 7.4 Exemple de points de coupure aléatoires

Afin d'éviter de pareilles situations, nous choisissons des points de coupure qui vérifient la relation suivante :

cl(Ti) < cl(Tj) , cl(Ti') < cl(Tj') , cl(Ti) = cl(Ti') (1)

P1 Tk | Ti |Tj | Tk| P1 Tk | Ti' | Tj' | Tk | Individu Parent 1 Individu Parent 2

L'équation (1) garantie qu'à droite de chaque point de coupure, les tâches auront des classes supérieures et par conséquent le risque de duplication de tâches au sein d'un individu est exclus. Un point de coupure est choisi sur chaque vecteur composant les individus à croiser. Le croisement est appliqué entre deux vecteurs représentant le même

102

processeur. Les points de coupure ne doivent pas nécessairement être à la même position sur les deux vecteurs. L'exemple qui suit illustre une application correcte du croisement :

Individu Parent 1 Individu Parent 2 points de coupure sur le vecteur 1 P1 T1 |1 T2 |3 T3 |6 T4 |8 P1 T3 |3 T5 |4 T6 |8 T4 |10 P2 T5 |2 T6 |6 T7 |9 T8 |11 P2 T1 |1 T2 |3 T7 |6 T8 |8 points de coupure sur le vecteur 2

Individu Fils 1 Individu fils 2

P1 T1 |1 T2 |3 T3 |6 T6 |10 T4 |12 P1 T3 |3 T5 |4 T4 |6

P2 T5 |2 T7 |5 T8 |7 P2 T1 |1 T2 |3 T6 |7 T7 |10 T8 |12

Figure n° 7.5 Exemple de croisement correct

Ces individus sont plus mauvais que leurs parents si on compare les paramètres long_ord et pénalité long_ord pénalité Individu parent 1 11 3 Individu parent 2 10 1 Individu fils 1 12 3 Individu fils 2 12 2

Toutefois, en appliquant la mutation aux individus fils, on obtient :

P1 T1 |1 T2 |3 T6 |7 T4 |9 P1 T3 |3 T5 |4 T7 |7

P2 T3 |3 T5 |4 T7 |7 T8 |9 P2 T1 |1 T2 |3 T6 |7 T8 |9 T4 |11

En revanche l'individu fils 1 a une pénalité nulle et une longueur d'ordonnancement minimale.

Pour cela nous proposons d'appliquer d'abord le croisement, de réajuster les individus (en les ordonnant), de les réévaluer et ensuite si nécessaire d'appliquer la mutation.

7 . 4 Modèles parallèles pour l'exécution de l'algorithme