web-dev-qa-db-fra.com

Différence et avantages entre dijkstra et une étoile

J'ai lu ceci: http://en.wikipedia.org/wiki/A*_search_algorithm

Il indique que A * est plus rapide que l'utilisation de dijkstra et utilise la recherche en premier lieu pour accélérer les choses.

Si j'ai besoin que l'algorithme s'exécute en millisecondes, quand A * devient-il le choix le plus important.

D'après ce que je comprends, il ne renvoie pas nécessairement les meilleurs résultats.

Si j'ai besoin de résultats rapides, est-il préférable de pré-calculer les chemins? Cela peut prendre des mégaoctets d'espace pour les stocker.

44
peppydip

Il indique que A * est plus rapide que l'utilisation de dijkstra et utilise la recherche en premier lieu pour accélérer les choses.

A * est fondamentalement une variation informée de Dijkstra.
Un * est considéré comme une "meilleure première recherche" car il choisit avidement le sommet à explorer ensuite, en fonction de la valeur de f(v) [f(v) = h(v) + g(v)] - où h est l'heuristique et g est le coût jusqu'à présent.

Notez que si vous utilisez une fonction heuristique non informative: h(v) = 0 pour chaque v: vous obtenez que A * choisit quel sommet développer ensuite en fonction du "coût jusqu'à présent" (g(v)) uniquement, identique à l'algorithme de Dijkstra - donc si h(v) = 0, A * est par défaut l'algorithme de Dijkstra.

Si j'ai besoin que l'algorithme s'exécute en millisecondes, quand A * devient-il le choix le plus important.

Pas tout à fait, cela dépend de beaucoup de choses. Si vous avez une fonction heuristique de descente - d'après mon expérience personnelle, le plus gourmand en premier (en choisissant uniquement en fonction de la fonction heuristique) - est généralement beaucoup plus rapide que A * (mais n'est même pas presque optimal).

D'après ce que je comprends, il ne renvoie pas nécessairement les meilleurs résultats.

Un * est à la fois complet (trouve un chemin s'il en existe un) et optimal (trouve toujours le chemin le plus court) si vous utilisez fonction heuristique admissible . Si votre fonction n'est pas admissible - tous les paris sont désactivés.

Si j'ai besoin de résultats rapides, est-il préférable de pré-calculer les chemins? Cela peut prendre des mégaoctets d'espace pour les stocker.

Il s'agit d'une optimisation courante effectuée sur certains problèmes, par exemple sur le problème de 15 casse-tête , mais elle est plus avancée. Un chemin du point A au point B est appelé une macro. Certains chemins sont très utiles et doivent être mémorisés. Un composant Machine Learning est ajouté à l'algorithme afin d'accélérer les choses en se souvenant de ces macros.

Notez que le chemin du point A au point B ici n'est généralement pas sur le graphique des états - mais dans le problème lui-même (par exemple, comment déplacer un carré de la ligne la plus basse à la ligne supérieure ...)

Pour accélérer les choses:
Si vous avez une heuristique et que vous la trouvez trop lente, et que vous voulez une solution plus rapide, même si elle n'est pas optimale - A * Epsilon est généralement plus rapide que A *, tout en vous donnant un lié à l'optimalité du chemin (à quel point il est proche d'être optimal).

59
amit

Dijkstra est un cas particulier pour A * (lorsque l'heuristique est nulle).

Une recherche:

Il a deux fonctions de coût.

g(n): same as Dijkstra. The real cost to reach a node n.
h(n): approximate cost from node n to goal node. It is a heuristic function. This heuristic function should never overestimate the cost. That means, the real cost to reach goal node from node n should be greater than or equal h(n). It is called admissible heuristic.

Le coût total de chaque nœud est calculé par f (n) = g (n) + h (n)

Dijkstra:

Il a une fonction de coût, qui est la valeur du coût réel de la source à chaque nœud: f (n) = g (n) Il trouve le chemin le plus court de la source à tous les autres nœuds en considérant uniquement le coût réel.

11

A * est exactement comme Dijkstra, la seule différence est que A * essaie de chercher un meilleur chemin en utilisant une fonction heuristique qui donne la priorité aux nœuds qui sont censés être mieux que d'autres tandis que Dijkstra explore simplement tous les chemins possibles.

Son optimalité dépend de la fonction heuristique utilisée, donc oui, il peut retourner un résultat non optimal à cause de cela et en même temps meilleur l'heuristique pour votre disposition spécifique, et meilleurs seront les résultats (et éventuellement la vitesse).

Il est censé être plus rapide que Dijkstra même s'il nécessite plus de mémoire et plus d'opérations par nœud car il explore beaucoup moins de nœuds et le gain est bon dans tous les cas.

Le précalcul des chemins pourrait être le seul moyen si vous avez besoin de résultats en temps réel et que le graphique est assez grand, mais vous souhaitez généralement trouver le chemin moins fréquemment (je suppose que vous voulez le calculer souvent).

6
Jack

Ces algorithmes peuvent être utilisés dans la recherche de chemins et la traversée de graphiques, le processus de traçage d'un chemin efficacement dirigé entre plusieurs points, appelés nœuds.

Formule pour a* is f =g + h., g signifie le coût réel et h signifie le coût heuristique. formule pour Dijktras est f = g. il n'y a pas de coût heuristique. lorsque nous utilisons a* et si le coût heuristique est 0 alors il sera égal à l'algorithme de Dijktras.

4
Charith mohotti

Réponse courte: A * utilise l'heuristique pour optimiser la recherche. Autrement dit, vous pouvez définir une fonction qui, dans une certaine mesure, peut estimer le coût d'un nœud à la cible. Ceci est particulièrement utile lorsque vous recherchez un chemin sur une représentation géographique (carte) où vous pouvez, par exemple, deviner la distance à la cible d'un nœud de graphique donné. Par conséquent, généralement A * est utilisé pour la recherche de chemin dans les jeux, etc. Où Djikstra est utilisé dans des cas plus génériques.

Non, A * ne donnera pas toujours le meilleur chemin. Si l'heuristique est la distance "géographique", l'exemple suivant peut donner le chemin non optimal.

[airport] - [road] - [start] -> [road] -> [road] -> [road] -> [road] -> [target] - [airport]
        |----------------------------------------------------------------|
3
Petter Nordlander