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
A»
通过上图可知,,
点对
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编程语言更加熟悉,培养了算法设计与优化能力。
此次实验我受益匪浅。