【问题标题】:Complicated pathfinding algorithm复杂的寻路算法
【发布时间】:2016-08-20 05:11:40
【问题描述】:

我正在为 3D 游戏编写一个系统,该系统允许相机在节点网络之间移动。

在我的项目中,我编写了一个代表节点的类。与二元节点类不同,每个节点只能有一个父节点,但可以有任意数量的子节点。 使用我的真正了不起的绘画技巧,我开发了一个代表这些节点网络的图像:

在本例中,“根节点”为红色,黄色路径最短,蓝色路径最长。
这里要注意的重要一点是,实际的子节点的数量并不重要,而是添加的路径长度他们。因此,在计算最短路径时不需要使用启发式算法,因为最短路径的组合长度最短。

那么你将如何编写一个递归函数来遍历这棵树,并返回最短路径?


更新

尽管我的绘画技巧很棒,但我觉得它并不能完全说明我的问题,也许需要更详细的解释......

首先,这是针对 3D 世界空间中的相机系统。世界将充满一堆这样的节点,相机将被放置在其中一个节点上。玩家可以向任何方向看,但不能在不向给定方向单击鼠标的情况下移动。一旦发生点击事件,就会向他所面对的方向发射光线投射,检索他与距离他的X 之间的节点列表。这里的目标是找到连接到他的最远节点,然后找到到达那里的最短路径......

所以第一个问题实际上是检查最远的“命中”节点是否实际上比下一个最近的“命中”节点更快。最远的节点可能包含实际上比它前面的节点 的路径,所以我还需要某种方法来检查这一点。所以心中有一个目标,但目标可能更改为稍微靠近一点的节点,让事情变得更加复杂。

是的,虽然节点可能只有一个父节点(如上所述),但这个“树”实际上应该可以从网络中的任何节点向任何方向遍历,将玩家当前所在的节点视为“根” " 节点。

【问题讨论】:

  • 我们可以提供How to find the shortest simple path in a Tree in a linear time? 的副本还是您的问题还有更多?
  • 构建图形的 Dijkstras 算法将为您修复它。看看吧。我不久前做过这个,它就像一个魅力。它找到任意两个节点之间的最短路径,并告诉要遵循的节点/路径是什么。但是我错过了绘画技巧
  • 也许您想查看Dijkstra's algorithm 的维基百科页面。它还有一个很好的动画。唯一的区别是,不是在到达目标节点时终止,而是在任何叶子节点上终止。
  • 我不明白你想要什么。你想计算所有孩子的路径吗?然后不管你使用什么算法,选择任何算法(深度优先,广度优先)。如果你想找到两个给定节点之间的最短路径,那么“最短”部分是无关紧要的:因为任何节点只能有一个父节点(它是一棵树),所以只有一条路径。一或零。我是不是误会了什么?附言你的绘画技巧很棒:)
  • @freeNick 每个连接都有权重。所以每条路径都有不同的值:连接权重之和

标签: c++ path-finding unreal-engine4


【解决方案1】:

Dijkstras 算法将为您解决此问题。您需要向您的系统提供图表:有多少节点,每个节点的邻居是谁,每个连接的权重......等等。只需查找即可。我不久前做过这个,它就像一个魅力。它找到任何两个节点之间的最短路径,如果你稍微调整一下(我不得不调整我当时在 onlien 找到的内容),它会告诉你要遵循的节点/路径是什么。但是我错过了绘画技巧

一些实现版本HERE

【讨论】:

  • 这真的只是 Dijkstra 的算法吗?看起来很相似......除了在我发布的示例中,您没有想要达到的预定义“目标”。无论遍历了多少子节点,目标都是从根节点开始的最短路径。
  • @reck 这是一个额外的功能,它为您提供了任意两个节点之间的最短距离。在您的情况下,如果我理解正确,源将是根,目标将是所有叶子(循环),然后选择最小值
  • 如果您允许 Dijkstra 算法解析整个图(即它的唯一终止条件是开放集为空),那么它将为每个节点分配一个距根节点的距离值。然后,您只需遍历每个节点即可找到最低和最高值。
  • 我恢复了那句话,实际上有一个目标(阅读我更新的问题)
  • @rec 你能用你的真正令人惊叹的绘画技巧,画出玩家看到的东西和节点是如何连接的精确图表,而不是你脑海中的样子吗?现在?因为我没有看到任何不同或 Dijkstra 无法解决的任何问题
【解决方案2】:

我猜你想表示你的 3d 世界是空间中可访问点的图形。忘掉树吧,它们只是图的特例。 然后研究 Dijkstra 的算法。如果您需要提高效率,请查看 A*,这是对 Dijkstra 的改进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    相关资源
    最近更新 更多