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 找不到问题所在的主要内容,如果未能解决你的问题,请参考以下文章
无论我做啥,我都会在打印时遇到语法错误。这是下面的代码,我找不到问题所在
Deepin 2015 安装后找不到win10 启动选项的解决办法
经典算法之二分查找:编写代码在一个整形有序数组中查找具体的某个数 找到了就打印数字所在的下标,找不到则输出:找不到。