matlab图论程序算法大全.docx
- 文档编号:24430054
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:39
- 大小:24.43KB
matlab图论程序算法大全.docx
《matlab图论程序算法大全.docx》由会员分享,可在线阅读,更多相关《matlab图论程序算法大全.docx(39页珍藏版)》请在冰豆网上搜索。
matlab图论程序算法大全
图论算法matlab实现
求最小费用最大流算法的MATLAB程序代码如下:
n=5;C=[0151600
0001314
0110170
00008
00000];%弧容量
b=[04100
00061
02030
00002
00000];%弧上单位流量的费用
wf=0;wf0=Inf;%wf表示最大流量,wf0表示预定的流量值
for(i=1:
n)for(j=1:
n)f(i,j)=0;end;end%取初始可行流f为零流
while
(1)
for(i=1:
n)for(j=1:
n)if(j~=i)a(i,j)=Inf;end;end;end%构造有向赋权图
for(i=1:
n)for(j=1:
n)if(C(i,j)>0&f(i,j)==0)a(i,j)=b(i,j);
elseif(C(i,j)>0&f(i,j)==C(i,j))a(j,i)=-b(i,j);
elseif(C(i,j)>0)a(i,j)=b(i,j);a(j,i)=-b(i,j);end;end;end
for(i=2:
n)p(i)=Inf;s(i)=i;end%用Ford算法求最短路,赋初值
for(k=1:
n)pd=1;%求有向赋权图中vs到vt的最短路
for(i=2:
n)for(j=1:
n)if(p(i)>p(j)+a(j,i))p(i)=p(j)+a(j,i);s(i)=j;pd=0;end;end;end
if(pd)break;end;end%求最短路的Ford算法结束
if(p(n)==Inf)break;end%不存在vs到vt的最短路,算法终止.注意在求最小费用最大流时构造有
向赋权图中不会含负权回路,所以不会出现k=n
dvt=Inf;t=n;%进入调整过程,dvt表示调整量
while
(1)%计算调整量
if(a(s(t),t)>0)dvtt=C(s(t),t)-f(s(t),t);%前向弧调整量
elseif(a(s(t),t)<0)dvtt=f(t,s(t));end%后向弧调整量
if(dvt>dvtt)dvt=dvtt;end
if(s(t)==1)break;end%当t的标号为vs时,终止计算调整量
t=s(t);end%继续调整前一段弧上的流f
pd=0;if(wf+dvt>=wf0)dvt=wf0-wf;pd=1;end%如果最大流量大于或等于预定的流量值
t=n;while
(1)%调整过程
if(a(s(t),t)>0)f(s(t),t)=f(s(t),t)+dvt;%前向弧调整
elseif(a(s(t),t)<0)f(t,s(t))=f(t,s(t))-dvt;end%后向弧调整
if(s(t)==1)break;end%当t的标号为vs时,终止调整过程
t=s(t);end
if(pd)break;end%如果最大流量达到预定的流量值
wf=0;for(j=1:
n)wf=wf+f(1,j);end;end%计算最大流量
zwf=0;for(i=1:
n)for(j=1:
n)zwf=zwf+b(i,j)*f(i,j);end;end%计算最小费用
f%显示最小费用最大流
图6-22
wf%显示最小费用最大流量
zwf%显示最小费用,程序结束__
Kruskal避圈法:
Kruskal避圈法的MATLAB程序代码如下:
n=8;A=[02810000
20601000
86075120
10700090
01500308
00103046
00290403
00008630];
k=1;%记录A中不同正数的个数
for(i=1:
n-1)for(j=i+1:
n)%此循环是查找A中所有不同的正数
if(A(i,j)>0)x(k)=A(i,j);%数组x记录A中不同的正数
kk=1;%临时变量
for(s=1:
k-1)if(x(k)==x(s))kk=0;break;end;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) T(n,n)=0;%将矩阵T中所有的元素赋值为0 q=0;%记录加入到树T中的边数 for(s=1: k)if(q==n)break;end%获得最小生成树T,算法终止 for(i=1: n-1)for(j=i+1: n)if(A(i,j)==x(s))T(i,j)=x(s);T(j,i)=x(s);%加入边到树T中 TT=T;%临时记录T while (1)pd=1;%砍掉TT中所有的树枝 for(y=1: n)kk=0; for(z=1: n)if(TT(y,z)>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 if(pd)T(i,j)=0;T(j,i)=0;%假如TT中有圈 elseq=q+1;end;end;end;end;end T%显示近似最小生成树T,程序结束 用Warshall-Floyd算法求任意两点间的最短路. n=8;A=[0281InfInfInfInf 206Inf1InfInfInf 8607512Inf 1Inf70InfInf9Inf Inf15Inf03Inf8 InfInf1Inf3046 InfInf29Inf403 InfInfInfInf8630];%MATLAB中,Inf表示∞ D=A;%赋初值 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) R(i,j)=k;end;end;end%更新rij k%显示迭代步数 D%显示每步迭代后的路长 R%显示每步迭代后的路径 pd=0;fori=1: n%含有负权时 if(D(i,i)<0)pd=1;break;end;end%存在一条含有顶点vi的负回路 if(pd)break;end%存在一条负回路,终止程序 end%程序结束 利用Ford--Fulkerson标号法求最大流算法的MATLAB程序代码如下: n=8;C=[05430000 00005300 00000320 00000020 00000004 00000003 00000005 00000000];%弧容量 for(i=1: n)for(j=1: n)f(i,j)=0;end;end%取初始可行流f为零流 for(i=1: n)No(i)=0;d(i)=0;end%No,d记录标号 图6-19 while (1) No (1)=n+1;d (1)=Inf;%给发点vs标号 while (1)pd=1;%标号过程 for(i=1: n)if(No(i))%选择一个已标号的点vi for(j=1: n)if(No(j)==0&f(i,j) No(j)=i;d(j)=C(i,j)-f(i,j);pd=0; if(d(j)>d(i))d(j)=d(i);end elseif(No(j)==0&f(j,i)>0)%对于未给标号的点vj,当vjvi为非零流弧时 No(j)=-i;d(j)=f(j,i);pd=0; if(d(j)>d(i))d(j)=d(i);end;end;end;end;end if(No(n)|pd)break;end;end%若收点vt得到标号或者无法标号,终止标号过程 if(pd)break;end%vt未得到标号,f已是最大流,算法终止 dvt=d(n);t=n;%进入调整过程,dvt表示调整量 while (1) if(No(t)>0)f(No(t),t)=f(No(t),t)+dvt;%前向弧调整 elseif(No(t)<0)f(No(t),t)=f(No(t),t)-dvt;end%后向弧调整 if(No(t)==1)for(i=1: n)No(i)=0;d(i)=0;end;break;end%当t的标号为vs时,终止调整过程 t=No(t);end;end;%继续调整前一段弧上的流f wf=0;for(j=1: n)wf=wf+f(1,j);end%计算最大流量 f%显示最大流 wf%显示最大流量 No%显示标号,由此可得最小割,程序结束 图论程序大全 程序一: 关联矩阵和邻接矩阵互换算法 functionW=incandadf(F,f) iff==0 m=sum(sum(F))/2; n=size(F,1); W=zeros(n,m); k=1; fori=1: n forj=i: n ifF(i,j)~=0 W(i,k)=1; W(j,k)=1; k=k+1; end end end elseiff==1 m=size(F,2); n=size(F,1); W=zeros(n,n); fori=1: m a=find(F(: i)~=0); W(a (1),a (2))=1; W(a (2),a (1))=1; end else fprint('Pleaseimputtherightvalueoff'); end W; 程序二: 可达矩阵算法 functionP=dgraf(A) n=size(A,1); P=A; fori=2: n P=P+A^i; end P(P~=0)=1; P; 程序三: 有向图关联矩阵和邻接矩阵互换算法 functionW=mattransf(F,f) iff==0 m=sum(sum(F)); n=size(F,1); W=zeros(n,m); k=1; fori=1: n forj=i: n ifF(i,j)~=0 W(i,k)=1; W(j,k)=-1; k=k+1; end end end elseiff==1 m=size(F,2); n=size(F,1); W=zeros(n,n); fori=1: m a=find(F(: i)~=0); ifF(a (1),i)==1 W(a (1),a (2))=1; else W(a (2),a (1))=1; end end else fprint('Pleaseimputtherightvalueoff'); end W; 第二讲: 最短路问题 程序一: Dijkstra算法(计算两点间的最短路) function[l,z]=Dijkstra(W) n=size(W,1); fori=1: n l(i)=W(1,i); z(i)=0; end i=1; whilei<=n forj=1: n ifl(i)>l(j)+W(j,i) l(i)=l(j)+W(j,i); z(i)=j-1; ifj i=j-1; end end end i=i+1; end 程序二: floyd算法(计算任意两点间的最短距离) function[d,r]=floyd(a) n=size(a,1); d=a; fori=1: n forj=1: n r(i,j)=j; end end r; fork=1: n fori=1: n forj=1: n ifd(i,k)+d(k,j) d(i,j)=d(i,k)+d(k,j); r(i,j)=r(i,k); end end end end 程序三: n2short.m计算指定两点间的最短距离 function[Pu]=n2short(W,k1,k2) n=length(W); U=W; m=1; whilem<=n fori=1: n forj=1: n ifU(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)*inf; kk=k2; whilekk~=k1 fori=1: n V(1,i)=U(k1,kk)-W(i,kk); ifV(1,i)==U(k1,i) P1(k+1)=i; kk=i; k=k+1; end end end k=1; wrow=find(P1~=0); forj=length(wrow): -1: 1 P(k)=P1(wrow(j)); k=k+1; end P; 程序四、n1short.m(计算某点到其它所有点的最短距离) function[PmD]=n1short(W,k) n=size(W,1); D=zeros(1,n); fori=1: n [Pd]=n2short(W,k,i); Pm{i}=P; D(i)=d; end 程序五: pass2short.m(计算经过某两点的最短距离) function[Pd]=pass2short(W,k1,k2,t1,t2) [p1d1]=n2short(W,k1,t1); [p2d2]=n2short(W,t1,t2); [p3d3]=n2short(W,t2,k2); dt1=d1+d2+d3; [p4d4]=n2short(W,k1,t2); [p5d5]=n2short(W,t2,t1); [p6d6]=n2short(W,t1,k2); dt2=d4+d5+d6; ifdt1 d=dt1; P=[p1p2(2: length(p2))p3(2: length(p3))]; else d=dt1; p=[p4p5(2: length(p5))p6(2: length(p6))]; end P; d; 第三讲: 最小生成树 程序一: 最小生成树的Kruskal算法 function[Tc]=krusf(d,flag) ifnargin==1 n=size(d,2); m=sum(sum(d~=0))/2; b=zeros(3,m); k=1; fori=1: n forj=(i+1): n ifd(i,j)~=0 b(1,k)=i;b(2,k)=j; b(3,k)=d(i,j); k=k+1; end end end else b=d; end n=max(max(b(1: 2,: ))); m=size(b,2); [B,i]=sortrows(b',3); B=B'; c=0;T=[]; k=1;t=1: n; fori=1: m ift(B(1,i))~=t(B(2,i)) T(1: 2,k)=B(1: 2,i); c=c+B(3,i); k=k+1; tmin=min(t(B(1,i)),t(B(2,i))); tmax=max(t(B(1,i)),t(B(2,i))); forj=1: n ift(j)==tmax t(j)=tmin; end end end ifk==n break; end end T; c; 程序二: 最小生成树的Prim算法 function[Tc]=Primf(a) l=length(a); a(a==0)=inf; k=1: l; listV(k)=0; listV (1)=1; e=1; while(e min=inf; fori=1: l iflistV(i)==1 forj=1: l iflistV(j)==0&min>a(i,j) min=a(i,j);b=a(i,j); s=i;d=j; end end end end listV(d)=1; distance(e)=b; source(e)=s; destination(e)=d; e=e+1; end T=[source;destination]; forg=1: e-1 c(g)=a(T(1,g),T(2,g)); end c; 另外两种程序 最小生成树程序1(prim算法构造最小生成树) a=[inf5060infinfinfinf;50infinf6540infinf;60infinf52infinf45;... inf6552inf503042;inf40inf50inf70inf;infinfinf3070infinf;... infinf4542infinfinf]; result=[];p=1;tb=2: length(a); whilelength(result)~=length(a)-1 temp=a(p,tb);temp=temp(: ); d=min(temp); [jb,kb]=find(a(p,tb)==d); j=p(jb (1));k=tb(kb (1)); result=[result,[j;k;d]];p=[p,k];tb(find(tb==k))=[]; end result 最小生成树程序2(Kruskal算法构造最小生成树) clc;clear; a(1,2)=50;a(1,3)=60;a(2,4)=65;a(2,5)=40; a(3,4)=52;a(3,7)=45;a(4,5)=50;a(4,6)=30; a(4,7)=42;a(5,6)=70; [i,j,b]=find(a); data=[i';j';b'];index=data(1: 2,: ); loop=max(size(a))-1; result=[]; whilelength(result) temp=min(data(3,: )); flag=find(data(3,: )==temp); flag=flag (1); v1=data(1,flag);v2=data(2,flag); ifindex(1,flag)~=index(2,flag) result=[result,data(: flag)]; end index(find(index==v2))=v1; data(: flag)=[]; index(: flag)=[]; end result 第四讲: Euler图和Hamilton图 程序一: Fleury算法(在一个Euler图中找出Euler环游) 注: 包括三个文件;fleuf1.m,edf.m,flecvexf.m function[Tc]=fleuf1(d) %注: 必须保证是Euler环游,否则输出T=0,c=0 n=length(d); b=d; b(b==inf)=0; b(b~=0)=1; m=0; a=sum(b); eds=sum(a)/2; ed=zeros(2,eds); vexs=zeros(1,eds+1); matr=b; fori=1: n ifmod(a(i),2)==1 m=m+1; end end ifm~=0 fprintf('thereisnotexitEulerpath.\n') T=0;c=0; end ifm==0 vet=1; flag=0; t1=find(matr(vet,: )==1); forii=1: length(t1) ed(: 1)=[vet,t1(ii)]; vexs(1,1)=vet;vexs(1,2)=t1(ii); matr(vexs(1,2),vexs(1,1))=0; flagg=1;tem=1; whileflagg [flagged]=edf(matr,eds,vexs,ed,tem); tem=tem+1; ifed(1,eds)~=0&ed(2,eds)~=0 T=ed; T(2,eds)=1; c=0; forg=1: eds c=c+d(T(1,g),T(2,g)); end flagg=0; break; end end end end function[flaged]=edf(matr,eds,vexs,ed,tem) flag=1; fori=2: eds [dvexf]=flecvexf(matr,i,vexs,eds,ed,tem); iff==1 flag=0; break; end ifdvex~=0 ed(: i)=[vexs(1,i)dvex]; vexs(1,i+1)=dvex; matr(vexs(1,i+1),vexs(1,i))=0; else break; end end function[dvexf]=flecvexf(matr,i,vexs,eds,ed,temp) f=0; edd=find(matr(vexs(1,i),: )==1); dvex=0; dvex1=[]; ded=[]; iflength(edd)==1 dvex=edd; else dd=1;dd1=0;kkk=0; forkk=1: length(edd) m
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- matlab 程序 算法 大全