我正在尝试编写一段代码,在2D地图中找到最短路径,但有一些限制:
正常A *算法似乎不符合这些要求,因为它不允许从一个边界传送到另一个边界,并且是Best-First。那么,我该如何解决这个问题?
因为我在C#中这样做,所以C#中的任何相关示例都是适用的
答案 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分配给该边,并在计算到目标点的距离的启发式算法时使用该值。