Je regardais ce que faisaient les gars du concours Mario AI et certains d'entre eux ont construit de très bons robots Mario en utilisant l'algorithme de cheminement A * (A-Star).
( Vidéo de Mario A * Bot en action )
Ma question est la suivante: comment A-Star se compare-t-il à Dijkstra? En regardant par-dessus eux, ils semblent similaires.
Pourquoi quelqu'un utiliserait-il l'un sur l'autre? Surtout dans le contexte du cheminement dans les jeux?
Réponses:
Dijkstra est un cas particulier pour A * (lorsque l'heuristique est nulle).
la source
Dijkstra:
Il dispose d' une fonction de coût, ce qui est une réelle valeur des coûts de la source à chaque nœud:
f(x)=g(x)
.Il trouve le chemin le plus court de la source à tous les autres nœuds en ne considérant que le coût réel.
Une recherche:
Il a deux fonctions de coût.
g(x)
: même que Dijkstra. Le coût réel pour atteindre un nœudx
.h(x)
: coût approximatif d'un nœudx
à l'autre. C'est une fonction heuristique. Cette fonction heuristique ne doit jamais surestimer le coût. Cela signifie que le coût réel pour atteindre le nœud d'objectif à partir du nœudx
doit être supérieur ou égalh(x)
. C'est ce qu'on appelle l'heuristique admissible.Le coût total de chaque nœud est calculé par
f(x)=g(x)+h(x)
Une recherche * ne développe un nœud que si cela semble prometteur. Il se concentre uniquement pour atteindre le nœud cible à partir du nœud actuel, et non pour atteindre tous les autres nœuds. Il est optimal, si la fonction heuristique est admissible.
Donc, si votre fonction heuristique est bonne pour estimer le coût futur, vous devrez explorer beaucoup moins de nœuds que Dijkstra.
la source
Ce que l'affiche précédente a dit, et parce que Dijkstra n'a pas d'heuristique et à chaque étape, il choisit les arêtes avec le moindre coût, il a tendance à "couvrir" une plus grande partie de votre graphique. Pour cette raison, Dijkstra pourrait être plus utile que A *. Un bon exemple est lorsque vous avez plusieurs nœuds cibles candidats, mais que vous ne savez pas lequel est le plus proche (dans le cas A *, vous devrez l'exécuter plusieurs fois: une fois pour chaque nœud candidat).
la source
L'algorithme de Dijkstra ne serait jamais utilisé pour la recherche de chemin. Utiliser A * est une évidence si vous pouvez trouver une heuristique décente (généralement facile pour les jeux, en particulier dans les mondes 2D). En fonction de l'espace de recherche, l'approfondissement itératif A * est parfois préférable car il utilise moins de mémoire.
la source
Dijkstra est un cas particulier pour A *.
Dijkstra trouve les coûts minimaux du nœud de départ à tous les autres. A * trouve le coût minimum du nœud de départ au nœud d'objectif.
L'algorithme de Dijkstra ne serait jamais utilisé pour la recherche de chemin. En utilisant A *, on peut trouver une heuristique décente. En fonction de l'espace de recherche, le A * itératif est préférable car il utilise moins de mémoire.
Le code de l'algorithme de Dijkstra est:
Le code de l'algorithme A * est:
la source
Dijkstra trouve les coûts minimaux du nœud de départ à tous les autres. A * trouve le coût minimum du nœud de départ au nœud d'objectif.
Par conséquent, il semblerait que Dijkstra serait moins efficace lorsque tout ce dont vous avez besoin est la distance minimale d'un nœud à un autre.
la source
Vous pouvez considérer A * comme une version guidée de Dijkstra. Cela signifie qu'au lieu d'explorer tous les nœuds, vous utiliserez une heuristique pour choisir une direction.
Pour le dire plus concrètement, si vous implémentez les algorithmes avec une file d'attente prioritaire, la priorité du nœud que vous visitez sera fonction du coût (coût des nœuds précédents + coût pour arriver ici) et de l'estimation heuristique d'ici au but. À Dijkstra, la priorité n'est influencée que par le coût réel des nœuds. Dans les deux cas, le critère d'arrêt atteint l'objectif.
la source
L'algorithme de Dijkstra trouve définitivement le chemin le plus court. D'autre part, A * dépend de l'heuristique. Pour cette raison, A * est plus rapide que l'algorithme de Dijkstra et donnera de bons résultats si vous avez une bonne heuristique.
la source
Si vous regardez le psuedocode pour Astar:
Considérant que, si vous regardez la même chose pour Dijkstra :
Donc, le fait est qu'Astar n'évaluera pas un nœud plus d'une fois,
car il pense que regarder un nœud une fois est suffisant, en raison
de son heuristique.
OTOH, l'algorithme de Dijkstra n'hésite pas à se corriger, au cas où
un nœud réapparaît.
Ce qui devrait rendre Astar plus rapide et plus adapté à la recherche de chemin.
la source
Dans A *, pour chaque nœud, vous vérifiez les connexions sortantes pour leur.
Pour chaque nouveau nœud, vous calculez le coût le plus bas jusqu'à présent (csf) en fonction des poids des connexions à ce nœud et des coûts que vous avez dû atteindre le nœud précédent.
En outre, vous estimez le coût du nouveau nœud au nœud cible et l'ajoutez au csf. Vous avez maintenant le coût total estimé (etc.). (etc = csf + distance estimée à la cible) Ensuite, vous choisissez parmi les nouveaux nœuds celui avec le plus bas, etc.
Faites la même chose que précédemment jusqu'à ce que l'un des nouveaux nœuds soit la cible.
Dijkstra fonctionne presque de la même manière. Sauf que la distance estimée à la cible est toujours de 0, et l'algorithme s'arrête d'abord lorsque la cible n'est pas seulement l'un des nouveaux nœuds , mais aussi celui avec le csf le plus bas.
A * est généralement plus rapide que dijstra, bien que ce ne soit pas toujours le cas. Dans les jeux vidéo, vous préférez souvent l'approche «assez proche pour un jeu». Par conséquent, le chemin optimal "assez proche" de A * suffit généralement.
la source
L'algorithme de Dijkstra est définitivement complet et optimal pour que vous trouviez toujours le chemin le plus court. Cependant, cela a tendance à prendre plus de temps car il est principalement utilisé pour détecter plusieurs nœuds de but.
A* search
d'autre part, les valeurs heuristiques, que vous pouvez définir pour atteindre votre objectif plus près, comme la distance de Manhattan par rapport à l'objectif. Il peut être optimal ou complet, ce qui dépend de facteurs heuristiques. c'est nettement plus rapide si vous n'avez qu'un seul nœud d'objectif.la source