图论算法及matlab程序的三个案例.docx

上传人:b****2 文档编号:2165033 上传时间:2022-10-27 格式:DOCX 页数:13 大小:252.24KB
下载 相关 举报
图论算法及matlab程序的三个案例.docx_第1页
第1页 / 共13页
图论算法及matlab程序的三个案例.docx_第2页
第2页 / 共13页
图论算法及matlab程序的三个案例.docx_第3页
第3页 / 共13页
图论算法及matlab程序的三个案例.docx_第4页
第4页 / 共13页
图论算法及matlab程序的三个案例.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

图论算法及matlab程序的三个案例.docx

《图论算法及matlab程序的三个案例.docx》由会员分享,可在线阅读,更多相关《图论算法及matlab程序的三个案例.docx(13页珍藏版)》请在冰豆网上搜索。

图论算法及matlab程序的三个案例.docx

图论算法及matlab程序的三个案例

图论实验三个案例

单源最短路径问题

1.1Dijkstra算法

Dijkstra算法是解单源最短路径问题的一个贪心算法。

其基本思想是,设置一个顶点集合S并不断地作贪心选择来扩充这个集合。

一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。

设v是图中的一个顶点,记l(v)为顶点v到源点V1的最短距离,Vi,VjV,若(Vi,Vj)E,记“到百的权w。

Dijkstra算法:

