Floyd算法_计算最短距离矩阵和路由矩阵_查询最短距离和路由_matlab实验报告
- 格式:doc
- 大小:36.00 KB
- 文档页数:7
文档收集于互联网,已重新整理排版.word版本可编辑,有帮助欢迎下载支持. 1文档来源为:从网络收集整理.word版本可编辑. 实验四:Floyd 算法 一、实验目的 利用MATLAB 实现Floyd 算法,可对输入的邻接距离矩阵计算图中任意两点间的最短距离矩阵和路由矩阵,且能查询任意两点间的最短距离和路由。 二、实验原理 Floyd 算法适用于求解网络中的任意两点间的最短路径:通过图的权值矩阵求出任意两点间的最短距离矩阵和路由矩阵。优点是容易理解,可以算出任意两个节点之间最短距离的算法,且程序容易实现,缺点是复杂度达到,不适合计算大量数据。 Floyd 算法可描述如下: 给定图G 及其边(i , j )的权wi, j (1≤i≤n ,1≤j≤n)
F0:初始化距离矩阵W(0)和路由矩阵R(0)。其中: F1:已求得W(k-1)和R(k-1),依据下面的迭代求W(k)和R(k) F2:若k≤n,重复F1;若k>n,终止。
三、实验内容
1、用MATLAB 仿真工具实现Floyd 算法:给定图G 及其边(i , j )的权 wi , j (1≤i≤n ,1≤j≤n) ,求出其各个端点之间的最小距离以及路由。 (1)尽可能用M 函数分别实现算法的关键部分,用M 脚本来进行算法结 果验证; (2)分别用以下两个初始距离矩阵表示的图进行算法验证: 分别求出W(7)和R(7)。 2、根据最短路由矩阵查询任意两点间的最短距离和路由 (1)最短距离可以从最短距离矩阵的ω(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 源代码: 文档收集于互联网,已重新整理排版.word版本可编辑,有帮助欢迎下载支持. 1文档来源为:从网络收集整理.word版本可编辑. 【func1.m】 function [w r] = func1(w) n=length(w); x = w; r = zeros(n,1);%路由矩阵的初始化 for i=1:1:n for j=1:1:n if x(i,j)==inf r(i,j)=0; else r(i,j)=j; end, end end; %迭代求出k次w值 for k=1:n a=w; s = w; for i=1:n for j=1:n w(i,j)=min(s(i,j),s(i,k)+s(k,j)); end end %根据k-1次值和k次w值求出k次r值 for i=1:n for j=1:n if i==j r(i,j)=0; elseif w(i,j)r(i,j)=r(i,k); else r(i,j)=r(i,j); end end end end; 【func2.m】 function [P u]=func2(w,k1,k2) n = length(w); U = w; m = 1; while m <= n for i = 1:n; for j = 1:n; 文档收集于互联网,已重新整理排版.word版本可编辑,有帮助欢迎下载支持. 1文档来源为:从网络收集整理.word版本可编辑. if U(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; while kk~=k1 for i = 1:n V(1,i) = U(k1,kk) - w(i,kk); if V(1,i) == U(k1,i) P1(k+1)=i; kk=i; k=k+1; end end end k=1; wrow = find(P1~=0); for j=length(wrow):(-1):1 P(k) = P1(wrow(j)); k=k+1; end P; 【m1.m】 w1=[0 100 100 1.2 9.2 100 0.5; 100 0 100 5 100 3.1 2; 100 100 0 100 100 4 1.5; 1.2 5 100 0 6.7 100 100; 9.2 100 100 6.7 0 15.6 100; 100 3.1 4 100 15.6 0 100; 0.5 2 1.5 100 100 100 0]; w2=[0 0.5 2 1.5 100 100 100; 0.5 0 100 100 1.2 9.2 100; 2 100 0 100 5 100 3.1; 1.5 100 100 0 100 100 4; 100 1.2 5 100 0 6.7 100; 100 9.2 100 100 6.7 0 15.6; 文档收集于互联网,已重新整理排版.word版本可编辑,有帮助欢迎下载支持. 1文档来源为:从网络收集整理.word版本可编辑. 100 100 3.1 4 100 15.6 0]; [W1 R1] = func1(w1) [W2 R2] = func1(w2) 【m2.m】 w=input('输入权值矩阵w='); k1=input('输入端点1:k1='); k2=input('输入端点2:k2='); w [W R] = func1(w) [P u]=func2(w,k1,k2); disp(['k1、k2间最短路:',num2str(P)]); disp(['k1、k2间最短距离:',num2str(u)]);
五、数据结构 1.主要函数 最短距离、路由函数: function [w r] = func1(w) n=length(w); x = w; r = zeros(n,1);%路由矩阵的初始化 for i=1:1:n for j=1:1:n if x(i,j)==100 r(i,j)=0; else r(i,j)=j; end, end end; %迭代求出k次w值 for k=1:n a=w; s = w; for i=1:n for j=1:n w(i,j)=min(s(i,j),s(i,k)+s(k,j)); end end %根据k-1次值和k次w值求出k次r值 for i=1:n for j=1:n if i==j r(i,j)=0; 文档收集于互联网,已重新整理排版.word版本可编辑,有帮助欢迎下载支持. 1文档来源为:从网络收集整理.word版本可编辑. elseif w(i,j) r(i,j)=r(i,k); else r(i,j)=r(i,j); end end end end; 最短路径函数: function [P u]=func2(w,k1,k2) n = length(w); U = w; m = 1; while m <= n for i = 1:n; for j = 1:n; if U(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; while kk~=k1 for i = 1:n V(1,i) = U(k1,kk) - w(i,kk); if V(1,i) == U(k1,i) P1(k+1)=i; kk=i; k=k+1; end end end k=1; wrow = find(P1~=0); for j=length(wrow):(-1):1 P(k) = P1(wrow(j)); k=k+1; 文档收集于互联网,已重新整理排版.word版本可编辑,有帮助欢迎下载支持. 1文档来源为:从网络收集整理.word版本可编辑. end P; 2. 算法的流程图 Floyd算法:
六、实验结论与分析 通过上图可知,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
七、遇到的问题及解决方法
结束 开始 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