Artificial intelligence A*当启发式仅允许但不一致时重新打开

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

下面给出了我遵循的A*伪代码:

我的问题是:我们如何确定在找到目标状态时可以返回?与所有其他封闭状态一样,它们可以从新的开放状态重新开放。所以,如果我有一个从OPEN得到的状态,并且我看到我可以从该状态走一条更好的路径到封闭目标,那么我至少应该更新它的值。难道我们不应该等到所有州都关闭了吗?

这是因为:


  • 启发式仍然是可接受的,这意味着节点的启发式成本
    h(n)
    必须始终小于或等于真实(未知)剩余成本
    h*(n)
    h(n)这个问题很好。我遇到了同样的问题。感谢@LearningMath
    由于@Dennis Soemers,收到的答案几乎是正确的。
    但我从丹尼斯·苏默斯的评论中发现了一些错误,这让我很困扰

    如果
    h
    是一致的,您可以1)删除for循环中的第一个部分,看看您是否找到了到已关闭节点的更有效路径(如果新节点已处于
    已关闭的
    ,您可以继续
    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)
    
    因此,节点
    n
    已经具有min
    f
    。 事实上,我的上述推导证明了可容许的启发式算法保证了最优解。更多信息请参阅:


    我希望我已经向您说明了这个问题。

    关于开放式平台上的f值不会变得更好的说法是不正确的。这是因为所考虑的启发式是不一致的,只允许的。F值不是非递减的。在这种情况下,这实际上是重新打开已关闭节点的要点。对于“不会变得更好”,我的意思是它们“不会变得比目标节点的
    f
    -分数
    n
    更好”。这仍然是正确的
    n
    根据定义必须具有
    h(n)=0
    ,因此
    f(n)=g(n)
    ,因为它已经是目标,并且必须具有可接受的启发式。所有其他仍处于
    打开状态的节点必须至少具有与
    f
    -相同大的
    f
    -分数,并且由于可接受的启发式假设,这些
    f
    -分数也不能高估,它们必须完全正确或低估了从它们到目标的成本。严格来说,它们永远不会比
    n
    好。请注意,这是有效的,因为我们只会在再次弹出
    OPEN
    后检查
    n
    是否是目标。如果我们有一致的启发法,我们可以更早地做到这一点;当我们遇到它时,我们可以立即追溯路径,而不是先把它推到
    打开
    然后再等到我们再次弹出它。如果h是一致的,当你遇到目标时,你怎么能立即得出结论?参见“单调性的后果”部分你没有回答这个问题。但是谢谢你的通知。