嘿伙计们参加了stenford的ai-class.com,并且在我的第一周讲座中学到了一个*算法,以及它如何更好地用于其他搜索算法。
我还展示了我的一位同学在4x4滑块拼图上实现它,他在http://george.mitsuoka.org/StanfordAI/slidingBlocks/发表了这个拼图 虽然我非常感谢并感谢乔治实施A *并将结果公布为我们的娱乐。
我(并且他也)想知道是否有任何方法可以使过程更加优化,或者是否有更好的启发式A *,例如更好的启发式功能,而不是“不合适的块数”或“目标距离的总和“会加快速度吗? 而且如果有一个更好的算法,然后A *这样的问题,我也想了解它们。
感谢您提供的帮助,如果出现差异,在对我的个人资料进行评分之前,请允许我有机会升级我的方法,或者即使有必要删除问题,因为我仍在学习stackoverflow的方法。
答案 0 :(得分:4)
这取决于您的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 *。
答案 1 :(得分:0)
A *的表现基于您在视频中学到的预期成本启发式的质量。使您的预期成本启发式尽可能与该州的实际成本匹配将减少需要扩展的状态总数。在某些情况下,还有许多变体表现更好,例如在大型状态空间搜索中遇到硬件限制时。