A* 或双向广度优先搜索?

A* or Bidirectional Breadth First Search?

不确定这是不是该问的地方,但是,

我在Java中编写了一个双向广度优先搜索算法,它同时从图中的起始节点和图中的目标节点进行搜索。在具有 3000000(300 万)个节点的图中,所有节点平均与 4 个其他节点(与 two-way/bidirectional 边连接)相连,在平庸的 CPU 上平均仅需 0.5 秒即可找到任意两个随机节点之间的最短路径,大约 10 秒是我发现超过 30 次测试运行的最坏情况时间。

假设只需要搜索一条路径(例如,在绘制起点和终点之间的路线时),在这种情况下使用具有良好启发式的 A* 算法的优势是什么?是的,寻找路径可能会稍微快一些,但 A* 很可能找不到最短路径。

有人可以详细说明为什么 A* 经常被选择而不是双向广度优先搜索以及它在性能方面产生的优势(计算时间、内存使用、找到最佳解决方案的机会等)吗?

此外, 大家复活节快乐!

双向搜索在可行时非常好,但它依赖于能够像起始节点一样轻松地生成目标节点(例如,您如何 select 国际象棋游戏中的目标节点?),并且分支因子在两个方向上相似。它依赖于能够完全倒退,做到这一点。即使您有很好的启发式算法,您也不太可能在搜索的反向部分充分利用它。