【发布时间】:2016-08-20 13:47:37
【问题描述】:
我对在 A* 算法中更改节点的父节点感到困惑。 选择新父母似乎有不同的方式:
在此视频中: https://www.youtube.com/watch?v=KNXfSOx4eEE
它说你应该检查这个:
G cost currentNode + movement cost from currentNode <= G cost openListNode
如果是这样,那么我们应该将openListNode的父节点替换为当前节点。
但是在这个实现中: http://www.codebytes.in/2015/02/a-shortest-path-finding-algorithm.html
它有以下代码:
static void checkAndUpdateCost(Cell current, Cell t, int cost){
if(t == null || closed[t.i][t.j])return;
int t_final_cost = t.heuristicCost+cost;
boolean inOpen = open.contains(t);
if(!inOpen || t_final_cost<t.finalCost){
t.finalCost = t_final_cost;
t.parent = current;
if(!inOpen)open.add(t);
}
}
它检查最终成本是: G + H ,这与其他解释相矛盾,因为它应该只是 G 成本,而不是 G 成本和启发式的总和。
谁能解释一下,哪个是正确的?,是实现错误吗?
【问题讨论】:
-
我认为两者的说法相同,但他们使用的词不同。实现看起来正确。我可以为另一个问题(8 题)提供我自己的 A* 实现:stackoverflow.com/questions/31106659/…
-
在任何情况下,您都不应该在更新父节点时将启发式方法纳入您的计算中。启发式值仅用于确定接下来选择哪个节点。
-
@Koekje 所以实现是错误的,对吧?,在我看到的大多数解释中,您只检查“G”成本,而不是“H”,至少不用于更改节点父节点.
-
看了一眼,看来你是对的。
标签: java algorithm implementation a-star