我正在实施双向A *搜索(双向,因为搜索是同时从原点和目的地执行的,当这两个搜索相遇时,我将拥有我的最短路径 - 至少有一点额外的投入的逻辑。)
有没有人有过采用单向A *和双向化(!)的经验 - 我可以期待什么样的性能提升?我估计它至少会将搜索时间减半或者减少 - 但是我可以看到更大的收益吗?我正在使用该算法来确定道路网络上的最短路线 - 如果这是相关的(我已经读过关于MS的“Reach”算法,但是想要采取婴儿步骤而不是直接进入)。 / p>
答案 0 :(得分:9)
在最好的情况下,它会在O(b ^(n / 2))而不是O(b ^ n)中运行,但只有在你幸运的时候才会这样:)
(其中b是你的分支因子,n是单向A *会考虑的节点数)
这一切都取决于两个搜索相遇的容易程度,如果他们在搜索的早期阶段找到了彼此很好的搜索时间,那么如果他们分成了很多不同的搜索时间,那么最终得到的东西比简单的A *慢(因为所有额外的簿记)
答案 1 :(得分:2)
您可以尝试http://sourceforge.net/projects/tway/ 有一个基准测试脚本将其与标准astar进行比较 (对于纽约市的道路数据,似乎可以获得30%的时间收益)
答案 2 :(得分:1)
实施了3种不同的双向A *搜索算法(参见cskit)。
net.coderodde.cskit.graph.p2psp.general.FastSuboptimalFinder
是最快的,但通常不是最佳的; net.coderodde.cskit.graph.p2psp.general.BHPAFinder
是最佳且非常快的;如果要求最优性,我会使用这个; net.coderodde.cskit.graph.p2psp.general.WhangboFinder
不是特别好。从项目根类型mvn exec:java
(需要Maven)查看实际算法。
祝你好运!
(编辑:This library提供了3种不同的双向A *算法。这三种算法都是最优的。)
答案 3 :(得分:1)
你可以认为聚类更有效率。另请参阅this article