algorithm - 最速爬坡与最佳优先搜索

标签 algorithm tree traversal tree-traversal tree-search

我正在尝试使用不同的算法来解决问题,最速爬坡 (SAHC) 和最佳优先搜索是我需要实现的其中两种算法。

根据 Wikipedia:

“在最陡峭的爬坡中,比较所有后继者并选择最接近解决方案的...”

“最速爬山类似于最佳优先搜索,它会尝试当前路径的所有可能扩展,而不是只尝试一个。”

SAHC:比较所有后继者并选择最接近解决方案的。
BestFS:尝试当前路径的所有可能扩展,而不是只尝试一个。

我真的不明白它们有什么不同。有人可以帮我解决这个问题,最好是用树来解释一下吗?

最佳答案

它们非常相似。不同之处在于,最佳优先搜索会考虑从起始节点到结束节点的所有路径,而最陡峭的爬山在搜索过程中只会记住一条路径。

例如,假设我们有一个图

start ---- A ---- B ---- end
  \                     /
   ------\    /---------
          \  /
           C

每条边都具有相同的权重:忽略我蹩脚的 ASCII 艺术技巧 :)。 还假设在我们的启发式函数中,A 被认为比 C 更接近终点。(这仍然可能是 admissible heuristic——它只是低估了 A 的真实距离。)

那么最陡爬山会先选择A(因为它的启发值最小),然后是B(因为它的启发值低于起始节点),最后是结束节点。

另一方面,最佳优先搜索会

  1. 将 A 和 C 添加到开放列表中。
  2. 从开放列表中取出最佳值 A,然后添加 B。然后 OPEN = {B, C}。
  3. 从开放列表中取出最佳节点(B 或 C,稍后详细介绍),并添加其后继者,即目标状态。
  4. 从开放列表中取出目标状态并返回到达那里的路径。

在第 3 步中选择 B 还是 C 完全取决于您使用的最佳优先搜索算法。 A*会将节点评估为到达那里的成本加上到达终点的成本估计,在这种情况下 C 将获胜(事实上,通过可接受的启发式算法,A* 保证始终为您提供最佳路径) . “贪婪的最佳优先搜索”会在两个选项之间任意选择。在任何情况下,搜索都会维护一个可能的出发地点列表,而不是一个。

现在两者的区别是不是更清楚了?

关于algorithm - 最速爬坡与最佳优先搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14741006/

相关文章:

node.js - 卡住了,完整性,用nodejs重复列出目录中的所有文件?

c - 是否有一种算法可以打印数组子序列的所有排列?

根据其他用户的喜好查找用户喜欢的东西的算法

java - 在 Java 中解析算术表达式并从中构建树

sql-server-2008 - 在sql server中的树结构中查找子树下的所有叶节点

graph - 嵌套映射到表示 Clojure 中的边的元组序列

C:寻找树中特定叶子的霍夫曼编码路径

C#:阿特金筛法的实现

c# - 用于文本算法的 .NET 库?

c - 在 C 中动态调整数组大小时 Valgrind 错误