【问题标题】:Given a start and goal ,how to find the shortest way in a navigation mesh?给定起点和目标,如何在导航网格中找到最短路径?
【发布时间】:2016-03-19 04:15:28
【问题描述】:

我在 Google 上搜索了“导航网格上的 A* 算法”,结果却得到了估计 g 值的错误方法,就像这样

或者这个

通过总结蓝色线段的长度,我们得到了g值,但它被高估了(g值应该被低估了)。这个算法会返回一个优化的路径,但不保证是最短的。

我能想到的唯一方法是根据导航网格绘制可见性图。但这会消耗太多内存。

还有其他方法可以计算导航网格中的最短路径吗?

【问题讨论】:

  • 我认为您应该多研究 A* 算法,尤其是它做出的假设和提供的保证。这样,您还可以提出更有意义的问题。例如,您的问题没有准确定义认为 A* 输出的错误之处。
  • @UlrichEckhardt A* 是对的,但我不能直接将 A* 算法应用于网格导航图。A* 需要具有节点和边的典型图,以便它可以应用类似 Dijkstra 的搜索找出最短路径。搜索完成后,没有路径可以比现在返回的路径短。但是导航网格不是只有节点和边的图形,它由可通行的区域组成,所以我用谷歌搜索了如何应用导航网格上的 A*。
  • 那些文章要么将通过所有多边形质心的曲折路径或通过所有边的中点的曲折路径视为 g 值。但这是错误的,这种 g -value 高估了从起点到当前多边形(或边)的距离。所以当搜索完成时,所有未检查的路径都被高估并放弃了。
  • 所有路径长度都被高估了,没有人知道任何未经检查的路径的下限。所以除非我们检查所有可能的路径,否则总是存在比我们已知的路径更短的路径。跨度>
  • 对不起我的英语不好。

标签: c++ graph path-finding a-star navmesh


【解决方案1】:

为了获得更接近您的意思的最短路径,您应该停止使用固定点作为 A 星节点,即停止使用三角形中心或三角形边缘的中心。

尝试在 A 星传播时移动这些点。 例如,在三角形的边上使用 A 星节点:

  • 下一个A-star节点的三角形边与前一个A-star节点和目的地形成的线段的交点

  • 或距上述交点最近的点在下一个A星节点的三角形边缘

或者,尝试在按照当前完成的 A-star 计算后更改路径节点,使用类似的标准。

请注意,这将使最终路径变得平滑(如图纸上的红线)。 但这只会有助于减少高估,这并不能保证找到您想要的最短路径。

更好的是,在使用三角形边缘的中心计算您的 A 星之后尝试更改路径节点,使用字符串拉动 a.k.a 漏斗算法。这将为您提供通过 A-star 的输出路径穿过的三角形的最短路径。

【讨论】:

  • 我最终选择用C++实现一个可见性图生成器,这是唯一合理的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 2015-06-06
相关资源
最近更新 更多