【问题标题】:A* with reopening when heuristics is only admissible but not consistentA* 当启发式只允许但不一致时重新打开
【发布时间】:2018-09-06 13:56:18
【问题描述】:

这里给出了我遵循的 A* 伪代码:

我的问题是:我们如何确定在找到目标状态时可以返回?与所有其他 CLOSED 状态一样,它们可以从新的 OPEN 状态重新打开。因此,如果我有一个从 OPEN 获得的状态,并且我发现我可以从该状态采取更好的路径到达 CLOSED 目标,那么我至少应该更新它的值。我们不是应该等到所有州都关闭了吗?

【问题讨论】:

    标签: artificial-intelligence shortest-path a-star


    【解决方案1】:

    看完丹尼斯的回答,我想根据自己的理解做一个简短的补充。

    让我们假设在 open_list 中有另一个节点,f(another) >= f(n)。 因为f(n)=g(n)+h(n)n是目标节点,所以h(n) = 0,然后f(another) >= g(n)

    那么,让我们回忆一下可接受的启发式原则如下:

    启发式仍然可以接受,这意味着节点n 的启发式成本h(n) 必须始终小于或等于真实(未知)剩余成本h*(n)h(n) <= h*(n) 对于所有n

    接下来,假设有一条路径连接anothernode 和目标n' node, 然后是f(another->n') = g(another->n') + h(n'),和h(n') = 0,所以f(another->n') = g(another->n')。毫无疑问g(another->n') > g(another),因为正路径成本。

    所以我们有:

    condition:
    1. g(another) + h(another) = f(another) >= f(n) = g(n);
    2. f(another->n') = g(another->n') > g(another)
    *important:  [admissible]
    3. h(another) <= h*(another) = g(another->n') - g(another)
    
    =>
    
    conlusion:
    f(another->n') >= f(another) >= f(n)
    

    因此,节点n 已经拥有最小f。 事实上,我的上述推导证明了可接受的启发式保证最优。更多信息参考:Admissible heuristic - Wikipedia

    我希望我已经为你阐明了这个问题。

    【讨论】:

      【解决方案2】:

      这个问题很好。我遇到了同样的问题。感谢@LearningMath 感谢@Dennis Soemers,收到的答案几乎是正确的。 但是我从 Dennis Soemers 的 cmets 中发现了一些错误,困扰了我很长时间。

      如果 h 是一致的,您可以 1) 删除 for 循环中的第一部分,您可以在其中查看您是否刚刚找到了一个更有效的路径到已关闭的节点 (如果新节点已经在CLOSED) 中,并且 2) 在所有说put something on OPEN 的行中,您可以只使用continue for 循环,您可以先检查如果 something 是目标,如果确实是目标,则立即返回路径,而不是先将其推送到 OPEN 然后继续直到它再次弹出。

      前半句是真的,后半句是假的;我不会从理论上完全证明这一点,只是给你看一个来自 CS 188 lecture pdf 的反例。 另一方面,如果您从here 中搜索标准A* 伪代码,您会发现goal_check 在入队后执行。

      【讨论】:

      • 您没有回答问题。不过谢谢你的通知。
      【解决方案3】:

      之所以有效,是因为:

      • 启发式仍然可以接受,这意味着对于所有n,节点n 的启发式成本h(n) 必须始终小于或等于真实(未知)剩余成本h*(n)h(n) &lt;= h*(n)
      • 您总是弹出节点nOPEN 的最小总成本f(n) = g(n) + h(n),其中g(n) 是到目前为止遍历到n 的路径的成本。

      所以,假设您刚刚从OPEN 中弹出了一个节点n,结果证明这是目标状态。您肯定知道(由于第二点)OPEN 中的 每个其他节点 的总和大于或等于 f-score。由于第一点,您也知道OPEN 中所有这些其他节点的这些f-scores 并没有高估;他们肯定不会好转。他们要么完全正确,要么低估了成本。你肯定知道他们永远不会再彻底击败n,所以你刚刚找到的通往n 的路径至少是一条最佳路径(它可能不是唯一最佳路径不过)。

      【讨论】:

      • 关于 OPEN 上的 f 值不会变得更好的说法是不正确的。那是因为所考虑的启发式方法不一致,只能接受。 F 值不是非递减的。在这种情况下,这实际上是重新打开 CLOSED 节点的重点。
      • 对于“不会变得更好”,我的意思是他们“不会变得比目标节点nf-score 更好”。那还是对的。 n 必须根据定义具有h(n) = 0,因此f(n) = g(n),因为它已经是目标并且它必须具有可接受的启发式。仍在OPEN 中的所有其他节点必须至少具有与f-score 一样大的值,并且由于可接受启发式的假设,这些f-scores 也不能高估,他们必须要么完全正确,要么低估了他们对目标的成本。他们永远不会比n更好。
      • 请注意,这项工作是因为我们只检查n 是否是再次从OPEN 弹出后的目标。如果我们确实有一致的启发式方法,我们可以更早地做到这一点;当我们遇到它时,我们可以立即追溯路径,而不是先将它推入OPEN,然后等到我们再次弹出它。
      • 如果h是一致的,如何在遇到目标时立即得出结论?
      • 参见“单调性的后果”部分here
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      • 2021-12-03
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 2011-10-16
      • 2015-03-09
      相关资源
      最近更新 更多