资源描述:
《基于数学软件的Floyd算法的实现》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、基于数学软件的Floyd算法的实现徐昌贵卢鹏(西南交通大学峨眉校区,四川峨眉614202)摘要:Floyd算法是图论中求一个图中任意两顶点间最短距离的一种算法。本文给出了实现Floyd算法的步骤,并给出了用数学软件Matlab与Mathematica实现Floyd算法的程序,可供同行们参考。关键词:Floyd算法,数学软件,Matlab,MathematicaFloyd算法是图论中求一个图中任意两顶点间最短距离的一种算法。Matlab与Mathematica是著名的3M数学软件中的其中两个,在工程计算,科学
2、研究,数学建模比赛中有广泛的应用。本人在长期的数学建模培训中,根据Floyd算法的原理编写了用Matlab与Mathematica这两个数学软件实现该算法的程序。1Floyd算法Floyd算法能实现求一个图中任意两顶点间的最短距离,并给出最短路径,并且对有向图和无向图都适合。Floyd算法的基本思想[1]是通过递推产生一个矩阵序列,其中表示从顶点到顶点的路径上所经过的顶点序号不大于的最短路径长度。计算时用迭代公式:这里是迭代次数,。最后,当时,即是各顶点之间的最短距离。设图G的顶点数为n,D=(dij)n×
3、n为其距离矩阵,实现Floyd算法的步骤如下:【Step1】输入距离矩阵D;【Step2】定义初值k=1;【Step3】赋值i=1;【Step4】dij=min(dij,dik+dkj),j=1,2,…,n;【Step5】i++;如果i≤n,转Step4;【Step6】k++;如果k≤n,转Step3;否则转Step7;【Step7】程序结束,输出结果。2Floyd算法的Mathematica实现下面是求最短路问题的Floyd算法的Mathematica实现程序,其中语句后面“(*”和“*)”之间的为注释,
4、不影响程序的运行。采用Mathematica5.0版本,在WINXP操作系统环境下调试运行通过。n=7;(*图的顶点数,根据需要可以进行修改*)4M=99999;(*足够大的一个数,是系统的一个上界*)T={{0,20,14,M,M,M,M},{M,0,M,15,12,M,M},{M,M,0,10,M,13,M},{M,M,M,0,8,M,9},{M,M,M,M,0,8,10},{M,M,M,M,M,0,12},{M,M,M,M,M,M,0}};(*图的距离矩阵,可以是有向图或无向图*)B=Table[{i
5、,j},{i,n},{j,n}];For[k=1,k<=n,k++,For[i=1,i<=n,i++,If[k!=i,For[j=1,j<=n,j++,If[i!=j&&k!=j&&T[[i,j]]>T[[i,k]]+T[[k,j]],T[[i,j]]=T[[i,k]]+T[[k,j]];p=Delete[B[[k,j]],1];B[[i,j]]=Join[B[[i,k]],p];]]]]];Print["任意两城市之间的最短路:",MatrixForm[T]];(*T为最短路*)Print["任意两城市之
6、间的最短路的路径:",MatrixForm[B]];(*B为最短路径*)3Floyd算法的Matlab实现下面是求最短路问题的Floyd算法的Matlab实现程序。采用Matlab7.0版本,在WINXP操作系统环境下调试运行通过。先建立一个floyd.m的文件:function[d,r]=floyd(a)n=size(a,1);d=a;fori=1:nforj=1:nr(i,j)=j;endendr;fork=1:nfori=1:nforj=1:nifd(i,k)+d(k,j)7、d(i,k)+d(k,j);r(i,j)=r(i,k);endendendk;d;r;4endr然后在命令窗口中输入:M=99999;a=[0,20,14,M,M,M,MM,0,M,15,12,M,MM,M,0,10,M,13,MM,M,M,0,8,M,9M,M,M,M,0,8,10M,M,M,M,M,0,12M,M,M,M,M,M,0];length=floyd(a)4算例如下图是一个7个顶点的有向图,现需计算任意两顶点间的最短距离及最短路径。该图的距离矩阵为(M表示一个充分大的正数):用上面编写的mat
8、hematica程序运行的结果如下:4从结果可以清楚的看到,从顶点①到顶点⑦的最短路为33,最短路径为①→③→④→⑦。用上面编写的Matlab程序运行的结果如下:可见,两个软件运行的结果是一致的。参考文献[1]卢开澄,卢华明:图论及其应用(第2版),北京:清华大学出版社,2003年11月,第90-94页作者简介:徐昌贵(1970-),男,四川广汉人,四川峨眉西南交通大学峨眉校区副教授,主要从事应用数学方面的研究。