Intelligence artificielle

Algorithme de recherche A* en IA : le guide complet

A* est la recherche informée vers laquelle se tourne tout cours d'IA dès que le parcours en largeur atteint ses limites. Ce guide couvre la fonction d'évaluation f(n) = g(n) + h(n), l'article de 1968 qui l'a introduite, les heuristiques admissibles et cohérentes, la preuve d'optimalité, la complexité et les cas où A* se trompe sans prévenir.

20 Min de lecture Mis à jour : Septembre 2026 Niveau intermédiaire
Mohammed Islam Hadjoudj
Mohammed Islam Hadjoudj
Expert Operations Research Engineer

1. Qu'est-ce que l'algorithme de recherche A* ?

A* (prononcé « A étoile ») est un algorithme de recherche dans les graphes de type meilleur d'abord, qui trouve un chemin de coût minimal entre un nœud de départ et un nœud but. En intelligence artificielle, on le classe parmi les algorithmes de recherche informée : contrairement au parcours en largeur ou à la recherche à coût uniforme, qui ne connaissent que ce qui a déjà été payé, A* utilise aussi une estimation de ce qui reste à parcourir.

Chaque nœud que A* conserve dans sa frontière porte trois nombres :

L'algorithme développe à chaque étape le nœud de la frontière dont la valeur f est la plus petite. Cette seule règle produit la propriété qui a fait la célébrité de A* : si l'heuristique ne surestime jamais le coût restant réel, le premier nœud but que A* retire de la frontière se trouve sur un chemin optimal.

Rien dans cette définition ne parle de grilles ni de jeux vidéo. A* est défini sur n'importe quel graphe pondéré à coûts d'arêtes positifs ou nuls. Le graphe peut être un réseau routier, une carte en tuiles, l'espace d'états d'un taquin, l'espace des configurations d'un robot ou l'ensemble des plans partiels d'un planificateur automatique. La recherche de chemin sur grille est simplement l'image la plus facile à dessiner, et elle est traitée dans le guide compagnon consacré à la recherche de chemin A* sur grille.

Trois copies de la même carte en grille, avec une zone de terrain lent coûtant 6 par case entre le départ et le but. À gauche, f égale g avec h égal à zéro, intitulé recherche à coût uniforme et Dijkstra : 196 cases ombrées, coût du chemin 22, optimal. Au centre, f égale g plus h, intitulé A étoile : 95 cases ombrées, coût du chemin 22, optimal. À droite, f égale h seul, intitulé recherche gloutonne meilleur d'abord : seulement 17 cases ombrées, mais le chemin traverse tout droit le terrain lent et coûte 46 au lieu de 22.
A* est moins une invention à part qu'un curseur. Mettez h à zéro et vous obtenez Dijkstra, optimal mais qui explore deux fois plus. Supprimez g et vous obtenez la recherche gloutonne meilleur d'abord, qui n'explore presque rien et renvoie un chemin de coût 46 là où 22 était possible. Gardez les deux et vous obtenez le juste milieu informé.

2. D'où vient A* : Hart, Nilsson et Raphael (1968)

Peter E. Hart, Nils J. Nilsson et Bertram Raphael, chercheurs au Stanford Research Institute, ont publié "A Formal Basis for the Heuristic Determination of Minimum Cost Paths" dans IEEE Transactions on Systems Science and Cybernetics, volume 4, numéro 2, pages 100 à 107, juillet 1968. La motivation pratique était Shakey, le robot mobile du SRI, qui devait planifier lui-même son itinéraire à travers une série de pièces au lieu de suivre un parcours prédéfini.

Deux apports de cet article définissent encore le sujet :

  1. Il a séparé la procédure de recherche des connaissances qu'elle utilise. La même boucle devient un algorithme différent selon la fonction h qu'on lui fournit. La stratégie de recherche est devenue un paramètre plutôt qu'une décision de conception.
  2. Il a démontré les garanties. Si h ne surestime jamais le coût restant réel, la procédure renvoie un chemin de coût minimal. Un résultat complémentaire a montré qu'aucun autre algorithme disposant de la même information heuristique ne peut développer moins de nœuds tout en garantissant l'optimalité.

Le nom est une notation qui est restée. L’article de 1968 marque d’une étoile les quantités optimales : g* est le coût minimal du départ à un sommet, h* le coût minimal de ce sommet jusqu’à un but, et f* leur somme. La procédure nue s’appelle A, et A* en est la version qui atteint ces quantités, celle dont l’heuristique ne surestime jamais h*. Ce n’est pas une abréviation et cela ne veut rien dire d’autre.

