最短路问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
网络图中最短路问题专题研究报告
报告人:张鹏
学号:20090828
班级:03510901
2011年5月12日
网络图中最短路问题
【问题导引】
网络分析在电子导航、交通旅游、城市规划以及电力、通讯等各种管网、管线的布局设计中发挥了重要作用。而最短路问题是网络分析中最基本、最关键的问题。最短路径不仅指一般地理意义上的距离最短,还可以引申到其他的度量,如时间,费用等等。这些都可以抽像为在图中找出任意两点间的一条通路,使这条通路上的权值和最小。
最短路问题作为图与网络技术研究的一个经典问题,在工程规划、地理信息系统、通信和军事运筹学等领域有十分广泛的应用。举例如下:
【案例一】:
如图的交通网络,图中的点表示交通节点,每条边表示两个节点间的一条通路,边上的数字表示路段的长度,有向边表示单行道,无向边表示可双向行驶。若有一批货物要从1号顶点运往11号顶点,问运货车应沿哪条线路行驶,才能最快地到达目的地?
【案例分析与建模】:
这是实际生活中经常遇到的一类问题,首先对该问题做如下假设以便抽象为数学模型。
假设一:各路段路况相同,车辆在各路段以相同的速度行驶。
假设二:各路段均一路畅通,即不存在堵车问题。
在以上两种假设的前提下,此问题即转化为在图中选一条从节点1到节点11的通路,使得路径总长度最短,即典型的最短路问题模型。将图抽象为距离矩阵表示,即可建立数学模型,设计算法求解。
【算法设计】:
对于最短路模型,传统的Dijkstra算法和floyd算法为两种有效的求解方法。利用Dijkstra算法求解案例一中的问题。
算法思路:
采用标号作业法,每次迭代产生一个永久标号, 从而生长一颗以v0为根的最短路树,在这棵树上每个顶点与根节点之间的路径皆为最短路径。
S: 具有永久标号的顶点集;
l(v): v的标记;
f(v):v的父顶点,用以确定最短路径;
输入:输入加权图的带权邻接矩阵w=[w(vi,vj)]nxm.
1)初始化:令l(v0)=0,S=Ø; ∀v≠v0 ,l(v)= ∞;
2)更新l(v), f(v):寻找不在S中的顶点u,使l(u)为最小.把u加入到S中,然后对所有不在S中的顶点v,如l(v)>l(u)+w(u,v),则更新l(v),f(v), 即l(v)←l(u)+w(u,v),f(v)←u;
3)重复步骤2), 直到所有顶点都在S中为止。
这一算法可用于解决满足如下条件的最短路问题:
1)寻求从一固定顶点到其余各点的最短路径;
2)有向图、无向图和混合图;
3)权非负.
【程序设计与求解】:
根据算法思路,编写程序,借助matlab工具求解。
程序:
Function [min,path]=dijkstra(w,start,terminal) %定义dijkstra函数%
n=size(w,1);
label(start)=0;
f(start)=start;
for i=1:n
if i~=start
label(i)=inf;
end
end
s(1)=start; u=start;
while length(s) for i=1:n ins=0; for j=1:length(s) if i==s(j) ins=1; end end if ins==0 v=i; if label(v)>(label(u)+w(u,v)) label(v)=(label(u)+w(u,v)); f(v)=u; end end end v1=0; k=inf; for i=1:n ins=0; for j=1:length(s) if i==s(j) ins=1; end end if ins==0 v=i; if k>label(v) k=label(v); v1=v; end end end s(length(s)+1)=v1; u=v1; end min=label(terminal); path(1)=terminal; i=1; while path(i)~=start path(i+1)=f(path(i)); i=i+1 ; end path(i)=start; L=length(path); path=path(L:-1:1); %输入网络图的带权邻接矩阵% edge= [ 2,3,1,3,3,5,4, 4,1,7,6,6,5, 5,11, 1,8,6,9,10,8,9, 9,10;... 3,4,2,7,5,3,5,11,7,6,7,5,6,11, 5, 8,1,9,5,11,9,8,10,9;... 3,5,8,5,6,6,1,12,7,9,9,2,2,10,10,8,8,3,7, 2, 9,9, 2, 2]; n=11; weight=inf*ones(n, n); for i=1:n weight(i, i)=0; end for i=1:size(edge,2) weight(edge(1, i), edge(2, i))=edge(3, i); end [dis, path]=dijkstra(weight,1, 11); %调用运函数计算节点1到节点11的最短路径% 程序运行结果: dis = %最小距离% 21 path = %最短路径% 1 8 9 10 11 即:从节点1到节点11的最短路径为:1→8→9→10→11 最短路程为21。 【案例一结果分析】: 利用dijkstra算法可以有效的解决案例一这一类的问题,而不仅仅是最短距离的问题。若将网络图中的属性变为时间、费用等,就可用同样的方法解决最小时间和最小费用问题。这一类问题统一归结为最短路问题,此处的路是虚指。即:利用Dijkstra算法可以有效解决网络图中任意两点间的最短路径问题。但是,要用Dijkstra算法求解网络图中任意顶点对之间的最短路径,必须轮流以每一个顶点为源点,重复执行算法N次,比较繁琐。下面通过案例二介绍一种更为简洁的算法一次求出任意顶点间的最短距离及路径。 【案例二】: 某公司在全国十个城市都有分公司,公司成员经常往返与他们之间。各个城市之间的直达航班票价由下表给出(∞表示两城市间无直接航路),,试帮该公司设计一任意两城市间票价最便宜的路线表。