当前位置:文档之家› 关于最短路问题算法的一点思考

关于最短路问题算法的一点思考

关于最短路问题算法的一点思考
最短路问题,实际上是P95。

也就是我们用一个算法解决SP问题时,就是在找这个加权图G中从s到t的P(s,t)中边权之和最小的P*(s,t).
由定义就可以看出,实际生活中经常有最短路问题的例子。

例如:
实例1.某公司在六个城市s,t,a,b都有分公司,公司成员经常往来于它们之间,已知从Vi到Vj的直达航班票价由下述矩阵的第i行,第j列元素给出(∞表示无直达航班),该公司想算出一张任意两个城市之间的最廉价路线航费表。

图+矩阵
实例2.如图的交通网络,每条弧上的数字代表车辆在该路段行驶所需的时间,有向边表示单行道。

若有一批货物要从s号顶点运往t号顶点,问运货车应沿哪条线路行驶,才能最快地到达目的地?
图+矩阵
因此怎么样快速又精确的求解一个最短路问题就显得至关重要。

下面我们来介绍几种解决SP问题的有效途径。

一、把求最短路问题转化为LP问题
P95
二、最短路问题的原始对偶算法:Dijkstra算法
Pdf最短路+课本P138
综上,即为Dijkstra算法,它的有效实施体现在:P161
对Dijkstra算法的一点思考:
1.关于Dijkstra算法,书中的例子定义了一个使用范围,即寻求有向图中,从一固定顶点到其余各点的最短路径。

那么一个简单的推广就是在于,对于无向图或者混合图的情况Dijkstra算法还能否使用?答案应该是肯定的。

也就是说,实例2中无论是单行道,双行道的情况都是可以应用Dijkstra算法进行求解的。

2. 作为学习图论的一名学生,Dijkstra算法的本质可以说就是在一个图中,进行标号,每次迭代产生一个永久标号, 从而生长一颗以s为根的最短路树,在这颗树上每个顶点与根s 节点之间的路径皆为最短路径.
3.Dijkstra算法明确要求权(费用)非负,这无疑会限制一些是实际生活中的例子进行求解,若出现的边权为负的情况,Dijkstra算法就要进行修改。

并且,如果我们对Dijkstra算法进行编程,即使根据书中拟Algol语言的提示以我现有的水平也根本写不出Matlab的高级程序语言。

但是有另外一种算法有效的避免了这个麻烦,它的逻辑更为简单,并允许网络中的弧有负权,能探测网络中负费用圈,与一般的原始对偶算法不同。

三、Floyd-Warshall算法
P164
并且,有一点比较吸引我的地方是在于Floyd-Warshall算法的逻辑较为简单,我可以跟据课本上拟Algol语言,编写出一部分Matlab的程序,但是因为编译程序的水平的限制,每次运行的时候都会出现不同的错误。

在与计算数学的同学进行讨论的时候,因为他们偏重绘图而我们偏重优化,导致也为得出有效的解决措施。

Input:A表示图G的带弧权邻接矩阵;
Output:矩阵D, path,及i与j之间的最短距离min和最短路径path.
function [min,path]=floyd(A,start,terminal) %返回i与j之间的最短距离min和最短路径path. D=A;n=size(D,1);path=zeros(n,n); %D表示矩阵,n表示D矩阵的行数;if
min=D(start,terminal);
min(1)=start;
i=1;
i=i+1;
for i=1:n %子循环;
for j=1:n
if D(i,j)~=inf %D(i,j)不等于无穷
path(i,j)=j;
end
end
end
for k=1:n
for i=1:n
for j=1:n
if D(i,k)+D(k,j)<D(i,j) %D(i,j)表示i到j的最短距离;
D(i,j)=D(i,k)+D(k,j);
path(i,j)=path(i,k); %path(i,j)表示i与j之间的最短路径上顶点i的后继点;
end
end
end
end
path=[ ]; % 返回矩阵D, path
end
建立m文件如下:
A= [ 0,50,inf,40,25,10;50,0,15,20,inf,25;inf,15,0,10,20,inf;…];
[D, path]=floyd(A)
运行后输出显示存在error。

相关主题