Une note de 1972 parue dans la SIGART Newsletter a corrigé l'argument d'optimalité d'origine. La preuve de 1968 reposait sur ce que les auteurs appelaient l'hypothèse de cohérence, et la correction a précisé ce qui doit changer lorsqu'une heuristique est admissible sans être cohérente : les nœuds déjà développés doivent pouvoir être rouverts. Cette distinction fait l'objet de la section 6 ci-dessous, et plus de cinquante ans plus tard, elle reste la cause la plus fréquente d'implémentations de A* silencieusement fausses.

Si c'est une citation qui vous amène ici : Hart, P. E., Nilsson, N. J., et Raphael, B. (1968). "A Formal Basis for the Heuristic Determination of Minimum Cost Paths." IEEE Transactions on Systems Science and Cybernetics 4(2), 100 à 107.

3. La fonction d'évaluation f(n) = g(n) + h(n)

Tout ce que fait A* découle de la façon dont il ordonne sa frontière. La fonction d'évaluation sépare l'estimation d'une solution en une partie connue exactement et une partie devinée :

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

g(n)   coût déjà payé         exact, mesuré le long du chemin effectivement suivi
h(n)   coût restant à payer   estimé par la fonction heuristique
f(n)   estimation totale      la valeur selon laquelle la file de priorité trie

L'intérêt de cette conception est qu'un seul composant contrôle tout le comportement de la recherche :

Lisez cette liste comme une échelle du degré de confiance accordé à l'estimation. A* se situe au milieu et consacre un effort proportionnel à ce que l'heuristique ignore : une heuristique précise produit une recherche qui ressemble à une ligne droite, une heuristique faible une recherche qui ressemble à Dijkstra.

4. Comment A* s'exécute, pas à pas

La frontière est une file de priorité, traditionnellement appelée OPEN, ordonnée selon f. Une table des meilleures valeurs g connues et une table de pointeurs vers les parents complètent l'état.

function a_star(start, goal, h):
    open   = priority queue ordered by f        # la frontière
    g      = map with default infinity          # meilleur coût connu depuis le départ
    parent = map                                # pour reconstruire le chemin

    g[start] = 0
    open.push(start, h(start))

    while open is not empty:
        current = open.pop_min()                # nœud de plus petit f
        if current == goal:
            return reconstruct(parent, goal)    # test du but à la sortie, pas à la génération

        for (next, cost) in edges(current):
            tentative = g[current] + cost
            if tentative < g[next]:             # un chemin moins cher vers next
                g[next]      = tentative
                parent[next] = current
                open.push_or_update(next, tentative + h(next))

    return failure                              # le but est inaccessible

Quatre détails d'implémentation concentrent l'essentiel de la subtilité :

5. Un exemple détaillé sur un graphe pondéré

Les animations sur grille masquent l'arithmétique. Voici un petit graphe pondéré, du type utilisé dans les cours d'IA, déroulé à la main du début à la fin.

Six nœuds : S (départ), A, B, C, D et G (but). Les coûts des arêtes sont des distances routières, et l'heuristique h est la distance à vol d'oiseau jusqu'à G, ce qui la rend admissible : une ligne droite n'est jamais plus longue qu'une route.

Arêtes (non orientées, coût)  Heuristique h(n)
S-A  4      A-C  5            S = 11    C = 5
S-B  3      A-D  12           A =  9    D = 3
S-G  20     B-D  7            B =  8    G = 0
C-G  6      D-G  3
Un graphe pondéré à six nœuds. S est relié à A avec un coût de 4, à B avec un coût de 3 et directement à G avec un coût de 20. A est relié à C avec un coût de 5 et à D avec un coût de 12. B est relié à D avec un coût de 7. C est relié à G avec un coût de 6 et D à G avec un coût de 3. Chaque nœud porte sa valeur heuristique : S vaut 11, A 9, B 8, C 5, D 3 et G 0. Le chemin S, B, D, G est mis en évidence comme chemin optimal de coût 13.
Le graphe d'exemple. L'arête directe coûteuse de S à G existe précisément pour montrer pourquoi le test du but doit attendre qu'un nœud sorte de la file.

A* sort le nœud dont la valeur f est la plus petite, en départageant les égalités au profit du plus petit h, règle de départage standard car elle favorise les nœuds proches du but :

