• Aucun résultat trouvé

Génération de plans admissibles

5.2 Génération de plans temporellement admissibles

5.2.2 Génération de plans admissibles

Après avoir calculé l'ensemble des plans faisables relatifs à un problème de planication (G, T0)où G est un graphe ET/OU et T0 est un sous-ensemble de l'ensemble des tâches nales, nous déterminons maintenant les plans admissibles. Pour se faire, nous calculons pour chaque plan faisable l'ensemble des intervalles d'exécution possibles de chacune de ses tâches. Ensuite, nous vérions la possibilité d'exécuter les tâches pendant les intervalles d'exécution trouvés. Rappelons qu'un plan faisable est un sous-graphe où les n÷uds sont reliés uniquement par des contraintes simples ou conjonctives. La gure 5.9 illustre la deuxième étape de planication : génération de plans admissibles.

5.2. Génération de plans temporellement admissibles 85

Données :

 G : un graphe ET/OU

 from : le n÷ud de G d'où doit partir le chemin (le but)

 to : le n÷ud de G où doit aboutir le chemin (les tâches initiales)

Résultat : tousLesSousGraphes : la liste des sous-graphes minimaux engendrés par les chemins de tousLesChemins

début

tousLesChemins ← liste vide chemin ←liste vide

rechercheChemins(from, to, chemin, tousLesChemins) retourner tousLesChemins

n

Algorithme 12  Recherche de chemins entre deux n÷uds dans le graphe ET/OU

Procédure rechercheChemins Données :

 courant : un n÷ud de type ET/OU

 destination : le n÷ud où doit aboutir le chemin  chemin : le chemin exploré jusqu'à présent  tousLesChemins : la liste des chemins recherchés

Résultat : calcul de tous les chemins possibles entre courant et destination début

ajouter courant à chemin si destination=courant alors

ajouter chemin à tousLesChemins et s'arrêter n

pour tout ls de prédécesseur(courant) faire

rechercheChemins(ls, destination, chemin, tousLesChemins) n

retirer le dernier élément de chemin n

Données :

 G : un graphe ET/OU

 tousLesChemins : une liste de chemins contenus dans G

Résultat :  tousLesSousGraphes : la liste des sous-graphes minimaux engendrés par les chemins de tousLesChemins

début

tousLesChemins ← nouvelle le d'attente remplie par les éléments de tousLesChemins

listeResultats ← liste vide

tant que tousLesSousGraphes est non vide faire chemin ← premier élément de la le (pop)

racine ← reconstruireGraphe(racine, chemin, tousLesSousGraphes) ajouter racine à listeResultats

n

retourner listeResultats n

Algorithme 14  Reconstruction des sous-graphes (chemins) dans le graphe initial

Plans admissibles Plans faisables

Propagation de contraintes

temporelles

Fig. 5.9  Génération de plans admissibles

& Washington 00] dans les plans faisables du graphe ET/OU qui a pour but de simplier la résolution d'un problème. Après la recherche de tous les plans possibles dans le graphe (plans faisables), des anements successifs éliminent des tâches voire des plans non admissibles à cause de la non-validité des contraintes temporelles quantitatives (par exemple, l'impossibilité d'exé-cuter une tâche pendant une durée possible quelconque si elle dépasse sa date de n). Ce ltrage évite de nombreuses tentatives de résolution vouées à l'échec.

Dénition 4 On appelle intervalle d'exécution d'une tâche t tout intervalle contenu dans la fenêtre d'exécution [I

t , It+] dont la largeur appartient à l'ensemble ∆t des durées d'exécution possibles.

5.2. Génération de plans temporellement admissibles 87 Fonction reconstruireGraphe

