在A *搜索算法中,遍历打开列表时要检查什么?

时间:2019-05-04 18:32:14

标签: algorithm path-finding a-star

在存储第一个节点之后下一步该怎么做,我有点困惑。在wikipedia page about A*中,它表示忽略已经在封闭集中的邻居,如果没有,则将其添加到开放集中,如果不存在,则检查g得分。

但是,在此页面https://brilliant.org/wiki/a-star-search/上,它说要检查“邻居的g值是否低于当前值并且在封闭列表中”,然后替换邻居的g值,否则,如果“当前g值较低并且邻居在打开的列表中”“然后用新的,较低的g值替换邻居”

因此,我对要检查的内容感到困惑。如果该节点已经在封闭集中,我是否应该忽略它?还是需要检查它的g值并用它替换邻居的节点?

在A *中拥有第一个节点后该怎么办?

1 个答案:

答案 0 :(得分:1)

如果我们找到封闭集合中的邻居,则意味着我们已经更早访问了它。这意味着两件事之一:

  1. 它的g得分已经已经很小,因此永远不会执行Brilliant上的额外条件。

  2. 启发式函数h是不允许的,即,它高估了达到目标的实际最小成本。在这种情况下,Brilliant上的代码可能会找到略短的路径,但是不能保证找到最短的路径。要使用不允许的试探法找到最短路径,您需要“重新打开”此类节点。这将导致该算法多次重新访问整个子图,这将严重损害复杂性,而这不是Brilliant代码正在做的事情。

总结:Brilliant版本与Wikipedia版本之间的区别在于,处理一个小巧的案例,如果给A *提供了“正确”(允许的)启发式函数,这种情况将永远不会发生。

  

因此,我对要检查的内容感到困惑。如果该节点已经在封闭集中,我是否应该忽略它?还是需要检查它的g值并用它替换邻居的节点?

我将遵循Wikipedia代码,完全忽略封闭集中的节点。