【问题标题】:A* or Bidirectional Breadth First Search?A* 还是双向广度优先搜索?
【发布时间】:2018-09-11 03:43:48
【问题描述】:

不确定这里是否适合询问,但是,

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

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

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

另外, 祝大家复活节快乐!

【问题讨论】:

  • “但 A* 很可能找不到最短路径” - 如果您的 A* 没有找到最短路径,则您的 A* 算法或您的启发式方法是错误的。如果你没有尝试过,只是认为它不会找到最短路径,那么你对 A* 的理解是错误的。
  • @user2357112 你需要有一个完美的启发式算法才能找到 A* 的最短路径,据我所知,没有完美的启发式算法可以找到任意两点之间的路径图表。
  • @user2357112 让我纠正一下自己:有完美的启发式算法,但有了这些启发式算法,A* 算法的性能几乎与广度优先算法相同。
  • “你需要有一个完美的启发式算法才能找到 A* 的最短路径”——不,你不会。您需要一个admissible 启发式,并且为了有效地实施,您通常需要一个consistent 启发式。
  • 如果启发式是可接受的(或在图搜索中是单调的),那么 A* 保证首先找到最佳解决方案。

标签: performance search breadth-first-search a-star


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    相关资源
    最近更新 更多