A * Pathfinding - 更新父级

时间:2014-03-03 23:47:19

标签: path-finding a-star

我已阅读A* Pathfinding for Beginners并查看了C ++和其他语言中的几个源代码实现。我理解发生的大部分内容,除了我认为我发现的一个可能的问题,我发现的任何教程/实现都没有涵盖这个。

当你到达这个部分时:

  

如果相邻的正方形已经在开放列表中[...],如果G成本   新路径较低,将相邻方块的父级更改为   选定的广场。最后,重新计算F和G的分数   那个广场。

改变广场的G分数也应该改变每个孩子的G分数,对吧?也就是说,已经有这个方格作为父母的每个方格现在也应该得到一个新的G分数。那么,你不应该在公开名单中找到每个孩子(和孩子的孩子)的方格并重新计算G值吗?这也将改变F值,所以如果使用排序列表/队列,这也意味着一堆诉诸。

这不是一个实际的问题,不值得为额外的计算额外的CPU,这就是为什么我看到的实现只是忽略了这个问题(不更新孩子)?

2 个答案:

答案 0 :(得分:2)

这取决于你的启发式。

为了正确,基本的A *算法要求您拥有admissible heuristic,即永远不会高估从节点移动到目标的最低成本的算法。但是,使用可接受的启发式搜索可能并不总能找到沿途的中间节点的最短路径。如果您的启发式情况就是这种情况,您可能会稍后找到您已访问过的节点的较短路径,并需要再次展开该节点的子节点。在这种情况下,您不应该使用关闭列表,因为如果您不断寻找更短的路线,您需要能够多次重新访问节点。

但是,如果您使用consistent heuristic(意味着节点的估计成本永远不会超过其邻居的估计成本,加上从该节点移动到该邻居的成本),只会通过最短路径访问节点。这意味着您可以使用已关闭的列表,并且在扩展其子节点后再也不会重新访问节点。

所有一致的启发式算法都是可以接受的,但并非所有可接受的启发式算法都是一致的。尽管如此,大多数可接受的启发式方法也是一致的,因此您经常会看到A *的描述和示例代码,它们假设启发式是一致的,即使它没有明确说明(或仅提及可接受性)。

在您链接的页面上,算法使用封闭列表,因此需要一致的启发式方法才能保证找到最佳路径。然而,考虑到它处理对角线移动的方式,它使用的启发式(曼哈顿距离)不一致(或者可接受)。因此,虽然它可能找到最短的路径,但它也可能找到一些其他路径并错误地认为它是最短的路径。更合适的启发式(例如,欧几里德距离)既可以接受也可以保持一致,并且你肯定不会遇到麻烦。

答案 1 :(得分:0)

@eselk : 由于要更新其父级和 G-score 的 square 还在 OL 中,所以这意味着它尚未扩展,因此 OL 中将没有该 Square 的子级.因此,不会更新孩子的 G 分数,然后再更新他们的孩子。如果不清楚,请告诉我。