我正在开发一个项目来实现Dijkstra在java中的最短路径算法。我在我的程序中使用过这个版本:LINK
我的程序需要一个来源并给我这样的输出:
Distance to PE Hall: 0.0 Path: [PE Hall]
Distance to Reception: 1.0 Path: [PE Hall, Reception]
Distance to Stairs: 3.0 Path: [PE Hall, Stairs]
Distance to Refectory: 7.0 Path: [PE Hall, Stairs, Refectory]
我真正想要的是输出,以便给出路径中每个节点之间的距离,例如:
Distance to Refectory: 7.0 Path: [PE Hall 0.0, Stairs 3.0, Refectory 4.0]
-
我意识到程序通过在每个顶点添加“previous vertex”变量来存储路径。 我的输出正是我想要的,但是,我的方法通过迭代回路径返回的距离是不正确的。
Target = E250 Distance = 0.0 {E250=0.0}
Target = D Distance = 10.0 {E250=0.0, D=10.0}
Target = C250Trans Distance = 35.0 {E250=0.0, C250Trans=10.0, D=10.0}
这是我用来创建一个arraylist的方法,其中包含每个点之间的路径和距离
public static ArrayList<String> getShortestPaths(Vertex target)
{
ArrayList<String> path = new ArrayList<String>();
for (Vertex vertex = target; vertex != null; vertex = vertex.previous)
{
path.add(vertex.name + "=" + vertex.getDistFromPrev());
}
Collections.reverse(path);
return path;
}
这是我用来获取路径中每个点之间距离的方法,包含在顶点类中:
public double getDistFromPrev()
{
double weight = 0.;
for(Edge e : adjacencies){
if(e.target == this.previous){
weight = e.weight;
}
}
return weight;
}
这里是参考的距离矩阵:
E250 - D = 10
D - C250 = 25
如果有人可以请澄清为什么使用每个顶点迭代路径的previous
变量返回不正确的边距,这对我有很大的帮助。
答案 0 :(得分:0)
你知道路径:
PE Hall, Stairs, Refectory
您还知道路径中每个位置的距离:
PE Hall: 0.0
Reception: 1.0
Stairs: 3.0
Refectory: 7.0
Dijkstra的 为您提供所需的信息,您只需要对其进行适当的“格式化”(例如,编写一个结合数据的小辅助函数,并在Dijkstra完成后调用您的助手)。 / p>
答案 1 :(得分:0)
让s
成为路径的起始顶点,d(v)
是顶点v
到顶点s
的距离,让e = w->v
成为边缘路径。然后e
的长度为d(v) - d(w)
。在您的示例中,边Stairs -> Refectory
的长度为7.0 - 3.0 = 4.0