Dév. de Jeux & IA

Algorithme de Recherche A* : Recherche de Chemin dans les Jeux et l'IA

Comment les PNJ naviguent-ils dans des labyrinthes complexes dans les jeux vidéo ? Pourquoi Google Maps est-il si rapide pour trouver votre itinéraire ? La réponse est presque toujours l'algorithme de recherche A* (A-Star). Découvrez la magie des heuristiques qui fait d'A* le roi de la recherche de chemin.

15 Min de lecture Mis à jour : Juin 2026 Niveau Intermédiaire
LGT
Learn Graph Theory Team
Expert Operations Research Engineers

1. Qu'est-ce que l'Algorithme A* ?

L'algorithme A* (prononcé "A-étoile" ou "A-Star") est un algorithme de parcours de graphe et de recherche de chemin qui est largement utilisé en informatique en raison de sa complétude, de son optimalité et de son efficacité optimale. Inventé en 1968 par Peter Hart, Nils Nilsson et Bertram Raphael du Stanford Research Institute, il a été conçu à l'origine pour aider le robot Shakey à naviguer dans des pièces.

Aujourd'hui, A* est la norme absolue de l'industrie pour le routage et la recherche de chemin (pathfinding). Qu'un personnage d'un jeu de stratégie marche sur une grille, ou qu'un GPS calcule le trajet le plus rapide à travers un pays, A* (ou une de ses variantes) fait probablement le gros du travail.

2. Le Problème avec l'Algorithme de Dijkstra

Pour comprendre pourquoi A* est brillant, nous devons d'abord comprendre ce qu'il améliore. Avant A*, la référence pour trouver le chemin le plus court était l'Algorithme de Dijkstra.

L'algorithme de Dijkstra est garanti pour trouver le chemin le plus court. Cependant, il est fondamentalement "aveugle". Lorsque vous demandez à Dijkstra de trouver un chemin de New York à Los Angeles, il explorera les routes menant à Boston, Miami et Chicago avec autant d'empressement qu'il explore les routes en direction de l'ouest. Il cherche vers l'extérieur en un cercle parfait (ou une sphère) dans toutes les directions de manière égale jusqu'à ce qu'il tombe accidentellement sur la cible.

Sur une grande carte, explorer toutes les directions possibles est incroyablement lent et gaspille d'énormes quantités de puissance de traitement. Nous avons besoin d'un algorithme suffisamment "intelligent" pour savoir dans quelle direction se trouve la cible, afin qu'il puisse donner la priorité à l'exploration des chemins qui se dirigent vers le but.

3. La Sauce Secrète : Les Heuristiques (f = g + h)

A* résout le problème de la "cécité" en introduisant une Heuristique. Une heuristique est une supposition éclairée. Dans la recherche de chemin, c'est une fonction qui estime à quelle distance un nœud se trouve de la destination finale.

A* attribue un score à chaque nœud qu'il découvre. Le nœud avec le score le plus bas est celui qu'il explore ensuite. L'équation de base d'A* est :

f(n) = g(n) + h(n)

En ajoutant la composante h(n), A* est attiré vers le but comme un aimant. Il ignorera les chemins qui vont dans la direction opposée au but, réduisant considérablement l'espace de recherche par rapport à l'algorithme de Dijkstra.

4. Choisir la Bonne Heuristique

La magie d'A* repose entièrement sur la précision de la fonction heuristique h(n). Si votre heuristique surestime la distance jusqu'au but, A* n'est plus garanti de trouver le chemin le plus court. S'il la sous-estime, il devient plus lent. Par conséquent, choisir la bonne heuristique pour votre jeu ou carte spécifique est critique.

Distance de Manhattan (Pour les Mondes en Grille sans Diagonales)

Si votre jeu utilise une grille (comme Pac-Man ou un roguelike traditionnel) et que les personnages ne peuvent se déplacer que vers le Haut, le Bas, la Gauche ou la Droite, vous devez utiliser la Distance de Manhattan. Elle calcule le nombre total de blocs horizontalement et verticalement entre le nœud actuel et la cible.

function heuristic(node, goal) {
    return abs(node.x - goal.x) + abs(node.y - goal.y)
}

