【问题标题】:What is the A* algorithm in case the heuristic function H is not monotonic?如果启发式函数 H 不是单调的,那么 A* 算法是什么?
【发布时间】:2014-02-04 10:44:57
【问题描述】:

我试图弄清楚在启发式函数不满足单调性条件的情况下 A* 算法会是什么,其中在

h(u)

是单调性的条件,其中h是启发函数,u和v是搜索图中的顶点,函数e给出了u和v之间的边代价(搜索图是无向的)。然而,维基百科(这里)没有给出算法,Norvig 的人工智能书等其他来源也没有。

有没有很好的资料来研究这个。伪代码会很棒!

另外,我不希望通过将非单调启发式函数转换为启发式函数来解决这个问题。

【问题讨论】:

  • 我不知道是谁建议了密切投票,但这不是题外话。
  • 我在理解预期的答案类型时遇到了问题。 “较慢”看起来是一个有效的答案。
  • 我试图了解在上述情况下可以使用的算法。目前,我并不担心算法的时间复杂度。

标签: c++ algorithm a-star heuristics


【解决方案1】:

假设启发式函数 function 仍然是 admissible - A* 算法可以正常工作。

但是,对于非单调启发式函数,您可能需要更新已经“关闭”的节点,并且您应该允许这种行为。

【讨论】:

  • 问题是,我们是否不必同时更新我们在封闭列表中更新的那些人的孩子?
  • @ashu 你需要像对待你刚刚“发现”的任何其他节点一样对待这个节点,包括如果新价格比已经找到的价格更好,则重新打开关闭的后代。
  • 我应该递归地这样做(对于在封闭列表中更新的孩子)?
【解决方案2】:

树搜索的情况下,它不需要保持一致就可以是最优的。相反,如果是图搜索,A* 仅在启发式可接受且一致的情况下才是最优的。

在这张图片中,您可以看到一个不一致的启发式示例:A* 算法找不到正确的路径。

也许您可以像@amit 所说的那样修改标准 A* 算法,但在这种情况下,您需要考虑已经关闭的状态,因此搜索不会是最优的。它可能会找到最佳路径,但它会比具有一致启发式的解决方案扩展更多的节点,因此它会是次优的。

【讨论】:

  • 我认为这取决于您认为的“标准 A* 算法”。我个人认为允许更新封闭节点的算法是标准算法,而依赖单调启发式的算法是 A* 的特例(尽管是常见的特例)。 Wikipedia 文章总是小心地提及它是指一般的 A* 还是假设单调启发式的 A*。
猜你喜欢
  • 1970-01-01
  • 2012-10-19
  • 2011-03-09
  • 1970-01-01
  • 2021-06-25
  • 2017-05-23
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
相关资源
最近更新 更多