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);
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;
【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=');
w
[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;
r=zeros(n,1);%路由矩阵的初始化
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
ifi==j
r(i,j)=0;
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算法:
结束
开始
Wi,j(k)=min(Wi,j(k-1),Wik(k-1)+Wkj(k-1))
n=length(w)
k=0
k≤n?
Wi,j(k)Wi,j(k)≤Wi,j(k-1)?
Yes
ri,j(k)=ri,j(k-1)
No
ri,j(k)=ri,k(k-1)
Yes
六、实验结论与分析
通过上图可知,V4和V6之间最短距离是6.8,最短路由是V4—>V1—>V7—>V2—>V6,3和V4之间最短距离是3.2,最短路由是V3—>V7—>V1—>V4
通过上图可知,,点对V1和V7之间最短距离是5.1,最短路由是V1—>V3—>V7
端点对V3和V5之间最短距离是3.7,最短路由是V3—>V1—>V2—>V5
端点对V1和V6之间最短距离是8.4,最短路由是V1—>V2—>V5—>V6
七、遇到的问题及解决方法
(1)图的等价表示方法;
(2)两点间的最短路径查询算法。
八、实验心得
通过本次实验实现了用计算机语言编写Floys本掌握了算法的实现方法,对MatLab编程语言更加熟悉,培养了算法设计与优化能力。
此次实验我受益匪浅。