C# 弗洛伊德·沃沙尔找不到问题所在

C# 弗洛伊德·沃沙尔找不到问题所在,c#,algorithm,floyd-warshall,C#,Algorithm,Floyd Warshall,我需要一双新的眼睛来关注这一点,由于某些原因,它无法生成正确的序列和距离矩阵。下面是我的实现 这是在C#中,距离矩阵是双精度[,],序列矩阵是字符串[,] 这些措施如下: 如果您需要更多信息,请提供任何建议,我将非常感谢:) 初始后的距离矩阵 [0, 0] 0.0 double [0, 1] 50.0 double [0, 2] 2.

我需要一双新的眼睛来关注这一点,由于某些原因,它无法生成正确的序列和距离矩阵。下面是我的实现

这是在C#中,距离矩阵是双精度[,],序列矩阵是字符串[,]

这些措施如下:

如果您需要更多信息,请提供任何建议,我将非常感谢:)

初始后的距离矩阵

    [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

我相信我发现了问题所在

您未正确初始化
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[**i, k**];
由于序列矩阵显示了要采用的路径,因此其中的值应该是目的地,而不是起点

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

fw.SequenceMatrix[i, j] = fw.SequenceMatrix[k, j];
但应该是这样

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

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

可能问题在于inf+inf不正常(溢出)? 无论如何,我认为暗示应该是这样的

//d[i][j]==边的权重(i,j)
//d[i][j]==INF,如果没有这样的边
//d[i][i]==0;i=0,…,n-1
对于(int k=0;kk,k->j应该存在
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);//INF+INF不会发生
已修复!!!万岁

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

数据库中有一个B C D,而不是一个D B C,那么当我阅读时,我在索引上计算它,假设A在索引0处,B在索引1处,依此类推


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

你期望得到什么输出?这是我的一个同学给他的我的代码的屏幕截图,没有影响算法的差异。这是地图,如果你感兴趣,如果你感兴趣,这是矩阵的起始,你在屏幕截图中说,你在
distance matrix
无限大,但您是否根据图形中的连接设置了相应的元素?您发布的代码部分似乎很好是的,目前我正在手工计算所有迭代以比较结果:/if you can save me The time:)提示供将来参考。首先让代码正常工作,然后再担心性能,通常会有回报。这样,您总是有一个工作基线要返回。因此,您仍然得到与以前相同的输出?不,由于这两个更改,新输出看起来像这样,但仍然是错误的。您将不得不调试代码并逐步查看它,以确切地了解出了什么问题,He他从今天早上11点就开始这么做了很高兴你发现了)在数据库中保存一些属性信息可能会对这种情况有所帮助。需要注意的是,如果没有下面的金龙补丁,你的代码仍然无法工作。。。别忘了接受他的回答事实上它不是用金龙的修复程序实现的,它仍然有效,这让我有点困惑,但还是非常感谢大家的投入,这也是我解决问题的原因,我查看了数据库中的数据:)使用min可以防止维护父指针,例如OP的SequenceMatrix
// 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