3

我需要一双新的眼睛,由于某种原因,它没有生成正确的序列和距离矩阵,以下是我的实现。

这是在 C# 中,DistanceMatrix 是一个双 [,] 而 SequenceMatrix 是一个字符串 [,]

这些启动如下: http: //puu.sh/951Tz/5ef27e3996.png

for (int k = 0; k < villageCount; k++)
        {
            for (int i = 0; i < villageCount; i++)
            {
                if (k == i)
                    continue;

                for (int j = 0; j < villageCount; j++)
                {
                    if (j == i)
                        continue;

                    if (j == k)
                        continue;

                    if (fw.DistanceMatrix[i, j] >= (fw.DistanceMatrix[i, k] + fw.DistanceMatrix[k, j]))
                    {
                        fw.DistanceMatrix[i, j] = (fw.DistanceMatrix[i, k] + fw.DistanceMatrix[k, j]);
                        fw.SequenceMatrix[i, j] = fw.SequenceMatrix[k, j];
                    }
                }
            }
        }

出于某种原因,我得到以下输出:

    [0, 0]  "A" string
    [0, 1]  "B" string
    [0, 2]  "A" string
    [0, 3]  "B" string
    [0, 4]  "D" string
    [1, 0]  "B" string
    [1, 1]  "D" string
    [1, 2]  "D" string
    [1, 3]  "B" string
    [1, 4]  "D" string
    [2, 0]  "B" string
    [2, 1]  "B" string
    [2, 2]  "B" string
    [2, 3]  "B" string
    [2, 4]  "D" string
    [3, 0]  "B" string
    [3, 1]  "B" string
    [3, 2]  "C" string
    [3, 3]  "C" string
    [3, 4]  "D" string
    [4, 0]  "B" string
    [4, 1]  "E" string
    [4, 2]  "D" string
    [4, 3]  "B" string
    [4, 4]  "E" string

任何指针将不胜感激,如果您需要更多信息,我将在此页面上 F5 :)

初始化后的距离矩阵

    [0, 0]  0.0                                 double
    [0, 1]  50.0                                    double
    [0, 2]  2.0                                 double
    [0, 3]  10.0                                    double
    [0, 4]  1.7976931348623157E+308 double
    [1, 0]  50.0                                    double
    [1, 1]  0.0                                 double
    [1, 2]  3.0                                 double
    [1, 3]  1.7976931348623157E+308 double
    [1, 4]  1.0                                 double
    [2, 0]  2.0                                 double
    [2, 1]  3.0                                 double
    [2, 2]  0.0                                 double
    [2, 3]  5.0                                 double
    [2, 4]  5.0                                 double
    [3, 0]  10.0                                    double
    [3, 1]  1.7976931348623157E+308 double
    [3, 2]  5.0                                 double
    [3, 3]  0.0                                 double
    [3, 4]  1.7976931348623157E+308 double
    [4, 0]  1.7976931348623157E+308 double
    [4, 1]  1.0                                 double
    [4, 2]  5.0                                 double
    [4, 3]  1.7976931348623157E+308 double
    [4, 4]  0.0                                 double
4

3 回答 3

2

我相信我找到了问题所在。

您初始化SequenceMatrix不正确。你目前拥有

fw.SequenceMatrix[i, j] = map.Villages.ElementAt(i).Name;

但是,根据维基百科的文章,它应该是

fw.SequenceMatrix[i, j] = map.Villages.ElementAt(**j**).Name;

由于序列矩阵向您显示了要走的路径,因此其中的值应该是目的地,而不是起点。

看起来你的算法也有错误。你有

fw.SequenceMatrix[i, j] = fw.SequenceMatrix[k, j];

但应该是

fw.SequenceMatrix[i, j] = fw.SequenceMatrix[**i, k**];

由于您已经确定从 i 到 k 到 j 的移动比从 i 到 j 的移动要短,因此您希望设置从 i 到 j 的新路径的第一步与从 i 到的路径的第一步相同ķ。

于 2014-05-28T18:51:40.630 回答
1

也许问题是 inf+inf 不行(溢出)?无论如何,我认为实现应该是这样的

// d[i][j] == weight of edge (i,j)
// d[i][j] == INF if there is no such edge
// d[i][i] == 0; i = 0, .., n-1

for (int k = 0; k < n; ++k)
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            if (d[i][k] < INF && d[k][j] < INF) // i->k, k->j should exist
                d[i][j] = min (d[i][j], d[i][k] + d[k][j]); // INF+INF won't happen
于 2014-05-28T20:24:12.660 回答
0

固定的 !!!欢呼

在一起没问题!!!!!!未保存的节点

数据库中的 ABCD 而不是 ADBC,然后在读取时我正在对索引进行计算,假设 A 位于索引 0 B 位于索引 1,依此类推....

很抱歉浪费了时间,非常感谢!!!您的帮助 !!

于 2014-05-28T20:33:18.727 回答