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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、实验目的

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

二、实验原理

Floyd 算法适用于求解网络中的任意两点间的最短路径:通过图的权值矩阵求出任意两点间的最短距离矩阵和路由矩阵。优点是容易理解,可以算出任意两个

节点之间最短距离的算法,且程序容易实现,缺点是复杂度达到,不适合计算大量数据。

Floyd 算法可描述如下:

给定图G及其边(i , j ) 的权w, j (1 < i < n ,1

FO:初始化距离矩阵W°)和路由矩阵R0)。其中:

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

F2:若kn,终止。??

三、实验内容

1、用MATLAB仿真工具实现Floyd算法:给定图G及其边(i , j ) 的权

w, j (1 < i < n ,1 < j < n),求出其各个端点之间的最小距离以及路由。

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

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

分别求出WT和R7)。

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 源代码:【】 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)

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;

P;

【】

w1=[0 100 100 100 ;

100 0 100 5 100 2;

100 100 0 100 100 4 ; 5 100 0 100 100;

100 100 0 100;

100 4 100 0 100;

2 100 100 100 0]; w2=[0 2 100 100 100;

0 100 100 100;

2 100 0 100 5 100 ;

100 100 0 100 100 4;

100 5 100 0 100;

100 100 100 0 ;

100 100 4 100 0]; [W1 R1] = func1(w1) [W2 R2] = func1(w2)

【】 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));

相关文档
最新文档