Artificial intelligence 是维基百科';s Astar参考实现不完整?它似乎忽略了正确更新更便宜的路径

Artificial intelligence 是维基百科';s Astar参考实现不完整?它似乎忽略了正确更新更便宜的路径,artificial-intelligence,path-finding,a-star,Artificial Intelligence,Path Finding,A Star,我想实现一个*并寻找一个引用 在以下情况下,它可能会失败。考虑三个节点A、B和C START -> A -> C -> GOAL | ^ \-> B 路径成本为: START -> A : 10 START -> B : 1 B -> A : 1 A -> C : 100 C -> GOAL : 100 显然,解决方案是START->B->A->C->GOAL,但是如果启发式方法允许我们在扩展B

我想实现一个*并寻找一个引用

在以下情况下,它可能会失败。考虑三个节点A、B和C

START -> A -> C -> GOAL
     |   ^
     \-> B
路径成本为:

START -> A : 10
START -> B : 1
B -> A     : 1
A -> C     : 100
C -> GOAL  : 100
显然,解决方案是
START->B->A->C->GOAL
,但是如果启发式方法允许我们在扩展B之前扩展A,会发生什么呢

我们的启发式成本如下(注意这些都是低估的)

当A展开时,C的真实成本将高于B的启发式成本,因此B将在C之前展开

很好,对吧

我看到的问题是,当我们扩展B并将数据“A来自起始成本为10”替换为“A来自B成本为2”时,我们也没有将“C来自A成本为110”更新为“C来自A成本为102”。维基百科的伪代码中没有任何东西看起来会向前传播更便宜的路径。现在想象另一个节点D可以到达成本为105的C,它将错误地覆盖“C来自成本为110的A”


我读错了吗?或者维基百科需要修复吗?

如果您使用的是图形搜索,即您记得您访问了哪些节点,并且不允许重新访问这些节点,那么您的启发式方法是不一致的。文章中说,要使启发式保持一致,需要坚持以下几点:

h(x) <= d(x, y) + h(y) for all adjacent nodes x, y
h(x)A)+h(A)=1+10=11
。因此,您的启发式是不一致的,在这种情况下,*不起作用,正如您正确地注意到的,正如维基百科文章中提到的:

如果使用树搜索,即允许算法重新访问节点,则会发生以下情况:

将A和B添加到队列中,分数(A)=10+10=20,分数(B)=1+50=51

从队列中选择得分最低的队列。将C添加到得分(C)=10+100+h(C)的队列中

从队列中选择B,因为它现在是最小的。将分数(A)=2+10=12的A添加到队列中

从队列中选择一个,因为它现在又是最小的。请注意,我们使用的是树搜索算法,因此可以重新访问节点。将C添加到得分(C)=1+1+100+h(C)的队列中

现在我们在队列中有两个元素,C通过A得分为110+h(C),C通过B,A得分为102+h(C),因此我们选择了通过B和A到C的正确路径

维基百科伪代码是第一种情况,即图形搜索。他们确实在伪代码下声明:

备注:上述伪代码假设启发式函数是单调的(或一致的,见下文),这是许多实际问题中的常见情况,例如道路网络中的最短距离路径。但是,如果该假设不成立,则可以重新发现封闭集中的节点,并提高其成本。换言之,如果保证存在解,或者如果算法经过调整,使得只有当新节点的f值低于任何先前迭代时,才将其添加到开放集,则可以省略封闭集(生成树搜索算法)


最后一段的可能重复使我困惑。“如果保证存在解,则可以省略闭集”--这一措辞意味着单调启发式的情况就是如此,同时这不是上述伪码的情况,因为它包括闭集,因此上述伪码对于非单调启发式是正确的。你能进一步澄清一下吗?如果在没有解决方案的情况下忽略了闭集,你将永远添加节点。这个假设与启发式的单调性无关。一个问题解决方案的存在与你选择什么样的启发式方法来解决这个问题无关。
h(x) <= d(x, y) + h(y) for all adjacent nodes x, y