Nodes 如何修剪贪婪最佳优先搜索和A*算法返回的节点?

Nodes 如何修剪贪婪最佳优先搜索和A*算法返回的节点?,nodes,graph-algorithm,a-star,greedy,Nodes,Graph Algorithm,A Star,Greedy,我正在尝试用网格(2D数组)实现GBFS和A*。我想在我们进一步讨论之前……这两种算法是否都记得以前的位置,如果是,这是否意味着如果启发式更好,它将跳转到该位置,即如果兄弟姐妹的子节点的启发式比当前节点的子节点的启发式更好,它是否会跳转到兄弟姐妹的子节点?更好的解释是,例如,如果我有一个8x8网格,我在坐标7,7上,我检查它旁边的单元格,但在优先级队列中,我们有一个坐标3,5,它比7,7旁边的单元格具有更好的启发式…我们会跳到3,5吗 如果答案是肯定的,那么我的问题是,如果我们可以从一个位置跳到

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

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

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

两人都同意

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

通过这种方式,您可以沿着父节点链从任何节点回溯到起始节点

如果我有一个8x8网格,我在坐标7,7上,我检查它旁边的单元格,但在优先级队列中,我们有一个坐标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的父母的父母的父母
  • 等等
这将最终使您返回到开始节点,这是您的路径(相反)


以基于的图像为例。每个箭头都代表一个父指针。每次搜索从一条路径“跳转”到另一条路径时,我都会改变颜色。请注意如何从搜索过程中访问的任何节点开始,然后按照箭头返回开始节点

嗨,谢谢。但这不会仍然返回不需要的节点吗啊,你说我可以把它都扔掉是什么意思?谢谢,到目前为止真的很有帮助。但同样令人恼火的是,现在我意识到我还有很多工作要做:因此,你说每个节点的父节点不应该存储在节点本身中,而是存储在搜索中的某个地方,因为它是搜索的属性,而不是节点?从概念上讲,你所说的一切都是有意义的,但从编程角度来说,我怎么能做到这一切?例如,如您在此处所示,0,7的父对象是1,7。但事实上,我们已经从6,7或者其他什么东西,得到了0,7……它跨越了网格。由于上次访问的便笺是6,7,因此在展开0,7之后,我们如何找到它的父项…顺便说一下,感谢您的演示:)请不要在有人花时间为您回答问题后删除您的问题。