我需要一组新的眼睛,由于某些原因它没有生成正确的序列和距离矩阵,以下是我的实现。
这是在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
任何指针都会非常感激,如果您需要更多信息,我将会访问此页面:)
init之后的距离矩阵
[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
答案 0 :(得分: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,使其与路径的第一步相同从我到k。
答案 1 :(得分:1)
问题可能是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
答案 2 :(得分:0)
修复!!! HURRAY
与...一起没有问题!未保存的节点
数据库中的B C D,而不是A D B C,然后在读取i时在索引上进行处理,假设A在索引0处,B在索引1处,等等......
抱歉浪费时间,非常感谢!!!为了你的帮助!!