2010-09-04 2 views
19

J'implémente une recherche bidirectionnelle A * (bidirectionnelle car la recherche est effectuée à la fois à partir de l'origine et de la destination, et quand ces deux recherches se rencontrent, je vais avoir ma plus courte chemin - au moins avec un peu de logique supplémentaire jeté).Bidirectionnel A * (A-star) Recherche

Quelqu'un a-t-il de l'expérience avec un A * unidirectionnel et un bidirectionnel (!), Quel genre de gain de performance puis-je espérer obtenir? Je comptais sur cela plus ou moins réduire de moitié le temps de recherche, au minimum - mais puis-je voir des gains plus importants? J'utilise l'algorithme pour déterminer les routes les plus courtes sur un réseau routier - si cela est pertinent (j'ai lu à propos de l'algorithme "Reach" de MS, mais je veux faire des pas dans cette direction plutôt que de sauter tout droit).

+0

Remarque - le titre de la question est répété A * pour faciliter la recherche. –

+1

FYI: voici un lien vers le document MS sur Reach for A * (A-star): http://www.avglab.com/andrew/pub/alenex06.pdf – shindigo

Répondre

8

Dans le meilleur des cas, il serait exécuté dans O (b^(n/2)) au lieu de O (b^n), mais c'est que si vous êtes chanceux :)

(où b est votre facteur de branchement et n est le nombre de nœuds qu'un A * unidirectionnel considérerait)

Tout dépend de la facilité avec laquelle les deux recherches se rencontrent, si elles se trouvent à mi-chemin au début de la recherche que vous avez vous avez fini avec beaucoup de temps de recherche, mais si elles se divisent en directions follement différentes, vous pouvez vous retrouver avec quelque chose de plus lent que le simple A * (à cause de toute la comptabilité supplémentaire)

+1

Merci Michael - quelques recherches supplémentaires ont montré que je Je ne vais probablement pas avoir de chance - bidirectionnel A * est supposé assez gênant quand il s'agit de deux directions convergeant sur le même nœud. Je peux y aller, ou plus probablement investir un peu de temps à trouver Reach. –

+0

Sur les plus gros nombres, vous gagnez clairement lorsque vous effectuez une recherche bidirectionnelle. Les laboratoires Microsoft Research utilisent cet algorithme, mais avec beaucoup d'améliorations plus compliquées. –

1

ant d'essayer http://sourceforge.net/projects/tway/ il y a un script d'analyse comparative qui compare cela avec Astar norme (pour les routes de la ville de New York données, il semble donner un avantage de temps de 30%)

1

ont mis en œuvre 3 différents bidirectionnel A * recherche algos (voir cskit) .

Pour voir les algorithmes en action, à partir de la racine du projet, tapez mvn exec:java (nécessite Maven). Bonne chance!

(Modifier. This library propose 3 différents bidirectionnel A * algorithmes Tous les trois sont optimales.)

Questions connexes