ÉtapeSortighfFrontière après l'étape
1S01111B 11, A 13, G 20
2B3811A 13, D 13, G 20
3D10313G 13 (amélioré depuis 20), A 13
4G13013but sorti, fin de la recherche

La réponse est S → B → D → G pour un coût de 13. Trois points de cette trace méritent qu'on s'y arrête :

6. Heuristiques admissibles et cohérentes

Deux propriétés de h méritent d'être soigneusement distinguées, car on les emploie souvent comme si elles étaient identiques, ce qui n'est pas le cas.

Admissibilité

Une heuristique est admissible si elle ne surestime jamais :

h(n) <= h*(n)   pour tout nœud n
                où h*(n) est le vrai coût minimal de n à un but

L'admissibilité, c'est de l'optimisme. L'heuristique peut se tromper énormément, du moment qu'elle se trompe par défaut. h = 0 est admissible, et c'est pourquoi Dijkstra est un cas particulier de A* plutôt qu'un rival.

Cohérence, aussi appelée monotonie

Une heuristique est cohérente si elle satisfait une inégalité triangulaire le long de chaque arête :

h(n) <= cost(n, n') + h(n')   pour toute arête de n vers n'
h(goal) = 0

Autrement dit : faire un pas ne peut jamais réduire votre estimation de plus que ce que ce pas a réellement coûté. La cohérence est la propriété la plus forte. Toute heuristique cohérente est admissible ; la réciproque est fausse.

La conséquence pratique est précise. Lorsque h est cohérente, f ne décroît jamais le long d'un chemin, donc la première fois que A* sort un nœud, sa valeur g est déjà optimale. C'est ce qui autorise l'optimisation bien connue consistant à placer les nœuds développés dans un ensemble fermé et à ne plus jamais les examiner.

Lorsque h est seulement admissible, cette autorisation tombe. Un chemin moins cher vers un nœud déjà développé peut encore être découvert, et si l'implémentation refuse de le rouvrir, la réponse finale peut être fausse. Voici un graphe où c'est exactement ce qui se produit :

Un graphe orienté à cinq nœuds servant de contre-exemple. S mène à A avec un coût de 1 et à B avec un coût de 2. A mène à C avec un coût de 1 et B mène à C avec un coût de 1. C mène à G avec un coût de 10. Les valeurs heuristiques sont S égal à 0, A égal à 11, B égal à 5, C égal à 0 et G égal à 0. Toutes sont admissibles, mais l'arête de A vers C viole la cohérence car 11 est supérieur à 1 plus 0. Une implémentation avec ensemble fermé renvoie le chemin S B C G de coût 13 au lieu du chemin optimal S A C G de coût 12.
Chaque valeur heuristique est ici admissible, et pourtant une implémentation qui refuse de rouvrir les nœuds fermés renvoie un chemin de coût 13 alors qu'il en existe un de coût 12.
Arêtes (orientées, coût)   Heuristique h(n)   Coût réel h*(n)
S -> A   1                 S =  0             S = 12
S -> B   2                 A = 11             A = 11
A -> C   1                 B =  5             B = 11
B -> C   1                 C =  0             C = 10
C -> G  10                 G =  0             G =  0

Chaque h(n) <= h*(n), donc l'heuristique est admissible.
L'arête A -> C viole la cohérence : h(A) = 11 > cost(A,C) + h(C) = 1.

Déroulons : A* sort S (f = 0) et génère A avec f = 1 + 11 = 12 et B avec f = 2 + 5 = 7. Il sort B (f = 7) et génère C avec g = 3, f = 3. Il sort C (f = 3), le ferme avec g = 3 et génère G avec f = 13. Ce n'est qu'ensuite qu'il sort A (f = 12) et découvre un chemin vers C qui ne coûte que 2. Si C est fermé et que fermé signifie définitif, cette découverte est ignorée et l'algorithme renvoie 13 au lieu de l'optimum 12.

Deux issues, et il faut en choisir une en connaissance de cause : prouver que votre heuristique est cohérente et conserver l'optimisation de l'ensemble fermé, ou écrire la relaxation sous la forme tentative < g[next] sans test d'ensemble fermé, pour que la réouverture se fasse d'elle-même. Bonne nouvelle : presque toutes les heuristiques utilisées en pratique, dont la distance à vol d'oiseau, la distance de Manhattan sur une grille à coût uniforme et toute heuristique dérivée d'un problème relâché, sont cohérentes. C'est précisément pourquoi ce bogue peut survivre des années avant qu'une carte inhabituelle ne le révèle.

