【问题标题】:Is an open and closed list essential for a star search.是星搜索必不可少的开放式和封闭式列表。
【发布时间】:2017-11-07 14:10:48
【问题描述】:

我正在尝试在 Unity 中创建一个使用星搜索算法的寻路系统。

我的问题是,是否可以在没有开放和封闭列表的情况下实现算法?

我的代码目前的工作方式如下:

  • 当前节点最初设置为起始节点。
  • 搜索当前节点的相邻节点列表,返回f成本最低的节点(计算公式:f(n) = g(n) + h(n)
  • 这个代码最低的节点被设置为nodeToMoveToNext。
  • 当前节点设置为 nodeToMoveToNext。 过程重复,直到 currentNode 是 targetNode。

此代码有效,我可以移动到目标目标,为什么我需要打开和关闭列表?

【问题讨论】:

  • 撞墙需要转身就不行了……

标签: c# unity3d path-finding a-star


【解决方案1】:

关闭列表可用于确保您不会两次检查同一节点(并再次退后一步)。这取决于您如何设置节点结构。假设您在节点的上方、下方、左侧和右侧定义“邻居”。

Node1 有邻居:

Node2(f=2)、Node3(f=10)、Node4(f=15) 和 Node5(f=20)。

所以你进入 Node2。

->Node2 有以下邻居:

Node5(f=20), Node6(f=24), Node7 (f=30) AND Node1(f=2)

=> 你回到 Node1 并一遍又一遍地做同样的事情。

所以这在很大程度上取决于您如何为您的案例定义它。例如,您还可以在每个节点上使用一个 bool 来表示它已经被评估。

您可能需要检查

https://en.wikipedia.org/wiki/A*_search_algorithm

以及伪代码后的“备注”注释。

【讨论】:

  • 好的,谢谢,为什么需要封闭列表很有意义。现在,关于开放列表:根据我的阅读 - 开放列表包含“当前发现的尚未评估的节点集”。那么我会将当前节点的相邻节点存储在打开列表中吗?
  • 是的,如果它们尚未在关闭列表中,则将它们添加到打开列表中。我建议您阅读 en.wikipedia.org/wiki/Dijkstra%27s_algorithm ,首先了解它的工作原理将极大地帮助您实现 A*。
【解决方案2】:

这里不需要列表,因为您不使用星搜索算法。

至于移动到目标的能力,在我看来,您的代码没有处理简单的障碍(点、1 和 2 是空节点,S 是开始,G 是目标,星星是墙):

...S...
..*1*..
..*2*..
..***..
...G...

如果只针对当前节点的相邻节点,您将直接进入死胡同并永远停留在那里上下。当您在位置 1 时,2 将是具有最低代码的节点。当你在 2 时,将是 1。以此类推。

【讨论】:

  • 谢谢,这很有意义,我明白现在需要关闭列表。但是,我有一个关于我作为对上述答案的评论发布的开放列表的后续问题。任何帮助表示赞赏:)
猜你喜欢
  • 2013-04-15
  • 2017-02-17
  • 2016-09-05
  • 2010-09-15
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多