Artificial intelligence A*当启发式仅允许但不一致时重新打开
下面给出了我遵循的A*伪代码: 我的问题是:我们如何确定在找到目标状态时可以返回?与所有其他封闭状态一样,它们可以从新的开放状态重新开放。所以,如果我有一个从OPEN得到的状态,并且我看到我可以从该状态走一条更好的路径到封闭目标,那么我至少应该更新它的值。难道我们不应该等到所有州都关闭了吗?这是因为:Artificial intelligence A*当启发式仅允许但不一致时重新打开,artificial-intelligence,shortest-path,a-star,Artificial Intelligence,Shortest Path,A Star,下面给出了我遵循的A*伪代码: 我的问题是:我们如何确定在找到目标状态时可以返回?与所有其他封闭状态一样,它们可以从新的开放状态重新开放。所以,如果我有一个从OPEN得到的状态,并且我看到我可以从该状态走一条更好的路径到封闭目标,那么我至少应该更新它的值。难道我们不应该等到所有州都关闭了吗?这是因为: 启发式仍然是可接受的,这意味着节点的启发式成本h(n)必须始终小于或等于真实(未知)剩余成本h*(n):h(n)这个问题很好。我遇到了同样的问题。感谢@LearningMath 由于@Denn
- 启发式仍然是可接受的,这意味着节点的启发式成本
必须始终小于或等于真实(未知)剩余成本h(n)
:h*(n)
h(n)这个问题很好。我遇到了同样的问题。感谢@LearningMath 由于@Dennis Soemers,收到的答案几乎是正确的。 但我从丹尼斯·苏默斯的评论中发现了一些错误,这让我很困扰 如果
是一致的,您可以1)删除for循环中的第一个部分,看看您是否找到了到已关闭节点的更有效路径(如果新节点已处于h
已关闭的
,您可以继续
for循环),和2)在所有说
打开某个东西的行中,您可以首先检查该
东西是否是目标,如果它确实是目标,则立即返回路径,而不是先将其推到
,然后继续,直到再次弹出 第一部分是正确的,但第二部分是错误的;我不会从理论上完全证明这一点,只是给你们看一个例子。打开
另一方面,如果你从中搜索标准的A*pesudo代码,你会发现目标检查在排队后执行。在阅读了丹尼斯的答案后,我想根据自己的理解做一个简短的补充 让我们假设在open_列表中有另一个节点,
。 因为f(另一个)>=f(n)
,f(n)=g(n)+h(n)
是目标节点,所以n
,然后h(n)=0
然后,让我们回顾一下可接受的启发式原则,如下所示: 启发式仍然是允许的,这意味着节点的启发式成本f(另一个)>=g(n)
必须始终小于或等于真实(未知)剩余成本h(n)
:h*(n)
,并且h(n)n')=g(另一个->n')+h(n')
,因此h(n')=0
。毫无疑问,f(另一个->n')=g(另一个->n')
,因为正路径成本 因此,我们:g(另一个->n')>g(另一个)
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)
因此,节点条件: 1.g(另一)+h(另一)=f(另一)>=f(n)=g(n); 2.f(另一个->n'=g(另一个->n'>g(另一个) *重要:[可受理] 3.h(另一个)n’-g(另一个) => 结论: f(另一个->n'>=f(另一个)>=f(n)
已经具有minn
。 事实上,我的上述推导证明了可容许的启发式算法保证了最优解。更多信息请参阅:f
我希望我已经向您说明了这个问题。关于开放式平台上的f值不会变得更好的说法是不正确的。这是因为所考虑的启发式是不一致的,只允许的。F值不是非递减的。在这种情况下,这实际上是重新打开已关闭节点的要点。对于“不会变得更好”,我的意思是它们“不会变得比目标节点的
-分数f
更好”。这仍然是正确的n
根据定义必须具有n
,因此h(n)=0
,因为它已经是目标,并且必须具有可接受的启发式。所有其他仍处于f(n)=g(n)
打开状态的节点必须至少具有与
-相同大的f
-分数,并且由于可接受的启发式假设,这些f
-分数也不能高估,它们必须完全正确或低估了从它们到目标的成本。严格来说,它们永远不会比f
好。请注意,这是有效的,因为我们只会在再次弹出n
后检查OPEN
是否是目标。如果我们有一致的启发法,我们可以更早地做到这一点;当我们遇到它时,我们可以立即追溯路径,而不是先把它推到n
打开
然后再等到我们再次弹出它。如果h是一致的,当你遇到目标时,你怎么能立即得出结论?参见“单调性的后果”部分你没有回答这个问题。但是谢谢你的通知。