7. Pourquoi A* est optimal, et quand il ne l'est pas

L'argument d'optimalité est assez court pour se retenir, et il mérite d'être connu, car il indique exactement quelle hypothèse vérifier lorsque A* se comporte mal.

Soit C* le coût d'une solution optimale. Supposons que A* soit sur le point de sortir un nœud but G2 atteint par un chemin sous-optimal, de sorte que g(G2) > C*. Puisque h(G2) = 0, sa priorité vaut f(G2) = g(G2) > C*. Considérons maintenant un chemin optimal quelconque entre le départ et un véritable but optimal. Juste avant la sortie, ce chemin doit compter au moins un nœud n dans la frontière, car le départ a été développé et le but non. Pour ce nœud, g(n) est le coût optimal pour l'atteindre et, comme h est admissible, f(n) = g(n) + h(n) <= g(n) + h*(n) = C*. Donc f(n) <= C* < f(G2), et A* aurait sorti n en premier. Cette contradiction prouve que le premier but sorti est optimal.

Le même raisonnement donne les conditions dans lesquelles la garantie tombe :

Un dernier résultat complète la théorie. Dechter et Pearl ont démontré en 1985 que A* est optimalement efficace : aucun autre algorithme optimal utilisant la même information heuristique n'est assuré de développer moins de nœuds. Tout nœud tel que f(n) < C* doit être développé par un tel algorithme, et A* développe exactement ceux-là, plus un sous-ensemble des nœuds situés exactement à f(n) = C*. Il n'y a pas d'ordonnancement plus astucieux à trouver ; le seul levier restant est une meilleure heuristique.

8. Complexité en temps et en espace

La valeur des manuels est O(bd), où b est le facteur de branchement et d la profondeur de la solution optimale, et ce chiffre est honnête mais peu informatif. L'énoncé plus précis porte sur l'erreur de l'heuristique. Le nombre de nœuds développés par A* croît exponentiellement, sauf si l'erreur de l'heuristique est bornée logarithmiquement par rapport au vrai coût :

|h(n) - h*(n)| <= O(log h*(n))

Presque aucune heuristique utilisée en pratique ne franchit ce seuil, la lecture honnête est donc que A* est exponentiel dans le pire cas et qu'une bonne heuristique réduit la base de l'exposant plutôt que de le supprimer. Sur un graphe explicite déjà en mémoire, le décompte est le même que pour Dijkstra : O(E log V) avec un tas binaire, puisque chaque arête déclenche au plus une mise à jour de la file. La question intéressante n'est pas la borne, mais la faible part de ces V et E que la recherche touche réellement.

La mémoire est la contrainte qui pèse vraiment. A* garde en mémoire chaque nœud généré, la frontière comme l'ensemble exploré, si bien que sa complexité en espace égale sa complexité en temps. Les systèmes réels manquent de RAM bien avant de manquer de patience. Ce seul fait explique toute la famille de variantes présentée en section 11 : A* à approfondissement itératif, A* simplifié à mémoire bornée et troncatures de type faisceau existent tous pour échanger l'optimalité ou du travail répété contre une frontière qui tient en mémoire.

9. Comment concevoir une bonne heuristique

Puisque l'algorithme est fixé et d'une efficacité démontrée, tout le travail d'ingénierie se concentre dans h. Il existe une recette fiable pour en construire une.

Relâcher le problème

Prenez le vrai problème, supprimez une contrainte et résolvez exactement ce qui reste. Le coût exact d'un problème relâché est toujours un minorant du coût réel, l'heuristique est donc admissible par construction, et comme une solution relâchée peut se construire pas à pas, elle est aussi cohérente.

Le taquin à 8 pièces est l'illustration classique. Une pièce peut glisser vers la case vide adjacente. En supprimant des contraintes, on obtient deux heuristiques classiques :

Les deux sont admissibles. La différence en pratique est spectaculaire : sur des instances aléatoires du taquin nécessitant 12 coups, la comparaison classique rapportée par Russell et Norvig montre une recherche en profondeur itérative générant de l'ordre de 3,6 millions de nœuds, A* avec h1 quelques centaines, et A* avec h2 moins d'une centaine. À la profondeur 24, l'écart se creuse : environ 39 000 nœuds pour h1 contre environ 1 600 pour h2. Même algorithme, même code, mais une autre fonction h.

