【发布时间】:2018-09-06 13:56:18
【问题描述】:
我的问题是:我们如何确定在找到目标状态时可以返回?与所有其他 CLOSED 状态一样,它们可以从新的 OPEN 状态重新打开。因此,如果我有一个从 OPEN 获得的状态,并且我发现我可以从该状态采取更好的路径到达 CLOSED 目标,那么我至少应该更新它的值。我们不是应该等到所有州都关闭了吗?
【问题讨论】:
标签: artificial-intelligence shortest-path a-star
我的问题是:我们如何确定在找到目标状态时可以返回?与所有其他 CLOSED 状态一样,它们可以从新的 OPEN 状态重新打开。因此,如果我有一个从 OPEN 获得的状态,并且我发现我可以从该状态采取更好的路径到达 CLOSED 目标,那么我至少应该更新它的值。我们不是应该等到所有州都关闭了吗?
【问题讨论】:
标签: artificial-intelligence shortest-path a-star
看完丹尼斯的回答,我想根据自己的理解做一个简短的补充。
让我们假设在 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
我希望我已经为你阐明了这个问题。
【讨论】:
这个问题很好。我遇到了同样的问题。感谢@LearningMath 感谢@Dennis Soemers,收到的答案几乎是正确的。 但是我从 Dennis Soemers 的 cmets 中发现了一些错误,困扰了我很长时间。
如果
h是一致的,您可以 1) 删除 for 循环中的第一部分,您可以在其中查看您是否刚刚找到了一个更有效的路径到已关闭的节点 (如果新节点已经在CLOSED) 中,并且 2) 在所有说put something on OPEN的行中,您可以只使用continuefor 循环,您可以先检查如果something是目标,如果确实是目标,则立即返回路径,而不是先将其推送到OPEN然后继续直到它再次弹出。
前半句是真的,后半句是假的;我不会从理论上完全证明这一点,只是给你看一个来自 CS 188 lecture pdf 的反例。 另一方面,如果您从here 中搜索标准A* 伪代码,您会发现goal_check 在入队后执行。
【讨论】:
之所以有效,是因为:
n,节点n 的启发式成本h(n) 必须始终小于或等于真实(未知)剩余成本h*(n):h(n) <= h*(n)。 n 与OPEN 的最小总成本f(n) = g(n) + h(n),其中g(n) 是到目前为止遍历到n 的路径的成本。所以,假设您刚刚从OPEN 中弹出了一个节点n,结果证明这是目标状态。您肯定知道(由于第二点)OPEN 中的 每个其他节点 的总和大于或等于 f-score。由于第一点,您也知道OPEN 中所有这些其他节点的这些f-scores 并没有高估;他们肯定不会好转。他们要么完全正确,要么低估了成本。你肯定知道他们永远不会再彻底击败n,所以你刚刚找到的通往n 的路径至少是一条最佳路径(它可能不是唯一最佳路径不过)。
【讨论】:
n 的f-score 更好”。那还是对的。 n 必须根据定义具有h(n) = 0,因此f(n) = g(n),因为它已经是目标并且它必须具有可接受的启发式。仍在OPEN 中的所有其他节点必须至少具有与f-score 一样大的值,并且由于可接受启发式的假设,这些f-scores 也不能高估,他们必须要么完全正确,要么低估了他们对目标的成本。他们永远不会比n更好。
n 是否是再次从OPEN 弹出后的目标。如果我们确实有一致的启发式方法,我们可以更早地做到这一点;当我们遇到它时,我们可以立即追溯路径,而不是先将它推入OPEN,然后等到我们再次弹出它。