(完整word版)图论算法及matlab程序的三个案例

  • 格式:doc
  • 大小:240.51 KB
  • 文档页数:17

下载文档原格式

  / 17
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

图论实验三个案例

单源最短路径问题 1.1 Dijkstra 算法

Dijkstra 算法是解单源最短路径问题的一个贪心算法。其基本思想是,设置一个顶点集合S 并不断地作贪心选择来扩充这个集合。一个顶点属于集合S 当且仅当从源到该顶点的最短路径长度已知。设v 是图中的一个顶点,记()l v 为顶点

v 到源点v 1的最短距离,

,i j v v V

∀∈,若

(,)i j v v E

∉,记i v

到j v 的权ij w =∞。

Dijkstra 算法:

① 1{}S v =,1()0l v =;1{}v V v ∀∉-,()l v =∞,1i =,1{}S V v =-; ② S φ=,停止,否则转③;

③ ()min{(),(,)}

j l v l v d v v =,

j v S

∈,v S ∀∈;

④ 存在

1

i v +,使

1()min{()}

i l v l v +=,v S ∈;

1{}

i S S v +=U ,

1{}

i S S v +=-,1i i =+,转②;

实际上,Dijkstra 算法也是最优化原理的应用:如果121n n

v v v v -L 是从1v 到

n

v 的最短路径,则

121

n v v v -L 也必然是从1v 到

1

n v -的最优路径。

在下面的MATLAB 实现代码中,我们用到了距离矩阵,矩阵第i 行第j 行元

素表示顶点i v 到j v 的权ij w ,若i v

到j v 无边,则realmax ij w =,其中realmax 是

MATLAB 常量,表示最大的实数(1.7977e+308)。

function re=Dijkstra(ma)

%用Dijkstra算法求单源最短路径

%输入参量ma是距离矩阵

%输出参量是一个三行n列矩阵,每列表示顶点号及顶点到源的最短距离和前顶点

n=size(ma,1);%得到距离矩阵的维数

s=ones(1,n);s(1)=0;%标记集合S和S的补

r=zeros(3,n);r(1,:)=1:n;r(2,2:end)=realmax;%初始化

for i=2:n;%控制循环次数

mm=realmax;

for j=find(s==0);%集合S中的顶点

for k=find(s==1);%集合S补中的顶点

if(r(2,j)+ma(j,k)

r(2,k)=r(2,j)+ma(j,k);r(3,k)=j;

end

if(mm>r(2,k))

mm=r(2,k);t=k;

end

end

end

s(1,t)=0;%找到最小的顶点加入集合S end re=r;

1.2 动态规划求解最短路径

动态规划是美国数学家Richard Bellman 在1951年提出来的分析一类多阶段决策过程的最优化方法,在工程技术、工业生产、经济管理、军事及现代化控制工程等方面均有着广泛的应用。动态规划应用了最佳原理:假设为了解决某一优化问题,需要依次作出n 个决策

12,,,n

D D D L ,如若这个决策是最优的,对于

任何一个整数k ,1

12,,,k k n

D D D ++L 也是最优的。

如图1,从A 1点要铺设一条管道到A 16点,中间必须要经过5个中间站,第一站可以在{ A 2,A 3}中任选一个,第二、三、四、五站可供选择的地点分别是:{ A 4,A 5,A 6,A 7},{ A 8,A 9,A 10},{ A 11,A 12,A 13},{ A 14,A 15}。连接两地管道的距离用连线上的数字表示,要求选一条从A 1到A 16的铺管线路,使总距离最短。

图1 可选择的管道图

解决此问题可以用穷举法,从A1到A16有48条路径,只须比较47次,就可得到最短路径为:A1→A2→A5→A8→A12→A15→A16,最短距离为18。

也可以使用Dijkstra算法。这里,我们动态规划解决此问题。注意到最短路径有这样一个特性,即如果最短路径的第k站通过P k,则这一最短路径在由

P k出发到达终点的那一部分路径,对于始点为P k到终点的所有可能的路径来说,必定也是距离最短的。根据最短路径这一特性,启发我们计算时从最后一段开始,从后向前逐步递推的方法,求出各点到A16的最短路径。

在算法中,我们用数组六元数组ss表示中间车站的个数(A1也作为中间车站),用距离矩阵path表示该图。为简便起见,把该图看作有向图,各边的方向均为从左到右,则path不是对称矩阵,如path(12,14)=5,而path(14,12)=0(用0表示不通道路)。用3´16矩阵spath表示算法结果,第一行表示结点序号,第二行表示该结点到终点的最短距离,第三行表示该结点到终点的最短路径上的下一结点序号。下面给出MATLAB实现算法。

function [scheme] = ShortestPath(path,ss)

%利用动态规划求最短路径

%path是距离矩阵,ss是车站个数

n=size(path,1);%结点个数

scheme=zeros(3,n);%构造结果矩阵

scheme(1,:)=1:n;%设置结点序号

scheme(2,1:n-1)=realmax;%预设距离值

k=n-1;%记录第一阶段结点最大序号

for i=size(ss,2):-1:1;%控制循环阶段数