双向A* (A-star)

505 阅读1分钟

这里默认读者已经了解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%的时间效益)