使用Floyd-Warshall算法寻找迷宫

时间:2012-12-17 11:49:47

标签: c# algorithm graph-algorithm path-finding floyd-warshall

我正在尝试使用Floyd的算法通过一个带有98个航路点(位于每个迷宫顶点)的迷宫生成最快路线矩阵。当算法运行时,它会填充两个矩阵 - 距离矩阵(两个节点之间的最佳距离)和路径矩阵(下一个节点将转到任意两个节点之间的最佳路径)。

使用在先前代码中生成的邻接矩阵来初始化距离矩阵。我还生成了一个数据结构,其中包含指向每个航路点的四个可能的相邻航路点中的每一个的指针,但我没有使用这种数据结构来生成路径矩阵。

这是我的c#代码:

        // Initialize distance path matrix
        distanceMatrix = adjacencyMatrix;

        // Initialize path matrix
        int N = (WaypointList.Count);
        pathMatrix = new int[N, N];

        for (int i = 0; i < N; i++)
            for (int t = 0; t < N; t++)
                pathMatrix[i,t] = t;

        // Floyd-Warshall algorithm            
        for (int k = 0; k < N; ++k)
            for (int i = 0; i < N; ++i)
                for (int j = 0; j <= i; ++j)
                {
                    int currentCombo = distanceMatrix[i, k] + distanceMatrix[k, j];
                    if (currentCombo < distanceMatrix[i, j])
                    {                            
                        distanceMatrix[j, i] = distanceMatrix[i, j] = currentCombo;
                        pathMatrix[j, i] = pathMatrix[i, j] = k;
                    }
                }

我相信我正在错误地计算Path矩阵,因为使用此代码生成的Path矩阵的机器人在大多数情况下失败(因为Path矩阵告诉要穿过墙等)。

我已经盯着这段代码好几个小时了,我很难过我做错了什么。如何在迷宫导航代码中生成正确的路径矩阵?

1 个答案:

答案 0 :(得分:1)

当您设置pathMatrix[i, j] = k时,您假设这意味着从节点ij的路径将从转到节点k开始。但实际上,这意味着从ij的路径在某个时刻会经过k,而不一定是第一步。

您需要做的是以下内容,假设从ij的路径为:

target = j
while there is no edge from i to target:
    target = pathMatrix[i, target]

这会将target设置为从i转到的下一个节点。