Floyd算法计算最短距离矩阵和路由矩阵查询最短距离和路由matlab实验报告Word格式文档下载.docx
《Floyd算法计算最短距离矩阵和路由矩阵查询最短距离和路由matlab实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Floyd算法计算最短距离矩阵和路由矩阵查询最短距离和路由matlab实验报告Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
n),求出其各个端点之间的最小距离以及路由
(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:
ifx(i,j)==inf
r(i,j)=O;
else
r(i,j)=j;
end,
end
end;
%迭代求出k次w值
fork=1:
a=w;
s=w;
w(i,j)=min(s(i,j),s(i,k)+s(k,j));
%根据k-1次值和k次w值求出k次r值
ifi==j
elseifw(i,j)<
a(i,j)
r(i,j)=r(i,k);
r(i,j)=r(i,j);
【func2.m】
function[Pu]=func2(w,k1,k2)
n=length(w);
U=w;
m=1;
whilem<
=n
fori=1:
n;
forj=1:
ifU(i,j)>
U(i,m)+U(m,j)
U(i,j)=U(i,m)+U(m,j);
m=m+1;
u=U(k1,k2);
P仁zeros(1,n);
k=1;
P1(k)=k2;
V=ones(1,n)*100;
kk=k2;
whilekk~=k1
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;
k=1;
wrow=find(P1~=O);
forj=length(wrow):
(-1):
1
P(k)=P1(wrow(j));
k=k+1;
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)]);
k1、k2间最短距离:
num2str(u)]);
五、数据结构
1.主要函数
最短距离、路由函数:
function[wr]=func1(w)n=length(w);
ifx(i,j)==100
r(i,j)=0;
r(i,j)=j;
end,
%迭代求岀k次w值
w(i,j)=min(s(i,j),s(i,k)+s(k,j));
%根据k-1次值和k次w值求岀k次r值
r(i,j)=O;
最短路径函数:
function[Pu]=func2(w,k1,k2)
n;
forj=1:
P1=zeros(1,n);
whilekk〜=k1
ifV(1,i)==U(k1,i)P1(k+1)=i;
wrow=find(P1〜=0);
P;
2.算法的流程图
Floyd算法:
开始
六、实验结论与分析
匚omnnandWindow
>
n.1
W1-
2.5000
2.0000
2,5000
3.5000
2.OCOO
3-5000
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
3.2000
4.0000
1.5000
6,7000
5.8000
1.7000
6.7000
J3.5000
S.4000
6.S000
13.5000
5.1000
a.4000
R1
通过上图可知,
V4和V6之间最短距离是
6.8,最短路由是V4—>
V1—>
V7
—>
V2—>
V6,3和V4之间最短距离是3.2,最短路由是V3—>
V7—>
V4
CommandWindow
12=
C.5000
e,40QO
2.5000
7.9000
E.OODO
2,0000
£
5000
玄5000
3.1000
1,5000
2-0000
X5000
9,9000
L70C0
3.70<
30
3,2000
0€.70006.80C0
S.4000
二9000
9.9000
&
7000
13.5000
5.5000
4,0000
6.SOOO
】3.5000
F2
二
02
3
4
7
2
10
5
i
11
$
22
B5
33
A»
通过上图可知,,
点对
V1
和V7
之间
最短距离是
5.1,最短路由疋
V3
端点对V3和V5之间最短距离是
3.7,
最短路由疋
V3—>
V2
V5
端点对V1和V6之间最短距离是
8.4,
V6
»
m2
輪人帜酋呃隆*=:
0irvfinf5infinf:
irfJ3infinftnf:
inf40l54AS4irrfOinfini:
infirrfI3infC
■入Mm2
ttXW^2:
k2=ft
112
b
LB
IS
56
j
_
18
c
23
耳
15
e
8
11
i-
33
19
10
25
□
止
北
21
12
n■-
X・
■n
Ld
CommandV/indow
0日
1Z
$]«
2$
IB
■
D
y
I
6
d
]1
13
16
3$
27
lo
Et=
04I
t
3d3
420
fl
L』2
昨
一
-
333
3^3
Q
kl.23
Al、k:
口骨担苗寢:
9
七、遇到的问题及解决方法
(1)图的等价表示方法;
(2)两点间的最短路径查询算法。
八、实验心得
通过本次实验实现了用计算机语言编写Floys本掌握了算法的实现方法,对
MatLab编程语言更加熟悉,培养了算法设计与优化能力。
此次实验我受益匪浅。