图论算法及其MATLAB程序代码.pdf
《图论算法及其MATLAB程序代码.pdf》由会员分享,可在线阅读,更多相关《图论算法及其MATLAB程序代码.pdf(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、图论算法及其 MATLAB程序代码 求赋权图 G=(V,E,F)中任意两点间的最短路的 Warshall-Floyd 算法:设 A=(aij)nn为赋权图 G=(V,E,F)的矩阵,当 vivjE 时 aij=F(vivj),否则取 aii=0,aij=+(ij),dij表示从 vi到 vj点的距离,rij表示从 vi到 vj点的最短路中一个点的编号.赋初值.对所有 i,j,dij=aij,rij=j.k=1.转向 更新 dij,rij.对所有 i,j,若 dik+dk jdij,则令 dij=dik+dk j,rij=k,转向.终止判断.若 dii0,则存在一条含有顶点 vi的负回路,终止;
2、或者 k=n 终止;否则令 k=k+1,转向.最短路线可由 rij得到.例 1 求图 6-4 中任意两点间的最短路.解:用 Warshall-Floyd 算法,MATLAB程序代码如下:n=8;A=0 2 8 1 Inf Inf Inf Inf 2 0 6 Inf 1 Inf Inf Inf 8 6 0 7 5 1 2 Inf 1 Inf 7 0 Inf Inf 9 Inf Inf 1 5 Inf 0 3 Inf 8 Inf Inf 1 Inf 3 0 4 6 Inf Inf 2 9 Inf 4 0 3 Inf Inf Inf Inf 8 6 3 0;%MATLAB 中,Inf表示 D=A;%
3、赋初值 for(i=1:n)for(j=1:n)R(i,j)=j;end;end%赋路径初值 for(k=1:n)for(i=1:n)for(j=1:n)if(D(i,k)+D(k,j)D(i,j)D(i,j)=D(i,k)+D(k,j);%更新 dij R(i,j)=k;end;end;end%更新 rij k%显示迭代步数 D%显示每步迭代后的路长 R%显示每步迭代后的路径 pd=0;for i=1:n%含有负权时 if(D(i,i)0)x(k)=A(i,j);%数组 x记录 A中不同的正数 kk=1;%临时变量 for(s=1:k-1)if(x(k)=x(s)kk=0;break;end
4、;end%排除相同的正数 k=k+kk;end;end;end k=k-1%显示 A中所有不同正数的个数 for(i=1:k-1)for(j=i+1:k)%将 x中不同的正数从小到大排序 if(x(j)0)kk=kk+1;zz=z;end;end%寻找 TT 中的树枝 if(kk=1)TT(y,zz)=0;TT(zz,y)=0;pd=0;end;end%砍掉 TT 中的树枝 if(pd)break;end;end%已砍掉了 TT 中所有的树枝 pd=0;%判断 TT 中是否有圈 for(y=1:n-1)for(z=y+1:n)if(TT(y,z)0)pd=1;break;end;end;end
5、 if(pd)T(i,j)=0;T(j,i)=0;%假如 TT 中有圈 else q=q+1;end;end;end;end;end T%显示近似最小生成树 T,程序结束 求二部图 G 的最大匹配的算法(匈牙利算法),其基本思想是:从 G 的任意匹配 M 开始,对 X 中所有 M 的非饱和点,寻找 M 增广路.若不存在 M 增广路,则 M 为最大匹配;若存在 M 增广路 P,则将 P 中 M 与非 M 的边互换得到比 M 多一边的匹配 M1,再对 M1重复上述过程.设 G=(X,Y,E)为二部图,其中 X=x1,x2,xn,Y=y1,y2,yn.任取 G 的一初始匹配 M(如任取 eE,则 M
6、=e是一个匹配).令 S=,T=,转向.若 M 饱和 X S 的所有点,则 M 是二部图 G 的最大匹配.否则,任取 M 的非饱和点uX S,令 S=S u,转向.记 N(S)=v|uS,uvE.若 N(S)=T,转向.否则取 yN(S)T.若 y是 M的饱和点,转向,否则转向.设 x yM,则令 S=S x,T=T y,转向.u y 路是 M增广路,设为 P,并令 M=MP,转向.这里 MP=MP MP,是对称差.由于计算 M增广路 P 比较麻烦,因此将迭代步骤改为:将 X 中 M 的所有非饱和点(不是 M 中某条边的端点)都给以标号 0 和标记*,转向.若 X 中所有有标号的点都已去掉了标
7、记*,则 M 是 G 的最大匹配.否则任取 X 中一个既有标号又有标记*的点 xi,去掉 xi的标记*,转向.找出在 G 中所有与 xi邻接的点 yj(即 xi yjE),若所有这样的 yj都已有标号,则转向,否则转向.对与xi邻接且尚未给标号的yj都给定标号i.若所有的yj都是M的饱和点,则转向,否则逆向返回.即由其中M的任一个非饱和点yj的标号i找到xi,再由xi的标号k找到yk,最后由 yt的标号 s找到标号为 0 的 xs时结束,获得M 增广路 xs yt xi yj,记P=xs yt,xi yj,重新记 M 为 MP,转向.将 yj在 M 中与之邻接的点 xk(即 xk yjM),给
8、以标号 j 和标记*,转向.例 1 求图 6-9 中所示的二部图 G 的最大匹配.匈牙利算法的 MATLAB程序代码如下:m=5;n=5;A=0 1 1 0 0 1 1 0 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 1 1;M(m,n)=0;for(i=1:m)for(j=1:n)if(A(i,j)M(i,j)=1;break;end;end%求初始匹配 M if(M(i,j)break;end;end%获得仅含一条边的初始匹配 M while(1)for(i=1:m)x(i)=0;end%将记录 X中点的标号和标记*for(i=1:n)y(i)=0;end%将记录 Y中点的
9、标号和标记*for(i=1:m)pd=1;%寻找 X中 M的所有非饱和点 for(j=1:n)if(M(i,j)pd=0;end;end if(pd)x(i)=-n-1;end;end%将 X中 M的所有非饱和点都给以标号 0 和标记*,程序中用 n+1 表示 0 标号,标号为负数时表示标记*pd=0;while(1)xi=0;for(i=1:m)if(x(i)1)k=k-1;for(j=1:k)pdd=1;for(i=1:m)if(M(i,yy(j)x(i)=-yy(j);pdd=0;break;end;end%将yj在 M中与之邻接的点 xk(即 xkyjM),给以标号 j 和标记*if(
10、pdd)break;end;end if(pdd)k=1;j=yy(j);%yj 不是 M的饱和点 while(1)P(k,2)=j;P(k,1)=y(j);j=abs(x(y(j);%任取 M的一个非饱和点 yj,逆向返回 if(j=n+1)break;end%找到 X中标号为 0 的点时结束,获得 M-增广路 P k=k+1;end for(i=1:k)if(M(P(i,1),P(i,2)M(P(i,1),P(i,2)=0;%将匹配 M 在增广路 P 中出现的边去掉 else M(P(i,1),P(i,2)=1;end;end%将增广路 P 中没有在匹配 M中出现的边加入到匹配 M中 br
11、eak;end;end;end if(pd)break;end;end%假如 X中所有有标号的点都已去掉了标记*,算法终止 M%显示最大匹配 M,程序结束 图 6-9 利用可行点标记求最佳匹配的算法步骤如下:设 G=(X,Y,E,F)为完备的二部赋权图,L 是其一个初始可行点标记,通常取.,0)(,|)(max)(YyXxyLYyxyFxL=M 是 GL的一个匹配.若X 的每个点都是 M 的饱和点,则 M 是最佳匹配.否则取 M 的非饱和点 uX,令 S=u,T=,转向.记NL(S)=v|uS,uvEL.若NL(S)=T,则GL没有完美匹配,转向.否则转向.调整可行点标记,计算 aL=min
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 及其 MATLAB 程序代码
限制150内