1S{vJI(vJ0;vV{可1(v)iiSV{vJ;

J7JJJ7

2S,停止,否则转③;

l(v)min{l(v),d(Vj,v)}VjS

4存在Vi1,使l(Vil)min{l(V)},VS;

5SSU{vi1}SS{vi1}ii1

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

如果V1V2LVn1Vn是从V1到Vn的最短路径,贝UV1V2LVn1也必然是从V1到Vn1的最优路径。

在下面的MATLA实现代码中,我们用到了距离矩阵,矩阵第i行第j行元素表示顶点Vi到Vj的权Wj,若v到Vj无边,则Wijrealmax,其中realmax是MATLA常量,表示最大的实数(1.7977e+308)

functionre=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;%初始化

fori=2:

n;%控制循环次数

mm=realmax;

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

fork=find(s==1);%集合S补中的顶点if(r(2,j)+ma(j,k)

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动态规划求解最短路径

动态规划是美国数学家RichardBellman在1951年提出来的分析一类多阶段决策过程的最优化方法,在工程技术、工业生产、经济管理、军事及现代化控制工程等方面均有着广泛的应用。

动态规划应用了最佳原理:

假设为了解决某一优化问题,需要依次作出n个决策Di,D2丄,Dn,如若这个决策是最优的,对于任何一个整数k,1

如图1,从A点要铺设一条管道到A16点,中间必须要经过5个中间站,第一站可以在{A2,A}中任选一个,第二、三、四、五站可供选择的地点分别是:

{A4,A,As,A7},{A8,A9,A10},{A11,A2,A13},{A14,A15}。

连接两地管道

图1可选择的管道图

解决此问题可以用穷举法,从Ai到A16有48条路径,只须比较47次,就可得到最短路径为:

AfAfAfAfAl2fA|5^Al6,最短距离为18。

也可以使用Dijkstra算法。

这里,我们动态规划解决此问题。

注意到最短路径有这样一个特性,即如果最短路径的第k站通过Pk,则这一最短路径在由

Pk出发到达终点的那一部分路径,对于始点为Pk到终点的所有可能的路径来说,

必定也是距离最短的。

根据最短路径这一特性,启发我们计算时从最后一段开始,从后向前逐步递推的方法,求出各点到A16的最短路径。

在算法中,我们用数组六元数组SS表示中间车站的个数(Ai也作为中间车站),用距离矩阵path表示该图。

为简便起见,把该图看作有向图,各边的方向均为从左到右,则path不是对称矩阵,如path(i2,i4)=5,而path(i4,i2)=0(用0表示不通道路)。

用3'16巨阵spath表示算法结果,第一行表示结点序号,第二行表示该结点到终点的最短距离,第三行表示该结点到终点的最短路径上的下一结点序号。

下面给出MATLA实现算法。

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;%记录第一阶段结点最大序号

fori=Size(SS,2):

-1:

1;%控制循环阶段数

fort=find(path(j,:

)>0);%当前结点邻接结点

ifpath(j,t)+scheme(2,t)

end

end

end

k=k-ss(i);移入下一阶段

end

先在MATLAB^令窗口中构造距离矩阵path,再输入:

>>ShortestPath(path,ss)

得到以下结果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

18

13

16

13

10

9

12

7

6

8

7

5

9

4

3

0

2

5

6

8

8

9

10

12

12

12

14

15

15

16

16

0

将该结果表示为图,即为图1粗线所示

棋盘覆盖问题

1.1问题的提出

在一个2k2k个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称

该方格为一特殊方格,且称该棋盘为一特殊的棋盘。

如图1就是当k3时的特

1.2问题的分析

k

易知,用到的L型骨牌个数恰为(41)/3。

利用分治策略,我们可以设计出

解棋盘覆盖问题的一个简捷的算法

当k>0时,我们将2k2k棋盘分割为4个2k12k1子棋盘如图3两粗实线所

示。

 

特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特殊方格。

为了将这3个无特殊方格的子棋盘转化为特殊棋盘,我们可以用一个L型骨牌覆盖这3个较小棋盘的会合处,如图4中央L型骨牌所示,这3个子棋盘上被L型骨牌覆盖的方格就成为该棋盘上的特殊方格,从而将原问题转化为4个较小规模的棋盘覆盖问题。

递归地使用这种分割,直至棋盘简化为11棋盘。

1.3算法的MATLA实现

首先特殊方格在棋盘中的位置可以用一个12的数组sp表示;对于图2所示的4种L型骨牌,可用数字1,2,3,4表示;对于特殊棋盘的骨牌覆盖表示,只

须注意到图4所示的关键点,对每个关键点,给定一种L型骨牌,就能覆盖整个

kk

棋盘,所以对于2k2k的特殊棋盘的骨牌覆盖,可用一个(21)(21)的矩阵

表示。

按照这种思想,图4的矩阵表示为:

1

0

4

0

1

0

2

0

4

0

0

0

2

0

4

0

3

0

2

0

3

0

0

0

3

0

0

0

1

0

4

0

3

0

2

0

4

0

0

0

3

0

4

0

3

0

4

0

3

k=4,特殊万格位置为:

[1,4],覆盖矩阵为:

下面是在MATLAB^的棋盘覆盖实现程序。

functionre=chesscover(k,sp)

%解决棋盘的覆盖问题

%棋盘为2Ak*2Ak,sp为特殊方格的棋盘位置

globalcovermatrix

covermatrix=zeros(2Ak-1,2Ak-1);

even1=floor(sp(1,1)/2)*2==sp(1,1);%判断水平位置是否是偶数

even2=floor(sp(1,2)/2)*2==sp(1,2);%判断竖直位置是否是偶数

ifeven仁=1&&even2==0%找出找出特殊方格相对关键结点的位置

i=4;

else

i=even1+even2+1;

end

tempfun(1,1,k,[sp(1,1)-even1,sp(1,2)-even2,i]);

re=covermatrix;

functiontempfun(top,left,k,tp)%子函数,tp为转换后特殊方格在棋盘网络的相对位置

globalcovermatrix

ifk==1

switchtp(1,3)

case1

covermatrix(tp(1,1),tp(1,2))=3;

case2

covermatrix(tp(1,1),tp(1,2))=4;

case3

covermatrix(tp(1,1),tp(1,2))=1;

case4

covermatrix(tp(1,1),tp(1,2))=2;

end

else

half=2A(k-1);i=top+half-1;j=left+half-1;

iftp(1,1)

iftp(1,2)

covermatrix(i,j)=3;%添加类型为3的L型骨牌

tempfun(top,left,k-1,tp);

tempfun(top,left+half,k-1,[i-1,j+1,4]);

tempfun(top+half,left+half,k-1,[i+1,j+1,1]

);

tempfun(top+half,left,k-1,[i+1,j-1,2]);

else%特殊方格在右上

covermatrix(i,j)=4;%添加类型为4的L型骨牌tempfun(top,left,k-1,[i-1,j-1,3]);tempfun(top,left+half,k-1,tp);

tempfun(top+half,left+half,k-1,[i+1,j+1,1]

);

tempfun(top+half,left,k-1,[i+1,j-1,2]);

end

else

iftp(1,2)>j%特殊方格在右下

covermatrix(i,j)=1;%添加类型为3的L型骨牌

tempfun(top,left,k-1,[i-1,j-1,3]);

tempfun(top,left+half,k-1,[i-1,j+1,4]);

tempfun(top+half,left+half,k-1,tp);

tempfun(top+half,left,k-1,[i+1,j-1,2]);

else%特殊方格在左下

covermatrix(i,j)=2;%添加类型为4的L型骨牌

tempfun(top,left,k-1,[i-1,j-1,3]);

tempfun(top,left+half,k-1,[i-1,j+1,4]);

tempfun(top+half,left+half,k-1,[i+1,j+1,1]

);

tempfun(top+half,left,k-1,tp);

end

end

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1