计算机仿真期末作业
姓名:吴隐奎 班级:04601 学号:041751 日期:2007-6-15
题目:Floyd 算法实现和分析
内容:用MATLAB 仿真工具实现Floyd 算法,求任意两端间的最短路径。
要求:尽可能用M 函数分别实现算法的关键部分,用M 脚本来进行算法结果验证;分别用以下两个图(用初始距离矩阵表示)进行算法验证:
图一:(0)0 100 100 1.2 9.2 100 0.5100 0 100 5 100 3.1 2100 100 0 100 100 4 1.51.2 5 100 0 6.7 100 1009.2 100 100 6.7 0 15.6 100100 3.1 4 100 15.6 0 1000.5 2 1.5 100 100 100 0]W ⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦
图二:(0)
0 0.5 2 1.5 100 100 1000.5 0 100 100 1.2 9.2 1002 100 0 100 5 100 3.11.5 100 100 0 100 100 4100 1.2 5 100 0 6.7 100100 9.2 100 100 6.7 0 15.6100 100 3.1 4 100 15.6 0W ⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦
算法:给定图G 及其边(,)i j 的权,(1,1)i j w i n j n ≤≤≤
≤ F0:初始化距离矩阵(0)W
和路由矩阵(0)R 。
其中: (0)0ij ij ij ij w e E w e E i j ∈⎧⎪=∞∉⎨⎪=⎩ 若(有边) 若(无边)
若(对角线元素)
(0)(0)w 0,ij ij
j r ⎧≠∞=⎨⎩ 若 其它 F1:已求得(-1)k W 和(-1)k R ,依据下面的迭代求()k W 和()k R
()(1)(1)(-1),,,,min(,)k k k k i j i j i k k j w w w w --=+
(1)()(1),,,(),(1)()(1),,,k k k i k i j i j k i j k k k i j i j i j
r w w r r w w ----⎧<⎪=⎨=⎪⎩ 若 若 F2:若k<n ,重复F1;若k=n ,终止。
仿真:
用四个m 文件来实现仿真,其中main 为主函数,首先测试出矩阵的长度,然后赋给n ,作为循环的次数;然后调用func1实现路由矩阵的初始化,把第k-1次的值付给a 后,调用func2函数来迭代求出k 次的w 值,调用func3函数,根据a (实际上为k-1次w 值)值和k 次w 值来求出k 次r 值。
迭代循环n 次。
主要程序:
n=length(w);
r=func1(w,n);
for k=1:n
a=w;
w=func2(w,n,k);
r=func3(a,w,r,n,k);
end;
Func1实现路由矩阵的初始化
主要程序
for i=1:1:n
for j=1:1:n
if x(i,j)==100
r0(i,j)=0;
else
r0(i,j)=j;
end,
end;
end;
Fuuc2该函数实现的功能是根据k-1次w 的值迭代求k 次w 的值
主要程序
for i=1:n
for j=1:n
w(i,j)=min(s(i,j),s(i,k)+s(k,j));
end
end
Func3来根据k-1次w 值和k 次w 值的大小求k 次R 的值
主要程序:
for i=1:n
for j=1:n
if i==j
r(i,j)=0;
elseif w(i,j)<a(i,j)
r(i,j)=r(i,k);
else
r(i,j)=r(i,j);
end
end
end
结果:
图一的结果:
w=
0 2.5000 2.0000 1.2000 7.9000 5.6000 0.5000
2.5000 0
3.5000 3.7000 10.4000 3.1000 2.0000
2.0000
3.5000 0 3.2000 9.9000
4.0000 1.5000
1.2000 3.7000 3.2000 0 6.7000 6.8000 1.7000
7.9000 10.4000 9.9000 6.7000 0 13.5000 8.4000
5.6000 3.1000 4.0000
6.8000 13.5000 0 5.1000
0.5000 2.0000 1.5000 1.7000 8.4000 5.1000 0
r=
0 7 7 4 4 7 7
7 0 7 7 7 6 7
7 7 0 7 7 6 7
1 1 1 0 5 1 1
4 4 4 4 0 4 4
2 2
3 2 2 0 2
1 2 3 1 1 2 0
可以看出:V4和V6之间最短距离是6.8,最短路由是V4—>V1—>V7—>V2—>V6 V3和V4之间最短距离是3.2,最短路由是V3—>V7—>V1—>V4
图二的结果:
w =
0 0.5000 2.0000 1.5000 1.7000 8.4000 5.1000
0.5000 0 2.5000 2.0000 1.2000 7.9000 5.6000
2.0000 2.5000 0
3.5000 3.7000 10.4000 3.1000
1.5000
2.0000
3.5000 0 3.2000 9.9000
4.0000
1.7000 1.2000 3.7000 3.2000 0 6.7000 6.8000
8.4000 7.9000 10.4000 9.9000 6.7000 0 13.5000
5.1000 5.6000 3.1000 4.0000
6.8000 13.5000 0
r =
0 2 3 4 2 2 3
1 0 1 1 5 5 1
1 1 0 1 1 1 7
1 1 1 0 1 1 7
2 2 2 2 0 6 2
5 5 5 5 5 0 5
3 3 3
4 3 3 0
端点对V1和V7之间最短距离是5.1,最短路由是V1—>V3—>V7
端点对V3和V5之间最短距离是3.7,最短路由是V3—>V1—>V2—>V5
端点对V1和V6之间最短距离是8.4,最短路由是V1—>V2—>V5—>V6
总结:通过一个学期计算机仿真课的学习,我现在已经能很熟练的使用的仿真工具matlab来进行一些简单的系统仿真,系统的仿真,能很好的帮助我们去理解各种模型,验证书本上的理论知识,而且仿真在系统设计中也有很重要的应用,通过仿真,可以节约成本和时间。
所以这门课的学习,对我以后的学习和工作有很大的帮助。