Floyd-Warshall 找不到问题所在

Posted

技术标签:

【中文标题】Floyd-Warshall 找不到问题所在【英文标题】:Floyd-Warshall Cant find whats wrong 【发布时间】:2014-07-18 02:05:15 【问题描述】:

我需要一双新的眼睛来解决这个问题,由于某种原因它没有生成正确的序列和距离矩阵,下面是我的实现。

这是在 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

【问题讨论】:

你期待什么输出? 这是来自我的一个同学,我给了他我的代码的屏幕截图,没有任何差异会影响算法puu.sh/94W63/3733d3275f.png 如果你有兴趣,这也是地图puu.sh/954sl/89bd904fda.png 如果你有兴趣这是矩阵的初始化puu.sh/954Bu/fc0be21893.png 您在屏幕截图中说您将DistanceMatrix 中的值初始化为无穷大,但是您是否根据图中的连接在其中设置了适当的元素?您发布的代码部分似乎很好 是的puu.sh/9554w/5bbe3027fa.png,目前我正在手动计算所有迭代以比较结果:/如果你能节省我的时间:) 未来参考的提示。首先让您的代码工作然后担心性能通常会有所回报。这样一来,您始终有一个可以返回的工作基线。 【参考方案1】:

已修复!!!万岁

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

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

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

【讨论】:

很高兴你发现了)在数据库中保存一些属性信息可能对这种情况有所帮助 需要注意的是,如果没有下面 Golden Dragon 的修复,您的代码仍然无法工作...不要忘记接受他的回答 实际上它并没有通过金龙的修复实现,它仍然有效,这让我有点困惑为什么,但仍然非常感谢大家的投入,这也是我解决问题的方式查看了数据库中的数据:)【参考方案2】:

也许问题是 inf+inf 不行(溢出)? 无论如何,我认为实现应该看起来像this

// 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

【讨论】:

使用 min 会阻止您维护父指针,例如 OP 的 SequenceMatrix【参考方案3】:

我相信我找到了问题。

您正在错误地初始化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 到 k。

【讨论】:

所以你仍然得到与以前相同的输出? 没有这两个变化,新的输出看起来像这样,这仍然是错误的puu.sh/9599j/335a8c0241.png 您将不得不调试您的代码并逐步执行它以查看到底出了什么问题。 嘿嘿从今天早上 11 点开始就这样做了

以上是关于Floyd-Warshall 找不到问题所在的主要内容,如果未能解决你的问题,请参考以下文章

Floyd-Warshall 算法

无论我做啥,我都会在打印时遇到语法错误。这是下面的代码,我找不到问题所在

Deepin 2015 安装后找不到win10 启动选项的解决办法

经典算法之二分查找:编写代码在一个整形有序数组中查找具体的某个数 找到了就打印数字所在的下标,找不到则输出:找不到。

自己编了个C#的串口调试程序,但发送命令后,得不到数据!找不到问题所在,想请教各位!谢谢,急用!

c语言有序链表合并,我找不到问题所在,求纠错!!