Floyd算法计算最短距离矩阵和路由矩阵查询最短距离和路由matlab实验报告.docx

上传人:b****5 文档编号:6722401 上传时间:2023-01-09 格式:DOCX 页数:12 大小:71.85KB
下载 相关 举报
Floyd算法计算最短距离矩阵和路由矩阵查询最短距离和路由matlab实验报告.docx_第1页
第1页 / 共12页
Floyd算法计算最短距离矩阵和路由矩阵查询最短距离和路由matlab实验报告.docx_第2页
第2页 / 共12页
Floyd算法计算最短距离矩阵和路由矩阵查询最短距离和路由matlab实验报告.docx_第3页
第3页 / 共12页
Floyd算法计算最短距离矩阵和路由矩阵查询最短距离和路由matlab实验报告.docx_第4页
第4页 / 共12页
Floyd算法计算最短距离矩阵和路由矩阵查询最短距离和路由matlab实验报告.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

Floyd算法计算最短距离矩阵和路由矩阵查询最短距离和路由matlab实验报告.docx

《Floyd算法计算最短距离矩阵和路由矩阵查询最短距离和路由matlab实验报告.docx》由会员分享,可在线阅读,更多相关《Floyd算法计算最短距离矩阵和路由矩阵查询最短距离和路由matlab实验报告.docx(12页珍藏版)》请在冰豆网上搜索。

Floyd算法计算最短距离矩阵和路由矩阵查询最短距离和路由matlab实验报告.docx

Floyd算法计算最短距离矩阵和路由矩阵查询最短距离和路由matlab实验报告

实验四:

Floyd算法

一、实验目的

利用MATLAB实现Floyd算法,可对输入的邻接距离矩阵计算图中任意两点间的最短距离矩阵和路由矩阵,且能查询任意两点间的最短距离和路由。

二、实验原理

Floyd算法适用于求解网络中的任意两点间的最短路径:

通过图的权值矩阵求出任意两点间的最短距离矩阵和路由矩阵。

优点是容易理解,可以算出任意两个节点之间最短距离的算法,且程序容易实现,缺点是复杂度达到,不适合计算大量数据。

Floyd算法可描述如下:

