A*算法的正确表述

14

我正在研究A*寻路算法的定义,不同的地方似乎有些不同。

区别在于当经过节点的后继节点时,在发现后继节点已在关闭列表中时所执行的操作。

  • 一种方法(由维基百科此文章建议):如果后继节点在关闭列表中,则忽略它
  • 另一种方法(例如在这里这里建议):如果后继节点在关闭列表中,则检查其成本。 如果成本比当前计算出的得分更高,则将该项从关闭列表中删除以供将来检查。

我很困惑-哪种方法是正确的? 凭直觉,第一种方法更有意义,但我想知道定义的差异。 是否有一个定义是错误的,还是它们在某种程度上同构?

1个回答

12
第一种方法仅在到达任何重复状态的最优路径始终是第一条被遵循的路径时才最优。当启发式函数具有一致性(也称单调性)属性时,此属性成立。如果每个节点n和n'的每个继承者,从n到n'的步骤成本加上从n到目标的预计成本不大于从n到目标的估计成本,则启发式函数是一致的。
如果启发式函数仅是可接受的,即它永远不会高估达到目标的成本,那么第二种方法是最优的。
每个一致的启发式函数也都是可接受的。尽管一致性比可接受性要求更严格,但必须非常努力地想出可接受但不一致的启发式函数。
因此,即使第二种方法更为通用,因为它使用一个严格更大的启发式函数子集,但第一种方法在实践中通常就足够了。
参考资料:书籍《人工智能:一种现代方法》第4.1节“信息(启发式)搜索策略”中的小节“A*搜索:最小化总预测解决方案成本”。

连接的关键是,如果到达某个状态的第一条路径是最便宜的,那么在闭合列表中就不需要替换该状态。一致性属性保证了这个条件的成立。 - namin
请注意,如果您在封闭列表中的项目通常只是节点,那么即使没有循环,您也可以返回到封闭列表:例如,如果一个节点可以通过多条路径到达。 - namin
从n到达目标的估计成本不会超过从n到达n'的步骤成本加上从n'到达目标的估计成本。 - Ian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接