【问题标题】:better heuristic then A*比 A* 更好的启发式
【发布时间】:2011-12-11 08:08:56
【问题描述】:

我注册了斯坦福大学的 ai-class.com,并且刚刚在第一周的讲座中学习了 a* 算法以及它如何比其他搜索算法更好地使用。

我还展示了我的一位同学在 4x4 滑块拼图中实现它,他已在以下位置发布:http://george.mitsuoka.org/StanfordAI/slidingBlocks/ 虽然我非常感谢和感谢 George 实施 A* 并发布结果供我们娱乐。

我(和他)想知道是否有任何方法可以使流程更加优化,或者是否有更好的启发式 A*,例如比“不合适的块数”或“的最大值更好的启发式函数”到目标的距离总和”会加快速度吗? 另外,如果有比 A* 更好的算法来解决此类问题,我也想了解它们。

感谢您的帮助,如果出现差异,请在降级我的个人资料之前让我有机会升级我的方法,或者即使要求删除问题,我仍在学习 stackoverflow 的方法。

【问题讨论】:

  • 您是否尝试过搜索 A* 替代品?
  • 我在问这个问题之前首先尝试了你所说的但没有令人满意的结果,其中一个是 blobmap 算法。所以它认为在这里问它会是一个更好的方法。 (BDW 感谢 GollezTrol 的回复)

标签: algorithm search heuristics a-star


【解决方案1】:

这取决于您的heuristic function。例如,如果你有一个完美的启发式 [h*],那么 greedy 算法(*)将产生比 A* 更好的结果,并且仍然是最优的 [因为你的启发式是完美的!]。它将仅开发解决方案所需的节点。不幸的是,您很少有完美的启发式方法。
(*)贪心算法:总是开发h值最低的节点。

但是,如果您的启发式非常糟糕:h=0,那么 A* 实际上是 BFS!在这种情况下,A* 将开发O(B^d) 节点,其中 B 是分支因子,d 是求解所需的步骤数。
在这种情况下,由于您只有一个目标函数,bi-directional search (*) 将更有效,因为它只需要开发 O(2*B^(d/2))=O(B^(d/2)) 节点,这比 A* 开发的要少得多。
双向搜索:(*)从目标节点和起始节点开始运行 BFS,每次迭代从每一边开始,当两边都有一个公共顶点时算法结束。

对于一般情况,如果您有一个不完美但不完全糟糕的启发式算法,A* 可能会比这两种解决方案表现得更好。

平均情况的可能优化:您还可以使用 A* 运行双向搜索:从开始端,您可以使用启发式运行 A*,从目标端运行常规 BFS .它会更快地得到解决方案吗?不知道,您可能应该对这两种可能性进行基准测试并找出哪个更好。但是,使用此算法找到的解决方案也将是最优的,例如 BFS 和 A*。

【讨论】:

  • 感谢 Amit 的澄清。我已经修改了这个问题,想听听你的 pt 对 4x4 拼图采取的方法是否合适或是否有相当大的改进空间。
【解决方案2】:

正如您在视频中了解到的那样,A* 的性能取决于预期成本启发式的质量。让您的预期成本启发式尽可能与该状态的实际成本匹配将减少需要扩展的状态总数。还有一些变体在某些情况下表现更好,例如在大型状态空间搜索中面临硬件限制时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    相关资源
    最近更新 更多