java - 2D 路径点寻路 : combinations of WPs to go from curLocation to targetLocation

标签 java artificial-intelligence 2d path-finding graph-algorithm

请花点时间了解我的情况。如果不明白,请在评论中告诉我。

我有一个航点数组列表。这些路径点没有任何顺序。航点具有以下属性:
{int type, float z, float y, float x, float rotation}

这适用于 3 维世界,但由于我的寻路不应该关心高度(因此将世界视为 2 维世界),因此忽略 y 值。旋转对于这个问题并不重要。

  • 在这个二维世界中,x 代表 x 轴,z 代表 y 轴。
  • 如果 x 增加,世界中的物体就会向东移动。如果 x 减小,则世界中的物体向西移动。
  • 如果 z 增加,世界中的物体就会向北移动。如果 z 减小,则世界中的物体向南移动。

因此,这些"new"航路点可以简化为:waypoint = {float x, float y} .

现在,这些路径点代表对象的 X 轴 (x) 和 Y 轴 (z) 位置。而且,还有一个当前位置:curLocation = {float x, float y}和目标位置:tarLocation = {float x, float y} .

这就是我想要得到的:
curLocation 出发的所有航路点(又名:路径或路线)组合至tarLocation 在以下严格条件下:

  1. 每个航路点之间的距离不得大于 (float) maxInbetweenDistance 。这包括距 curLocation 的初始距离到第一个航点以及从最后一个航点到 tarLocation 的距离。如果不可能存在这样的路径点组合,则应返回 null。
  2. 当在maxInbetweenDistance内找到多个航路点时从通向目标航路点的航路点,应选择最近的航路点(如果稍微远一点的替代航路点会导致返回距离较长的新路径,那就更好了)。
  3. 返回的航路点组合(路径)的顺序应为从最短路线(最小距离)到最长路线(最大距离)

最后,请考虑以下几点:

  1. 这是我唯一需要做的人工智能/寻路明智的事情,这就是为什么我不希望使用完整的寻路或人工智能框架。我相信一个函数应该能够处理上述问题。
  2. 如果返回路径点的所有可能组合会导致过多的开销,那么如果可以指定最大数量的组合(但仍按从最近到最远的顺序排序)也可以。例如。 5 个最近的路径。

我该如何实现这一目标?如有任何反馈,我们将不胜感激。

最佳答案

我认为你的解决方案是从 Dijkstra's Algorithm 开始首先找到最短路径。您可以将您的航路点视为一个连通图,其中如果节点在 xy 平面上足够近,则它们是相连的,然后应用 Dijkstra(网上有许多示例代码 list )。

现在您已经有了图形从开始到结束的最短路径,它将由图形的 N 条边组成。

接下来您需要创建N 个新图表,每个图表都与第一个图表类似,但最短路线的一段未连接。在这些修改后的图表上找到从起点到终点的最短路线。现在您有 N+1 条路线,您可以按长度排序。

重复此操作,直到找到足够的路径来满足您的需求,或者没有剩余未排名的路径。

我还没有找到这项技术的名称,但它被描述为对 Dijkstra here 的修改.

关于java - 2D 路径点寻路 : combinations of WPs to go from curLocation to targetLocation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5194482/

相关文章:

machine-learning - 为什么 RMSProp 被视为 "leaky"?

artificial-intelligence - 构建 NetHack 机器人 : is Bayesian Analysis a good strategy?

android - Skia 和 Android Paint 绘图对象及其使用或文档

javascript - 在 JavaScript 中显示数百万个对象

java - 如何使用dom解析器在java中重命名xml节点中的属性名称

java - Android:如何编写布局动画而不是 xml

java - 如何在 JPA 2.1 中指定实体映射?

java - 在 Java 中跨类实现 Logger 的标准方法?

java - 限制 Java 中的线程执行处理器周期

c# - 如何通过脚本访问Unity 'Light 2D (Script)'组件?