【问题标题】:Does A* need to know the optimal solution cost while utilizing an admissible heuristic?A* 在使用可接受的启发式算法时是否需要知道最优解成本?
【发布时间】:2016-09-21 00:57:23
【问题描述】:

我已经阅读了一些关于这个主题的 stackoverflows,以及关于 A* 的维基百科,但我仍然有点困惑。我认为这篇文章几乎完全向我解释了它:A* heuristic, overestimation/underestimation?

我唯一的困惑是,A* 怎么知道最优解?似乎使用可接受的启发式,您可以丢弃超过已知最优解的路径,因为启发式保证小于或等于。但是 A* 怎么会提前知道最优呢?

如果您不知道最优路径成本,这种搜索是否会起作用并保证最优解?

【问题讨论】:

    标签: search optimization artificial-intelligence a-star


    【解决方案1】:

    A* 不知道最优解,启发式仅给出有根据的猜测,这有助于加速搜索过程。看到你已经阅读了一些理论解释,让我们在这里尝试一种不同的方法,举个例子:

    1. 从绿色节点开始,A* 探索成本最小的节点 + 启发式(1.5 + 4 = 5.5,节点“a”)。成本+启发式可以理解为“到那里多少加上我认为目标还剩多少”。换句话说,它是目标的估计总成本。所以我们选择最小值是有道理的。节点 'd' 的成本更高 (2 + 4.5 = 6.5),所以我们将其留在队列中。
    2. 通过扩展“a”邻居,我们将“b”添加到队列中并计算其值,即 1.5 + 2 + 2 = 5.5(直到那里的成本以粗体显示,另一个术语是我认为还剩多少)。它仍然比 'd' 的成本要好,所以我们一直在探索这条路。请注意,“b”中的启发式是 2,这意味着我们认为这是达到目标所剩余的额外成本......这显然是错误的,没有办法从成本 2 的“b”到达那里!但这对 A* 算法没有问题,因为我们低估了真正的成本。
    3. 扩展“b”,我们将其邻居“c”添加到队列中,值为 1.5 + 2 + 3 + 4 = 10.5。现在,还记得 'd' 还在队列中吗?现在它具有最小值(6.5),所以我们将“c”留在队列中并尝试“d”,因为它是一条更有希望的路径。这个决定是可能的,因为我们知道到达“c”的成本为 6.5,并且我们认为到达目标仍有 4 的成本。在这种情况下,启发式是正确的,这对于 A* 算法也是可以的。
    4. 通过扩展“d”,我们将“e”添加到队列中,其值为 2 + 3 + 2 = 7。这里的启发式是正确的,我们已经知道这对于 A* 是可以的。然后我们将探索“e”并找到目标。 但是假设我们有 h(e) = 6,给 'e' 的值 2 + 3 + 6 = 11。这意味着 'c' 将是下一个最佳猜测(10.5),我们将尝试一条绝望的道路!这意味着高估启发式是不可接受的,因为它使 A* 走错了探索路径。

    如果您正在寻找证据,以下是来自维基百科的非正式证据:

    当 A* 终止搜索时,它找到了一条路径,其实际成本低于通过任何开放节点的任何路径的估计成本。但由于这些估计是乐观的,A* 可以安全地忽略这些节点。换句话说,A* 永远不会忽视低成本路径的可能性,因此是可以接受的。

    为了优化:

    现在假设某个其他搜索算法 B 以一条路径终止其搜索,该路径的实际成本不小于通过某个开放节点的路径的估计成本。基于它所拥有的启发式信息,算法 B 不能排除通过该节点的路径具有较低成本的可能性。因此,虽然 B 可能考虑的节点数少于 A*,但它是不可接受的。因此,A* 会考虑任何可接受的搜索算法中的最少节点。

    您可能还想观看此视频:A* optimality proof

    【讨论】:

    • 感谢您的解释!我还没有机会观看 A* 视频,所以这个问题可能会在那个视频中得到回答,但是当 A* 终止它的搜索时,如何保证它找到的路径是最优的?例如,假设您有 2 条路径 A 和 B。路径 A 的成本为 3,路径 B 的成本为 4。所以在这里,路径 A 是最优路径。但是启发式引导我们首先尝试路径 B。在这种情况下,一旦我们尝试了路径 B,我们就找到了解决方案并终止,但这不是最佳解决方案。 A* 是如何处理这个问题的?
    • A* 在您从队列中获取目标状态时结束,而不是在添加时结束。而且由于队列是按成本排序的,这意味着你总是得到最短路径。
    • 但是队列是按实际成本+启发式成本排序的吧?回到我的路径 A 和路径 B 的示例。路径 A 的实际成本为 3,路径 B 的实际成本为 4。路径 B 的启发式为 1,路径 A 的启发式为 3。这仍然一个可接受的启发式,因为我们从不高估路径的成本。现在,路径 B 的总体成本较低(4+1 对 3+3),因此将首先探索路径 B,我们会找到目标状态,即使路径 A 具有实际的较低路径。
    • 如果你找到了目标,启发式必须相对于它的节点。由于启发式算法永远不会高估,因此对于目标,它必须始终为 0。中间节点中的错误估计不会影响停止标准,因此您的示例没有问题。您可能会先通过较差的路径找到目标,但不会将其放入队列的第一个位置。启发式仅指路径中的最后一个节点,在这种情况下将是目标,因此 h=0。
    • 所以在上例的图中,假设我们到达了队列中只剩下 2 个节点是 c 和 e 的点。所以我们探索的下一个节点会给我们目标状态。 c 的成本是 6.5,e 的成本是 5。目前,我们的启发式方法将引导我们首先探索最优的 e。假设 e->goal 实际上的成本为 3,启发式为 3(所以我们不会高估),而 c->goal 的启发式为 1。现在,c->goal 的成本为 6.5 + 1 = 7.5,而 e->goal 的成本为 5 + 3 = 8。这将导致我们首先探索 c,这不是最佳路径吗?
    【解决方案2】:

    它通过使用启发式方法通过所有可能的变体/机会来实现它。因此,您将在封闭列表中拥有所有需要的图块/顶点/航点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 2012-04-29
      • 1970-01-01
      • 2019-01-12
      • 2013-02-06
      • 2013-03-07
      • 2016-04-21
      相关资源
      最近更新 更多