Préférer une heuristique dominante

Si h2(n) >= h1(n) pour tout nœud et que les deux sont admissibles, alors h2 domine h1, et A* avec h2 ne développe jamais plus de nœuds. Plus grand, c'est mieux, jusqu'au plafond h*. C'est pourquoi la distance de Manhattan bat les pièces mal placées : elle est toujours au moins aussi grande et ne surestime jamais.

Combiner plusieurs heuristiques

Si vous disposez de plusieurs heuristiques admissibles dont aucune ne domine les autres, prenez leur maximum. Le maximum d'heuristiques admissibles est admissible et les domine toutes. Le prix est d'évaluer plusieurs fonctions par nœud, le gain doit donc être payé en temps d'évaluation.

Précalculer avec des bases de motifs

Pour un état but fixé, résolvez à l'avance des sous-problèmes de manière exhaustive et stockez les coûts exacts dans une table. Une base de motifs (pattern database) pour un sous-ensemble des pièces fournit un minorant admissible bien plus fort que n'importe quelle formule. C'est la même idée qui fait fonctionner le routage par points de repère sur les réseaux routiers continentaux : précalculer les distances exactes vers une poignée de repères, puis utiliser l'inégalité triangulaire pour borner le reste.

Sur une grille, choisir la métrique adaptée aux déplacements

Distance de Manhattan pour un déplacement dans 4 directions, euclidienne pour un déplacement selon n'importe quel angle, Tchebychev ou octile pour les grilles à 8 directions. Choisir une métrique qui accorde moins de liberté que les règles de déplacement rend l'heuristique non admissible et détruit discrètement la garantie d'optimalité. Le guide de recherche de chemin sur grille détaille les trois avec des calculs chiffrés.

10. A* vs Dijkstra, UCS, recherche gloutonne et BFS

Chacun de ces algorithmes est la même boucle avec une priorité différente. C'est la façon la plus utile de les retenir.

AlgorithmePriorité de la frontièreOptimal ?À utiliser quand
Parcours en largeurordre d'insertion (FIFO)Oui, si toutes les arêtes ont le même coûtGraphes non pondérés, nombre minimal de sauts
Recherche à coût uniforme / Dijkstraf = gOuiGraphe pondéré, sans estimation utile, ou nombreux buts à la fois
Recherche gloutonne meilleur d'abordf = hNonIl faut une solution rapidement et la qualité est négociable
A*f = g + hOui, si h est admissibleUn seul but, une estimation correcte existe, le chemin doit être le plus court
A* pondéréf = g + w × hÀ un facteur w prèsA* est trop lent et un détour borné est acceptable

L'intuition derrière la comparaison entre A* et Dijkstra est géométrique. Dijkstra développe tout ce qui vérifie g(n) < C*, ce qui, sur une carte dégagée, forme un cercle autour du départ. A* développe tout ce qui vérifie g(n) + h(n) < C*, ce qui forme une ellipse dont le départ et le but sont les foyers. Plus l'heuristique est précise, plus cette ellipse s'aplatit, jusqu'à se réduire au chemin lui-même. Les deux renvoient la même réponse optimale ; ils ne diffèrent que par la part de la carte qu'ils ont dû examiner pour en être sûrs. Pour une vue d'ensemble de la famille, consultez le panorama des algorithmes de plus court chemin, et pour les bases du parcours sur lesquelles tout repose, BFS vs DFS.

11. Les variantes de A* à connaître

Presque toutes les variantes connues répondent à l'une de deux contraintes : la mémoire, ou la nécessité de répondre avant d'avoir prouvé l'optimum.

12. Erreurs courantes dans les implémentations de A*

La plupart des bogues de A* ne font pas planter le programme. Ils renvoient un chemin un peu trop long, pour certaines entrées, parfois. Voici les causes récurrentes :

13. Où A* est réellement utilisé

A* a sa place partout où il faut trouver la meilleure suite de décisions dans un espace trop grand pour être énuméré :

Le schéma est toujours le même. Modélisez le problème comme un graphe, trouvez un minorant admissible du coût restant et laissez la file de priorité faire le reste.

14. Questions fréquentes

A* trouve-t-il toujours le plus court chemin ?

