【问题标题】:2D pathfinding algorithm二维寻路算法
【发布时间】:2012-02-10 07:12:32
【问题描述】:

我正在尝试编写一段代码,在 2D 地图中找到最短路径,但有一些限制:

  1. 地图上没有障碍物。
  2. 地图是“环绕式”地图,这意味着 AI 可以穿过一个边界并出现在另一侧。 (很像旧诺基亚手机上的蛇游戏)
  3. 但是,如果起点和目的地之间存在链接路径,则该路径的行程时间将减少,例如 10%。
  4. 必须采用最短路径。

普通 A* 算法似乎不符合这些要求,因为它不允许从一个边界传送到另一个边界,并且是最佳优先算法。那么,我该如何解决呢?

因为我是在 C# 中做的,所以 C# 中的任何相关示例都适用

【问题讨论】:

  • 您可能也想尝试遗传算法来解决这个问题。你只需要找到一个足够的适应度函数。

标签: c# path-finding a-star


【解决方案1】:

A* 算法将满足您的要求,您只需要稍微不同地考虑它。 A* 不仅仅是一个网格算法,它还是一个图遍历算法。

因此,为了做到这一点,您必须将地图表示为一系列相互连接的点。然后这些点可以像一个大圆环一样环绕。然后每个点都有与其他点的连接,并且这些边具有权重,因此遍历不同的边对您的算法来说更加“昂贵”。

Wikipedia 有一个这种图遍历页面下方的示例,带有加权边缘。

编辑:详细说明环绕问题。假设你有一个像这样环绕的简单点网格

+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 4 | 5 | 6 |
+---+---+---+
| 7 | 8 | 9 |
+---+---+---+

通常这里的边缘是

1-2, 2-3, 4-5, 5-6, 2-5, 3-6, 4-7, 5-8, 6-9, 7-8, 8-9

为了使这个环绕你需要添加边缘

1-7, 2-8, 3-9, 1-3, 4-6, 7-9

到边缘列表。然后,您将正常应用 A* 算法,存储您访问过的每个点,并从该点遍历您所拥有的 edges。请注意,您不能再只处理有问题的点,而是必须跟踪每个点的边缘。

为了处理某些部分更容易的问题,您在边缘上存储一个额外的值以确定遍历它们的难度。假设每条边的值为 1,但边 4-5 的遍历难度是前者的两倍。然后将值 2 分配给该边,并在计算启发式算法以计算到目标点的距离时使用该值。

【讨论】:

  • 骗你详细说明?特别是关于我如何处理上述第二点。
  • 我已经详细说明了答案,希望对您有所帮助。
  • 那么什么时候应该将一条边添加到封闭列表中?
  • 边不会被添加到打开和关闭列表中,只有节点。边仅用于确定从给定节点可以到达哪些节点以及移动的遍历成本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
  • 2011-10-18
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多