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

In A* search algorithm what do you check for when looping through the open list?

我对存储第一个节点后的下一步操作感到有点困惑。在 wikipedia page about A* 中,它表示忽略已经在封闭集中的邻居,但如果它不存在,则将其添加到开放集中(如果不存在)并检查 g 分数。

但是在这个页面 https://brilliant.org/wiki/a-star-search/ 上,它说检查 "neighbor has lower g value than current and is in the closed list" 是否然后替换邻居的 g 值 else if "current g value is lower and this neighbor is in the open list" "then replace the neighbor with the new, lower, g value"

所以我对要检查的内容有点困惑。如果节点已经在封闭集中,我是忽略它还是我还需要检查它的 g 值并用它替换邻居的值?

有了A*中的第一个节点后我该做什么?

如果我们找到一个在封闭集中的邻居,这意味着我们之前已经访问过它。这意味着以下两件事之一:

  1. 它的 g 值已经是最小值,所以 Brilliant 的额外条件永远不会被执行。

  2. 启发式函数 h 不可接受,即它高估了实现目标的实际最小成本。在这种情况下,Brilliant 上的代码可能会找到稍短的路径,但都不能保证找到最短的路径。要使用不允许的启发式方法找到最短路径,您需要 "reopen" 这样的节点。这将导致算法多次重新访问整个子图,这将严重损害复杂性,这不是 Brilliant 代码正在做的事情。

总而言之:Brilliant 和 Wikipedia 版本之间的区别在于处理一个小的极端情况,如果 A* 被赋予 "correct"(可接受的)启发式函数,这种情况永远不会发生。

So I'm sort of confused on what to check for. Do I ignore the node if it's already in the closed set or do I need to also check it's g value and replace the neighbor's with it?

我会遵循维基百科代码并完全忽略封闭集中的节点。