Données :

 graphe : le graphe de départ (où l'on cherche les chemins)  courant : le n÷ud courant

 le : la le d'attente des graphes encore à reconstruire

Résultat : n÷udReconstruit : le n÷ud à la racine du graphe engendré par le n÷ud courant et respectant les contraintes du graphe initial

début

résultat ← nouveau n÷ud

si courant est un n÷ud ET alors

pour tout ls de prédécesseur(courant) faire n

n

← reconstruireGraphe(graphe, ls) ajouter n aux prédécesseurs de résultat n

si courant est un n÷ud OU alors cheminContientUnFils ← FAUX

pour tout ls de prédécesseur(courant) faire si chemin contient ls alors

cheminContientUnFils ← VRAI n

n

si (cheminContientUnFils = VRAI) ou (nombre de prédécesseurs de courant=1) alors

n1 ← reconstruireGraphe(ls, graph) ajouter n1 aux prédécesseurs de résultat sinon

pour tout ls1 de prédécesseur(courant) faire g1 = copie du graphe

newCourant ← l'équivalent de courant dans g1

retirer tous les prédécesseurs de newCourant, sauf l'équivalent de ls1 ajouter g1 à la n de la le d'attente

retourner NULL n n n retourner résultat n

Soit la tâche t, nous désignons par st (respectivement et) une date de début d'exécution possible de t (respectivement une date de n d'exécution possible de t), par St (respectivement Et) l'ensemble de dates de début d'exécution possibles de t (respectivement l'ensemble de dates de n d'exécution possibles de t) et par I l'ensemble des intervalles d'exécution possibles durant lesquels t peut s'exécuter. La diérence entre une fenêtre temporelle et un intervalle d'exécution est qu'une fenêtre temporelle d'une tâche t représente la distance entre sa date de début au plus tôt I

t et sa date de début au plus tard I+

t et dont les durées d'exécution possibles sont inférieures ou égales à cette distance, tandis qu'un intervalle d'exécution de t commence par une date de début possible st≥ It et se termine par une date de n possible et ≤ It+ et s'exécute pendant une durée bien déterminée di

t ∈ ∆t. Une fenêtre temporelle est un intervalle d'exécution si la durée d'exécution possible di

t∈ ∆t est égale à I+

t − It. Tous les intervalles d'exécution doivent être à l'intérieure de la fenêtre temporelle de la tâche correspondante c.-à-d. que dans tous les cas, une fenêtre temporelle contient un intervalle d'exécution. La gure 5.10, représente les quatre

Intervalles d’exécution 4. 3. 2. 1. st st st st et et et et Date de n (I+ t ) Fenêtre temporelle Date de début (I− t )

Fig. 5.10  Possibilités de position d'un intervalle d'exécution par rapport à une fenêtre tempo-relle

possibilités de position d'un intervalle d'exécution [st, et] par rapport à la fenêtre temporelle [It, It+]d'une tâche t :

1. st= It et et< It+, 2. st> It et et< It+, 3. st> It et et= It+,

4. st= It et et= It+ (It+− It= dit).

L'exécution des tâches peut se faire en parallèle (en partie ou au total) ou en séquentiel. Cela dépend des contraintes temporelles qualitatives (précédence) et aussi de la position des tâches dans le graphe. Deux tâches successeurs dans le graphe doivent absolument s'exécuter l'une après l'autre même si la fenêtre temporelle de l'une contient, intercale ou chevauche celle de l'autre.

5.2. Génération de plans temporellement admissibles 89 Dans ce qui suit, nous décrivons la méthode de calcul des intervalles d'exécution pour chaque tâche d'un plan faisable. Ceux-ci sont calculés avant le début d'exécution eective des tâches. Nous utilisons un algorithme basé sur une propagation temporelle dans le graphe ET/OU [

Bre-sina & Washington 00]. Cette propagation organise le graphe en plusieurs niveaux : l0contient

les tâches initiales du graphe, l1 contient toutes les tâches qui succèdent directement aux tâches du niveau l0 et li contient toutes les tâches qui succèdent directement aux tâches du niveau li−1. Les feuilles sont les n÷uds qui n'ont pas de successeurs. Pour chaque tâche d'un niveau donné li, nous calculons tous les intervalles d'exécution possibles en tenant compte des contraintes temporelles de la tâche et des contraintes temporelles de ses prédécesseurs.