USTL Licence Informatique 2007–2008 UE Projet Logiciel L’algorithme A∗ L’algorithme A∗ permet la recherche d’une solution dans un graphe (espace) d’états à partir d’un état initial et en calculant un meilleur chemin vers cette solution. Cette notion de “meilleur” est dépendante d’une fonction de coût, le chemin calculé étant celui de coût le plus faible. On a la garantie que l’algorithme termine et que, s’il existe une solution, il n’y a pas de meilleur chemin que celui fourni par l’algorithme. Pour son calcul l’algorithme explore à partir de l’état initial l’espace des états possibles pour le problème considéré. Le graphe de cet espace est défini implicitement par un opérateur successeur permettant pour chaque état de connaı̂tre la liste des états qu’il permet d’atteindre. Comme indiqué précédemment, chacune des ces transitions est en plus valuée par un coût. successeur : Etat e → Etat∗ 7 → états atteignables depuis e cout : Etat, Etat → R e1 , e2 7→ coût de la transition de e1 vers e2 L’algorithme. Le principe de fonctionnement de l’algorithme est similaire à celui de l’algorithme de Dijkstra étudié au S4, avec en plus une estimation heuristique du coût du chemin restant à parcourir entre un état et un état solution1 . Pour que les propriétés de l’algorithme soient vérifiées, il est nécessaire et suffisant que cette estimation minore le coût réel (mais inconnu) de ce chemin. Dans le cas contraire, les propriétés de terminaison et de correction de l’algorithme sont conservées, mais pas celle de meilleur chemin (on parle alors d’alogorithme A). heuristique : Etat → R+ e 7→ coût estimé du chemin de e vers un état solution Donc lors de la recherche de solutions, on explore différents états et pour chaque état e on considère : • la valeur du chemin déjà parcouru depuis l’état initial ei pour atteindre e, cette valeur est connue précisément, elle résulte de la somme des coûts des transitions empruntées de ei à e. Appelée “terme standard” cette valeur est souvent notée gg(e). • la valeur heuristique, appelée “terme heuristique”, notée hh(e). On a hh(e) = heurstique(e). On additionne ces 2 termes pour attribuer la valeur, notée f f (e), d’un état e : f f (e) = gg(e) + hh(e) Le principe de l’algorithme, présenté à la page suivante, et de parcourir, en partant de ei , le graphe d’états, en sélectionnant à chaque étape l’un des états e de l’espace de recherche dont la valeur f f est minimale et en ajoutant à l’espace de recherche les successeurs de e. Un traitement garantit (seconde partie de l’algorithme) que, pour chaque état, l’on conserve le meilleur chemin permettant de l’atteindre à partir de ei . L’algortihme termine dès que l’on a atteint l’un des états solutions. Pour un même problème, il peut exister plusieurs fonctions heuristiques. Le choix de telle ou telle fonction influence le nombre d’états examinés par l’algorithme et donc sa rapidité mais, évidemment, pas son résultat. Si pour deux fonctions heuristiques hh1 et hh2 d’un même problème on a ∀e ∈ Etat, 0 ≤ hh1 (e) ≤ hh2 (e) (≤ coût réel) alors une recherche utilisant hh2 visitera nécessairement moins d’états qu’une autre utilisant hh1 (pour le même ei évidemment). On dit que hh2 est mieux informée. Ainsi l’heuristique constante hh = 0 est toujours possible mais peu (pas) informée et donc inintéressant en pratique. 1 Pour un problème donné, il peut parfois y avoir plusieurs solutions Les données. Pour un problème donnée, il faut connaı̂tre la définition d’un état (se représentation), l’opérateur successeur et la fonction cout ainsi que les états solution (ou une description de ceux-ci), fournis dans un ensemble Solutions. Pour un calcul particulier on doit fournir l’état initial ei ainsi que la fonction heuristique hh utilisée Algorithme A–A∗ Debut a–voir← {ei } deja–vus← {} gg(init) ← 0 pere(init)← nil trouve←faux tantQue a–voir n’est pas vide et trouve est faux faire meilleurs← ensemble des états de a–voir tel que f f est minimale si meilleurs est un singleton alors soit M l’unique élément de meilleurs sinon Si il y a des éléments de Solutions dans meilleurs alors soit M l’un d’eux sinon soit M un élément quelconque de meilleurs enlever M de a–voir et ajouter M à deja–vus si M appartient à Solutions alors trouve← vrai sinon générer l’ensemble fils des successeurs de M pour chaque N dans fils faire si N n’est ni dans a–voir ni dans deja–vus alors gg(N ) ← gg(M ) + cout(M, N ) f f (N ) ← gg(N ) + hh(N ) pere(N ) ← M ajouter N à a–voir finAlors sinon /* N est dans a–voir ou deja–vus */ soit P =pere(N ) compare ← [gg(M ) + cout(M, N )] − [gg(P ) + cout(P, N )] /* compare = différence en passant par M ou par P */ si compare< 0 alors /* si passage par M moins couteux que par P */ gg(N ) ← gg(N ) + compare f f (N ) ← f f (N ) + compare pere(N ) ← M si M est dans deja–vus alors inserer M dans a–voir et le supprimer de deja–vus finAlors finSinon finPour finSinon finTantQue si trouve est faux alors "Pas de solution" sinon calculer et afficher le chemin solution (récupérer les pere de M jusqu’à init) Fin NB : En programmation, ne pas confondre le nom d’un état et la valeur de ce état. Ainsi un test tel que “N est dans a–voir” se comprend en fait “la valeur de N est la valeur d’un des états de a–voir”.