给定图G及其边(i,j)的权wi,j(1

F0:

初始化距离矩阵W(0)和路由矩阵R(0)。

其中:

[叫若弓巴E(有边)

叫⑴二{丈若牛匸F(无边)

'0若i=j(对角线元素)

严Jj若吋S

°\0,其它

F1:

已求得W(k-1)和R(k-1),依据下面的迭代求W(k)和R(k)

F2:

若kn,终止。

三、实验内容

1、用MATLAB仿真工具实现Floyd算法:

给定图G及其边(i,j)的权

wi,j(1

(1)尽可能用M函数分别实现算法的关键部分,用M脚本来进行算法结

果验证;

(2)

分别用以下两个初始距离矩阵表示的图进行算法验证:

分别求出W(7)和R(7)2、根据最短路由矩阵查询任意两点间的最短距离和路由

(1)最短距离可以从最短距离矩阵的3(i,j)中直接得出;

(2)相应的路由则可以通过在路由矩阵中查找得出。

由于该程序中使用的是前向矩

阵,因此在查找的过程中,路由矩阵中r(i,j)对应的值为Vi到Vj路由上的下一个端点,这样再代入r(r(i,j),j),可得到下下个端点,由此不断循环下去,即可找到最终

的路由。

(3)对图1,分别以端点对V4和V6,V3和V4为例,求其最短距离和路由;对

图2,分别以端点对V1和V7,V3和V5,V1和V6为例,求其最短距离和路由。

3、输入一邻接权值矩阵,求解最短距离和路由矩阵,及某些点间的最短路径。

四、采用的语言

MatLab

源代码:

【funcl.m】

function[wr]=func1(w)

n=length(w);

x=w;

r=zeros(n,1);%路由矩阵的初始化

fori=1:

1:

n

forj=1:

1:

n

ifx(i,j)==inf

r(i,j)=O;

else

r(i,j)=j;

end,

end

end;

%迭代求出k次w值

fork=1:

n

a=w;

s=w;

fori=1:

n

forj=1:

n

w(i,j)=min(s(i,j),s(i,k)+s(k,j));

end

%根据k-1次值和k次w值求出k次r值

fori=1:

n

forj=1:

n

ifi==j

r(i,j)=O;

elseifw(i,j)

r(i,j)=r(i,k);

else

r(i,j)=r(i,j);

end

end

end

end;

【func2.m】

function[Pu]=func2(w,k1,k2)

n=length(w);

U=w;

m=1;

whilem<=n

fori=1:

n;

forj=1:

n;

ifU(i,j)>U(i,m)+U(m,j)

U(i,j)=U(i,m)+U(m,j);

end

end

end

m=m+1;

end

u=U(k1,k2);

P仁zeros(1,n);

k=1;

P1(k)=k2;

V=ones(1,n)*100;

kk=k2;

whilekk~=k1

fori=1:

n

V(1,i)=U(k1,kk)-w(i,kk);

ifV(1,i)==U(k1,i)

P1(k+1)=i;

kk=i;

k=k+1;

end

end

k=1;

wrow=find(P1~=O);

forj=length(wrow):

(-1):

1

P(k)=P1(wrow(j));k=k+1;

end

P;

【m1.m】

w1=[01001001.29.21000.5;

100010051003.12;

100100010010041.5;

1.2510006.7100100;

9.21001006.7015.6100;

1003.1410015.60100;

0.521.51001001000];

w2=[00.521.5100100100;

0.501001001.29.2100;

2100010051003.1;

1.510010001001004;

1001.2510006.7100;

1009.21001006.7015.6;

1001003.1410015.60];

[W1R1]=func1(w1)

[W2R2]=func1(w2)

【m2.m】

w=input('输入权值矩阵w=');

k1=input('输入端点1:

k1=');

k2=input('输入端点2:

k2=');

[WR]=func1(w)

[Pu]=func2(w,k1,k2);

disp(['k1、k2间最短路:

',num2str(P)]);

disp(['k1、k2间最短距离:

',num2str(u)]);

五、数据结构

1.主要函数

最短距离、路由函数:

function[wr]=func1(w)n=length(w);

x=w;

fori=1:

1:

n

forj=1:

1:

n

ifx(i,j)==100

r(i,j)=0;

else

r(i,j)=j;

end,

end

end;

%迭代求岀k次w值

fork=1:

n

a=w;

s=w;

fori=1:

n

forj=1:

n

w(i,j)=min(s(i,j),s(i,k)+s(k,j));

end

end

%根据k-1次值和k次w值求岀k次r值

fori=1:

n

forj=1:

n

r(i,j)=O;

elseifw(i,j)

r(i,j)=r(i,k);

else

r(i,j)=r(i,j);

end

end

end

end;

最短路径函数:

function[Pu]=func2(w,k1,k2)

n=length(w);

U=w;

m=1;

whilem<=n

fori=1:

n;

forj=1:

n;

ifU(i,j)>U(i,m)+U(m,j)

U(i,j)=U(i,m)+U(m,j);

end

end

end

m=m+1;

end

u=U(k1,k2);

P1=zeros(1,n);

k=1;

P1(k)=k2;

V=ones(1,n)*100;

kk=k2;

whilekk〜=k1

fori=1:

n

V(1,i)=U(k1,kk)-w(i,kk);ifV(1,i)==U(k1,i)P1(k+1)=i;

kk=i;

k=k+1;

end

end

end

k=1;

wrow=find(P1〜=0);

forj=length(wrow):

(-1):

1

P(k)=P1(wrow(j));

k=k+1;

end

P;

2.算法的流程图

Floyd算法:

 

开始

 

六、实验结论与分析

匚omnnandWindow

>>n.1

W1-

0

2.5000

2.0000

2,5000

0

3.5000

2.OCOO

3-5000

0

L2000

3.7000

3-2000

7.9C00

10.4000

9.9000

5,6C00

3.1000

4.0000

0.5000

2.0000

1.5000

1.2000

7.9000

5.6000

0.5000

3.7000

10.4000

3.1000

2.0000

3.2000

9.9000

4.0000

1.5000

0

6,7000

5.8000

1.7000

6.7000

0

J3.5000

S.4000

6.S000

13.5000

0

5.1000

1.7000

a.4000

5.1000

0

R1

通过上图可知,

V4和V6之间最短距离是

6.8,最短路由是V4—>V1—>V7

—>V2—>V6,3和V4之间最短距离是3.2,最短路由是V3—>V7—>V1—>V4

 

CommandWindow

12=

0

C.5000

2.0000

1.5000

1.7000

e,40QO

5.1000

0.5000

0

2.5000

2.0000

1.2000

7.9000

E.OODO

2,0000

£5000

0

玄5000

3.7000

10.4000

3.1000

1,5000

2-0000

X5000

0

3.2000

9,9000

4.0000

L70C0

1.2000

3.70<30

3,2000

0€.70006.80C0

S.4000

二9000

10.4000

9.9000

&7000

0

13.5000

5.1000

5.5000

3.1000

4,0000

6.SOOO

】3.5000

0

F2

02

3

4

7

2

3

10

1

1

5

5

i

11

0

1

1

1

11

1

0

1

1

$

22

2

2

0

5

2

B5

5

5

5

0

5

33

3

4

3

3

0

通过上图可知,,

点对

V1

和V7

之间

最短距离是

5.1,最短路由疋

V1—>V3

—>V7

端点对V3和V5之间最短距离是

3.7,

最短路由疋

V3—>V1

—>V2

—>V5

端点对V1和V6之间最短距离是

8.4,

最短路由疋

V1—>V2

—>V5

—>V6

»m2

輪人帜酋呃隆*=:

0irvfinf5infinf:

irfJ3infinftnf:

inf40l54AS4irrfOinfini:

infirrfI3infC

■入Mm2

ttXW^2:

k2=ft

0

112

b

LB

IS

56

j

_

18

i

c

23

0

15

1

e

8

4

7

0

11

i-

33

19

10

25

21

12

n■-

X・

■n

Ld

0

CommandV/indow

0日

1Z

$]«

IS

2$

0

3

IB

D

23

y

0

15

I

6

3

d

7

D

]1

13

33

15

10

25

0

16

3$

12

27

lo

0

 

Et=

04I

I

t

4

3d3

3

3

3

420

4

5

fl

L』2

D

-

333

3

0

3

3^3

3

3

Q

kl.23

6

Al、k:

'口骨担苗寢:

9

七、遇到的问题及解决方法

(1)图的等价表示方法;

(2)两点间的最短路径查询算法。

八、实验心得

通过本次实验实现了用计算机语言编写Floys本掌握了算法的实现方法,对

MatLab编程语言更加熟悉,培养了算法设计与优化能力。

此次实验我受益匪浅。

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

当前位置:首页 > 医药卫生 > 基础医学

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

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