Distance Euclidienne (Pour les Mondes Ouverts ou les Mouvements à N'importe quel Angle)

Si les personnages peuvent se déplacer dans n'importe quelle direction (ou si vous routez sur une carte continue), vous devez utiliser la Distance Euclidienne. C'est la distance en ligne droite "à vol d'oiseau" entre deux points, calculée à l'aide du théorème de Pythagore.

function heuristic(node, goal) {
    return sqrt((node.x - goal.x)^2 + (node.y - goal.y)^2)
}

Distance de Tchebychev (Pour les Mondes en Grille avec Diagonales)

Si votre jeu utilise une grille mais autorise le mouvement diagonal (où se déplacer en diagonale coûte le même prix que de se déplacer tout droit), vous utilisez la distance de Tchebychev. Elle prend le maximum des différences horizontales ou verticales.

function heuristic(node, goal) {
    return max(abs(node.x - goal.x), abs(node.y - goal.y))
}

Visualisez la Différence

Regardez Dijkstra et A* faire la course pour résoudre le même labyrinthe. Remarquez comment Dijkstra inonde la carte entière, tandis qu'A* crée un chemin concentré comme un laser directement vers la sortie.

Lancer le Visualiseur A*

5. Exécution Étape par Étape d'A*

Voici exactement comment l'algorithme maintient son état et traite les nœuds pendant l'exécution :

  1. Initialisation : Créez deux ensembles : un ensemble OPEN (nœuds à évaluer) et un ensemble CLOSED (nœuds déjà évalués). Ajoutez le nœud de départ à l'ensemble OPEN.
  2. Début de Boucle : Trouvez le nœud dans l'ensemble OPEN avec le coût f le plus bas. Appelons-le le nœud Current (Actuel).
  3. Vérification du But : Si le nœud Current est le but cible, vous avez terminé ! Suivez les pointeurs parents vers l'arrière pour reconstruire le chemin.
  4. Déplacer vers Closed : Supprimez le nœud Current de l'ensemble OPEN et ajoutez-le à l'ensemble CLOSED.
  5. Développer les Voisins : Regardez tous les voisins adjacents du nœud Current. Pour chaque voisin :
    • Si le voisin est un obstacle (mur) ou se trouve dans l'ensemble CLOSED, ignorez-le.
    • Calculez le coût g du voisin (g Actuel + distance jusqu'au voisin).
    • Si le voisin n'est pas dans l'ensemble OPEN, calculez ses coûts h et f, définissez son parent sur Current, et ajoutez-le à l'ensemble OPEN.
    • Si le voisin est déjà dans l'ensemble OPEN, vérifiez si ce nouveau chemin vers le voisin est meilleur (a un coût g plus bas). Si c'est le cas, mettez à jour son parent et son coût g.
  6. Répéter : Revenez à l'Étape 2. Si l'ensemble OPEN devient vide et que le but n'a pas été atteint, il n'y a pas de chemin valide.

6. Applications Réelles dans le Dév. de Jeux & l'IA

A* est l'épine dorsale du mouvement dans les espaces numériques.

Foire aux questions

Comment l'algorithme A* se distingue-t-il de celui de Dijkstra ?

A* utilise une fonction heuristique (estimant la distance vers le but) pour guider sa recherche de chemin, tandis que Dijkstra est aveugle et explore dans toutes les directions. Cela rend A* beaucoup plus rapide et ciblé.

Qu'est-ce qu'une heuristique admissible dans A* ?

Une heuristique admissible est une fonction qui ne surestime jamais le coût réel pour atteindre l'objectif. L'admissibilité garantit que A* trouvera le chemin le plus court.

Quand choisir la distance de Manhattan plutôt que la distance euclidienne ?

Utilisez la distance de Manhattan pour les grilles où le mouvement est limité à 4 directions (haut, bas, gauche, droite). Utilisez la distance euclidienne pour les environnements continus permettant un mouvement dans toutes les directions.

Exploration Supplémentaire

Maîtrisez la Recherche de Chemin

Lire sur A* est bien, mais construire des labyrinthes et regarder l'algorithme les résoudre est mieux. Dessinez des murs, définissez des points de départ et d'arrivée, et observez comment différentes heuristiques modifient le modèle de recherche en temps réel.

Lancer le Visualiseur A*