A* en Théorie des Graphes

Introduction

  • A* est un algorithme de recherche du plus court chemin dans un graphe.

  • Il combine le coût réel et une estimation heuristique pour garantir l'optimalité.

  • Utilisé en mathématiques pour prouver l'existence de chemins optimaux lorsque l'heuristique est admissible et cohérente.

Composants Mathématiques

  • g(n) : Coût réel du chemin depuis le sommet de départ jusqu'au sommet n.

  • h(n) : Estimation (heuristique) du coût minimal pour aller de n au sommet objectif.

  • f(n) = g(n) + h(n) : Fonction de coût total que l'algorithme cherche à minimiser.

Fonctionnement et Propriétés

  1. Initialiser la liste ouverte avec le sommet de départ, avec f(start)=h(start).

  2. Sélectionner le sommet n ayant le plus petit f(n) dans la liste ouverte.

  3. Si n est le sommet objectif, reconstruire le chemin optimal.

  4. Sinon, déplacer n dans la liste fermée et pour chaque voisin v de n :

    • Calculer g(v) = g(n) + coût(n, v) et f(v) = g(v) + h(v).

    • Si v n'est pas déjà exploré ou si ce nouveau chemin est meilleur, mettre à jour ses valeurs et noter n en tant que prédécesseur.

  5. Répéter tant que la liste ouverte n'est pas vide.

Propriétés Mathématiques

  • Optimalité : A* donne une solution optimale si h(n) est admissible (jamais surestime le coût réel) et cohérente.

  • Complexité : Dépend du choix de l'heuristique et de la structure du graphe.

  • Remarque : L'algorithme résout le problème de chemin le plus court dans un graphe pondéré à poids non négatifs.

Pseudo-code

Initialiser open_list avec le sommet départ (f = h)
Tant que open_list n'est pas vide :
    n = sommet avec le plus petit f(n) dans open_list
    Si n est l'objectif :
         Retourner chemin reconstruit à partir des prédécesseurs
    Déplacer n de open_list à closed_list
    Pour chaque voisin v de n :
         g(v) = g(n) + coût(n, v)
         f(v) = g(v) + h(v)
         Si v n'est pas dans open_list ou g(v) est amélioré :
              Mettre à jour g(v), f(v) et prédécesseur de v
              Ajouter v à open_list si nécessaire