Oui, à trois conditions : l'heuristique est admissible (elle ne surestime jamais le coût restant), les coûts des arêtes sont positifs ou nuls, et l'implémentation teste le but quand un nœud sort de la file plutôt que lorsqu'il est généré. Si l'heuristique est admissible sans être cohérente, l'implémentation doit aussi autoriser la réouverture des nœuds déjà développés. Enfreignez l'une de ces conditions et A* renvoie toujours un chemin, mais rien ne garantit plus qu'il soit le moins cher.

Quelle est la différence entre A* et l'algorithme de Dijkstra ?

C'est le même algorithme avec des priorités différentes. Dijkstra ordonne sa frontière selon g(n), le coût déjà payé, et s'étend donc dans toutes les directions comme un cercle qui grandit. A* ordonne selon f(n) = g(n) + h(n), si bien que la région développée est une ellipse étirée du départ vers le but. Avec h(n) = 0, A* devient exactement Dijkstra. Dijkstra est le meilleur choix lorsqu'aucune estimation utile n'existe ou lorsqu'il faut les distances vers de nombreuses destinations à la fois ; A* est le meilleur choix pour une seule destination avec une estimation correcte disponible.

Quelle est la différence entre une heuristique admissible et une heuristique cohérente ?

Admissible signifie que h(n) n'est jamais supérieur au vrai coût restant h*(n). Cohérente, aussi appelée monotone, désigne l'inégalité triangulaire plus forte h(n) <= cost(n, n') + h(n') pour chaque arête, avec h(goal) = 0. Toute heuristique cohérente est admissible, mais pas l'inverse. La cohérence compte, car elle garantit que la première fois que A* sort un nœud, sa valeur g est déjà optimale, ce qui rend un ensemble fermé sûr. Avec une heuristique seulement admissible, un chemin moins cher vers un nœud fermé peut encore apparaître plus tard, et le nœud doit être rouvert.

Quelle est la complexité en temps et en espace de A* ?

Dans le pire cas, les deux sont en O(b^d), exponentielles en la profondeur de la solution. Le nombre de développements ne reste polynomial que si l'erreur de l'heuristique est bornée logarithmiquement, ce qui n'arrive presque jamais en pratique ; une meilleure heuristique réduit donc la base de l'exposant plutôt que de le supprimer. Sur un graphe explicite déjà en mémoire, A* se comporte comme Dijkstra, en O(E log V) avec un tas binaire. L'espace est la limite pratique : A* stocke chaque nœud qu'il génère, d'où l'existence de variantes à mémoire bornée comme IDA* et SMA*.

Pourquoi s'appelle-t-il A*, et est-ce un algorithme d'IA ou un algorithme de graphes ?

L’étoile est la notation que l’article de 1968 emploie pour les quantités optimales, comme dans g*, h* et f* : la procédure nue s’appelle A, et A* en est la version dont l’heuristique ne surestime jamais, si bien qu’elle renvoie un chemin de coût minimal. C'est à la fois un algorithme d'IA et un algorithme de graphes. On l'enseigne dans les cours d'IA comme la méthode canonique de recherche informée, et c'est un algorithme de plus court chemin sur les graphes pondérés. Ce n'est pas de l'apprentissage automatique : rien n'est entraîné et aucune donnée n'est ajustée. Toute la connaissance réside dans la fonction heuristique que vous fournissez, même si un modèle appris peut tout à fait servir à en fournir une.

A* est-il complet, et que se passe-t-il s'il n'existe aucun chemin ?

A* est complet sur un graphe à facteur de branchement fini dont les coûts d'arêtes sont minorés par une valeur strictement positive : si une solution existe, il la trouve. Lorsqu'aucun chemin n'existe, la frontière se vide après le développement de toute la composante accessible, et l'algorithme signale un échec. Ce cas d'échec est le plus coûteux, puisque prouver qu'il n'existe rien revient à explorer tout ce qui est accessible, ce qui justifie d'ajouter une vérification préalable de connexité sur les grandes cartes.

Regardez la frontière avancer

Exécutez Dijkstra sur votre propre graphe dans le visualiseur interactif. C'est A* avec h égal à zéro : ce que vous voyez se propager vers l'extérieur correspond exactement au travail qu'une bonne heuristique élimine.

Lancer le visualiseur

Pour aller plus loin

Regardez la frontière avancer

Exécutez Dijkstra sur votre propre graphe dans le visualiseur. C'est A* avec h égal à zéro : ce que vous voyez se propager vers l'extérieur correspond exactement au travail qu'une bonne heuristique élimine.

Lancer le visualiseur