这里默认读者已经了解A*相关原理 具体不太了解的可以网上查阅一些资料
引入:
众所周知,双向BFS是对BFS极大的优化,它从起点和终点开始分别搜索,直到相遇。
那么,既然有双向BFS,为什么不能有双向A*呢?
策略:
同双向BFS一样,双向A也是从起点和终点开始分别进行A搜索。
直到两个open list中的点出现重复。
最后的答案是两个G值相加。
总结:
感觉没什么好总结的。
双向A*其实很简单,
就请记住:
双向A就是从起点和终点开始分别进行A搜索。
直到两个open list中的点出现重复。
最后的答案是两个G值相加。
我能期待什么样的性能提升?
在最好的情况下,它将以O(b^(n/2))运行,而不是O(b^n),但这仅在您幸运的情况下:)
(其中b是分支因子,n是a单向A*考虑的节点数)
这完全取决于这两个搜索相遇的难易程度,如果它们在搜索的早期找到对方,你已经节省了大量的搜索时间,但如果它们分支到非常不同的方向,你可能会得到比简单的A*更慢的结果(因为所有额外的记账)
可以尝试github.com/sroycode/tw…,有一个基准测试脚本将其与标准astar进行比较(对于NY城市道路数据,它似乎提供了30%的时间效益)