3

我正在尝试使用网格(二维数组)实现 GBFS 和 A*。我想在我们进一步讨论之前......这两种算法都记得以前的位置吗?如果是,这是否意味着如果启发式更好,它会跳转到那个位置,即如果它会跳转到兄弟姐妹的孩子的节点,如果兄弟姐妹的孩子比当前节点的孩子有更好的启发式?更好的解释是,例如,如果我有一个 8x8 网格并且我在坐标 7,7 上,我检查了它旁边的单元格,但在 PriorityQueue 中,我们有一个坐标 3,5,它比下一个单元格具有更好的启发式到 7,7...我们会跳到 3,5 吗?

如果答案是肯定的,那么我的问题是如何从已从 PriorityQueue 中删除的返回节点创建正确的路径,因为我们可以从一个位置跳转到另一个位置?即我们如何修剪节点以创建实际路径?

4

1 回答 1

1

两种算法都记得以前的位置吗?如果是,这是否意味着如果启发式更好,它将跳转到该位置,即如果兄弟姐妹的孩子比当前节点的启发式更好,它会跳转到兄弟姐妹的孩子的节点吗?孩子们?

两者都是。

当您将节点插入优先级队列时,您应该跟踪它们的“父”节点,即它们之前的节点。例如,如果您在 7,7,然后将 8,7 添加到队列中,则应将 8,7 的父级设置为 7,7。

这样,您可以通过跟随父链从任何节点回溯到起始节点。

如果我有一个 8x8 网格并且我在坐标 7,7 上,我检查它旁边的单元格,但在 PriorityQueue 中,我们有一个坐标 3,5,它比 7,7 旁边的单元格具有更好的启发式...我们会跳到 3,5 吗?

是的。在 7,7 之后考虑 3,5 并不意味着玩家“跳”到 3,5。这意味着他现在正在考虑另一条路径,因为通过 3,5 的路径似乎比通过 7,7 的路径更有希望,至少暂时如此。

如何从已从 PriorityQueue 中删除的返回节点创建正确路径?

最终您将到达目标节点。假设目标节点是 6,6,而您从 6,5 到达那里。你如何重建让你到达那里的路径?

  • 看看 6,5 的父母。
  • 看看 6,5 的父母的父母。
  • 看看 6,5's parent's parent's parent。
  • 等等

这最终会让你回到起始节点,这就是你的路径(反向)。

GBFS 父母

根据您之前的问题获取此示例图像。每个箭头代表您拥有的一个父指针。每次搜索从一条路径“跳转”到另一条路径时,我都会更改颜色。请注意如何从搜索期间访问的任何节点开始,然后按照箭头返回开始节点。

于 2012-11-20T21:48:55.737 回答