关于m-by-n矩阵的Floyd-Warshall算法

时间:2011-12-19 19:31:10

标签: algorithm graph-theory floyd-warshall

我正在尝试在迷宫上实施Floyd-Warshall算法来计算从一个点到迷宫内所有其他点的距离。出于某种原因,当我使用等于列和行之间的最大值的k时,我得到的答案不正确。

有没有办法用k的值解决这个问题,这对于给定迷宫的所有长度都是正确的?

换句话说,有没有办法将Floyd-Warshall算法用于非n×n矩阵?也就是说,对于m×n矩阵,其中m!= n

4 个答案:

答案 0 :(得分:1)

没有

你似乎对Floyd-Warshall算法中矩阵的目的感到困惑:对于迷宫中的两个位置i,j,矩阵A [i,j]存储边缘i的重量 - > j(如果没有边缘,可能是无穷大)。列和行都表示位置,对于非方形矩阵来说它是无意义的。

如果你有一个大小为M x N的矩形迷宫,并且所有可能的位置都是可能的,那么你需要(M * N)x(M * N)矩阵用于Floyd-Warshall算法。假设你只能向4个方向走,这真是浪费空间。

如果你想要一个顶点的最短路径,使用Dijkstra的算法,它会快得多。如果边缘没有重量,甚至更好,请使用普通BFS。

答案 1 :(得分:1)

如果迷宫是窄通道排序(这很常见,可能就是这里的情况)那么每个单元格都有一个顶点没有意义,因为它会添加绝对不必要的顶点,每个路径的成本是相同的(加权)。

对图形建模的正确方法是为每个交点(不是角点)指定一个顶点。 I. e。如果在任何时候选择是在3或4个方向之间放置一个顶点。如果你只能前进或后退,那么指定一个顶点。

即使对于大型迷宫,这也会产生相当紧凑的顶点数。

接下来,一对顶点之间的路径的权重就是两个顶点之间的孤立直接路径上的平方数。这可以通过进入顶点的最大四个方向并计算跳数来轻松计算。

因此,您从顶点和路径权重开始,我相信Floyd-Warshall会在每对之间给出最短的路径长度,没有问题。

矩阵将是NxN(而不是MxN等)

编辑:此外,如果您的迷宫不是“窄通道”排序,并且您通常可以进入所有四个方向,那么使用A * - 而不是Floyd-Warshall或图算法搜索或模拟退火或一组全局优化算法。 (A * -search是我推荐的)

答案 2 :(得分:0)

the Wikipedia article开始,似乎可以在非方阵上使用Floyd-Warshall。我不太熟悉算法的细节来解释如何,但我会继续关注它。

基于我对迷宫的了解,​​我认为第一步是生成一个代表迷宫的图形,每个非墙“边缘”由1表示,每个墙由无穷大或某些表示非常多。

答案 3 :(得分:0)

我在这个算法中没有找到问题的原因。据我所知,该算法对矩阵的大小没有任何限制(注意:你可以使用任何图形!)。

wikipedia的快速概述证实了我的猜测。

我只能认为您的实施或图表定义中可能存在错误。另外,你有没有任何负面的周期?