Algorithm 启发式比A更好*

Algorithm 启发式比A更好*,algorithm,search,heuristics,a-star,Algorithm,Search,Heuristics,A Star,我注册了斯坦福大学的ai-class.com,在第一周的讲座中,我刚刚学习了a*算法,以及它如何比其他搜索算法更好地使用 我还展示了我的一位同班同学在4x4滑块拼图上实现它,他已在以下网站上发表: 我非常感谢George实现了一个*并发布了结果供我们娱乐 我(他也)想知道是否有任何方法可以使流程更加优化,或者是否有更好的启发式a*,比如比最大“偏离位置的块数”或“目标距离总和”更好的启发式函数,从而加快速度? 如果有更好的算法来解决这些问题,我也想知道 感谢您的帮助,如果出现差异,请在降级我的个

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

我还展示了我的一位同班同学在4x4滑块拼图上实现它,他已在以下网站上发表: 我非常感谢George实现了一个*并发布了结果供我们娱乐

我(他也)想知道是否有任何方法可以使流程更加优化,或者是否有更好的启发式a*,比如比最大“偏离位置的块数”或“目标距离总和”更好的启发式函数,从而加快速度? 如果有更好的算法来解决这些问题,我也想知道

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

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

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

对于一般情况,如果你有一个不完美但不完全可靠的启发式,a*可能会比两个解决方案都好


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

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

您是否尝试过搜索*替代方案?我在提问前曾尝试过,但没有令人满意的结果,其中一个是blobmap algo。因此,它认为在这里提问会是一个更好的方法。(BDW感谢GollezTrol的回复)感谢Amit的澄清。我已经修改了这个问题,希望听取您的pt对4x4拼图采用的方法是否合适,或者是否有相当大的改进空间。