【问题标题】:In what cases would BFS and DFS be more efficient than A* search algorithm?在什么情况下 BFS 和 DFS 会比 A* 搜索算法更有效?
【发布时间】:2018-09-29 11:30:21
【问题描述】:

我已经针对广度优先搜索 (BFS) 和深度优先搜索 (DFS) 测试了 A* 搜索,我发现使用 A* 扩展的节点更少。

我知道 A* 通过使用启发式和边缘成本函数扩展了成本已经较低的路径。

在什么情况下,BFS 和 DFS 比 A* 搜索算法更有效?

【问题讨论】:

  • 有趣的问题哥们。您能否在详细说明 A* 与 BFS 与 DFS 的节点扩展的问题中添加一个摘要?

标签: artificial-intelligence graph-theory depth-first-search breadth-first-search a-star


【解决方案1】:

BFS 使用队列,而 A* 使用优先级队列。一般来说,队列比优先队列快得多(例如,Dequeue()O(1) vs O(log n)。 A* 的优点是它通常比 BFS 扩展的节点少得多,但如果不是这样,BFS 会更快。如果使用的启发式方法很差,或者图非常稀疏或很小,或者启发式方法对于给定的图失败,就会发生这种情况。

请记住,BFS 仅对未加权图有用。如果图是加权的,则需要使用 BFS 的大哥,Dijkstra 的算法。此算法使用优先级队列,因此几乎不会比 A* 快,除非启发式失败。

【讨论】:

    【解决方案2】:

    当启发式不一致时,广度优先搜索可能优于 A*。 (不一致的启发式不遵守三角不等式。一致的启发式永远不会改变超过从一个状态到下一个状态的边缘成本。)

    如果启发式算法不一致,A* 可能会将 N 个状态扩展到 2^N 次。发生这种情况的示例可以是found online。如果您想了解会发生什么,请逐步执行该示例。 BFS 每个状态最多只会扩展一次。请注意,这可以通过算法 B 部分修复(N 个状态最多扩展 N^2 次),但这仍然是一个很大的开销。最近的IBEX algorithm 有更好的最坏情况保证 - N log C*,其中 C* 是最优解决方案成本。

    如果目标在第一个分支上,深度优先搜索可能优于 A* 和 BFS。在this demo 中,您可以将目标置于树中的不同状态以查看会发生什么。

    还有其他恒定因素需要考虑。 DFS 只需要一个状态的单个副本,而 A* 在 OPEN/CLOSED 列表中保留许多状态。但是,在这些情况下,应该使用 IDA*。

    请注意,从理论上讲,在具有一致启发式的单向搜索中,A* 执行证明解决方案最优所需的最少必要展开次数。

    【讨论】:

      猜你喜欢
      • 2020-08-07
      • 1970-01-01
      • 2021-12-19
      • 2011-05-21
      • 2017-08-16
      • 2013-05-02
      • 2016-02-16
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多