2D寻路算法

时间:2012-02-10 07:12:33

标签: c# path-finding a-star

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

  1. 地图上没有障碍物。
  2. 地图是“环绕式”,意味着AI可以穿过一个边界移动并出现在另一侧。 (就像旧诺基亚手机上的蛇游戏一样)
  3. 但是,如果起点和目的地之间存在链接路径,则该路径的行程时间将减少10%。
  4. 必须采取最短路径。
  5. 正常A *算法似乎不符合这些要求,因为它不允许从一个边界传送到另一个边界,并且是Best-First。那么,我该如何解决这个问题?

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

1 个答案:

答案 0 :(得分:3)

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 *算法,存储您访问过的每个点,并遍历此处的。请注意,您不能再处理有问题的点,而是必须跟踪每个点的边缘。

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