ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:20KB ,
资源ID:8349733      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8349733.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(图论matlab模板程序.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

图论matlab模板程序.docx

1、图论matlab模板程序第一讲:图论模型程序一:可达矩阵算法%根据邻接矩阵A(有向图)求可达矩阵P(有向图)function P=dgraf(A)n=size(A,1);P=A;for i=2:n P=P+Ai;endP(P=0)=1; %将不为0的元素变为1P;程序二:无向图关联矩阵和邻接矩阵互换算法F表示所给出的图的相应矩阵W表示程序运行结束后的结果f=0表示把邻接矩阵转换为关联矩阵f=1表示把关联矩阵转换为邻接矩阵%无向图的关联矩阵和邻接矩阵的相互转换function W=incandadf(F,f)if f=0 %邻接矩阵转换为关联矩阵 m=sum(sum(F)/2; %计算图的边数

2、n=size(F,1); W=zeros(n,m); k=1; for i=1:n for j=i:n if F(i,j)=0 W(i,k)=1; %给边的始点赋值为1 W(j,k)=1; %给边的终点赋值为1 k=k+1; end end endelseif f=1 %关联矩阵转换为邻接矩阵 m=size(F,2); n=size(F,1); W=zeros(n,n); for i=1:m a=find(F(:,i)=0); W(a(1),a(2)=1; %存在边,则邻接矩阵的对应值为1 W(a(2),a(1)=1; endelse fprint(Please imput the right

3、 value of f);endW;程序三:有向图关联矩阵和邻接矩阵互换算法%有向图的关联矩阵和邻接矩阵的转换function W=mattransf(F,f)if f=0 %邻接矩阵转换为关联矩阵 m=sum(sum(F); n=size(F,1); W=zeros(n,m); k=1; for i=1:n for j=i:n if F(i,j)=0 %由i发出的边,有向边的始点 W(i,k)=1; %关联矩阵始点值为1 W(j,k)=-1; %关联矩阵终点值为-1 k=k+1; end end endelseif f=1 %关联矩阵转换为邻接矩阵 m=size(F,2); n=size(F

4、,1); W=zeros(n,n); for i=1:m a=find(F(:,i)=0); %有向边的两个顶点 if F(a(1),i)=1 W(a(1),a(2)=1; %有向边由a(1)指向a(2) else W(a(2),a(1)=1; %有向边由a(2)指向a(1) end end else fprint(Please imput the right value of f);endW;第二讲:最短路问题程序0:最短距离矩阵W表示图的权值矩阵D表示图的最短距离矩阵%连通图中各项顶点间最短距离的计算function D=shortdf(W)%对于W(i,j),若两顶点间存在弧,则为弧的权

5、值,否则为inf;当i=j时W(i,j)=0n=length(W);D=W;m=1;while mD(i,m)+D(m,j) D(i,j)+ D(i,m)+D(m,j); %距离进行更新 endendendm=m+1;endD;程序一:Dijkstra算法(计算两点间的最短路)function l,z=Dijkstra(W)n = size (W,1);for i = 1 :n l(i)=W(1,i); z(i)=0;end i=1;while il(j)+W(j,i) l(i)=l(j)+W(j,i); z(i)=j-1; if ji i=j-1; end end end i=i+1;end

6、程序二:floyd算法(计算任意两点间的最短距离)function d,r=floyd(a) n=size(a,1); d=a; for i=1:n for j=1:n r(i,j)=j; end end r; 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); r(i,j)=r(i,k); end end end end程序三:n2short.m 计算指定两点间的最短距离function P u=n2short(W,k1,k2)n=length(W);U=W;m=1;while mU(i,m)+

7、U(m,j) U(i,j)=U(i,m)+U(m,j); end end end m=m+1;endu=U(k1,k2);P1=zeros(1,n);k=1;P1(k)=k2;V=ones(1,n)*inf;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 endendk=1;wrow=find(P1=0);for j=length(wrow):-1:1 P(k)=P1(wrow(j); k=k+1;endP;程序四、n1short.m(计算某点到

8、其它所有点的最短距离)functionPm D=n1short(W,k)n=size(W,1);D=zeros(1,n);for i=1:n P d=n2short(W,k,i); Pmi=P; D(i)=d;end程序五:pass2short.m(计算经过某两点的最短距离)function P d=pass2short(W,k1,k2,t1,t2) p1 d1=n2short(W,k1,t1);p2 d2=n2short(W,t1,t2);p3 d3=n2short(W,t2,k2);dt1=d1+d2+d3;p4 d4=n2short(W,k1,t2);p5 d5=n2short(W,t2

9、,t1);p6 d6=n2short(W,t1,k2);dt2=d4+d5+d6;if dt1dt2 d=dt1; P=p1 p2(2:length(p2) p3(2:length(p3);else d=dt1; p=p4 p5(2:length(p5) p6(2:length(p6);endP;d;第三讲:最小生成树程序一:最小生成树的Kruskal算法function T c=krusf(d,flag)if nargin=1 n=size(d,2); m=sum(sum(d=0)/2; b=zeros(3,m); k=1; for i=1:n for j=(i+1):n if d(i,j)

10、=0 b(1,k)=i;b(2,k)=j; b(3,k)=d(i,j); k=k+1; end end endelse 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; for i=1:m if t(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); for j=1:n if t(j)=tmax t(j)=tmi

11、n; end end end if k=n break; end endT; c;程序二:最小生成树的Prim算法function T c=Primf(a)l=length(a);a(a=0)=inf;k=1:l;listV(k)=0;listV(1)=1;e=1;while (ea(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;endT=source;destination;for g=1:e-1 c(g)=a

12、(T(1,g),T(2,g);endc;第四讲:Euler图和Hamilton图程序一:Fleury算法(在一个Euler图中找出Euler环游)注:包括三个文件;fleuf1.m, edf.m, flecvexf.mfunction T c=fleuf1(d)%注:必须保证是Euler环游,否则输出T=0,c=0n=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;for i=1:n if mod(a(i),2)=1 m=m+1; end

13、endif m=0 fprintf(there is not exit Euler path.n) T=0;c=0;endif m=0 vet=1; flag=0; t1=find(matr(vet,:)=1); for ii=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; while flagg flagg ed=edf(matr,eds,vexs,ed,tem); tem=tem+1; if ed(1,eds)=0 & ed

14、(2,eds)=0 T=ed; T(2,eds)=1; c=0; for g=1:eds c=c+d(T(1,g),T(2,g); end flagg=0; break; end end endendfunctionflag ed=edf(matr,eds,vexs,ed,tem)flag=1;for i=2:eds dvex f=flecvexf(matr,i,vexs,eds,ed,tem); if f=1 flag=0; break; end if dvex=0 ed(:,i)=vexs(1,i) dvex; vexs(1,i+1)=dvex; matr(vexs(1,i+1),vexs

15、(1,i)=0; else break; endendfunction dvex f=flecvexf(matr,i,vexs,eds,ed,temp)f=0;edd=find(matr(vexs(1,i),:)=1);dvex=0;dvex1=;ded=;if length(edd)=1 dvex=edd;else dd=1;dd1=0;kkk=0; for kk=1:length(edd) m1=find(vexs=edd(kk); if sum(m1)=0 dvex1(dd)=edd(kk); dd=dd+1; dd1=1; else kkk=kkk+1; end end if kkk=

16、length(edd) tem=vexs(1,i)*ones(1,kkk); edd1=tem;edd; for l1=1:kkk lt=0;ddd=1; for l2=1:eds if edd1(1:2,l1)=ed(1:2,l2) lt=lt+1; end end if lt=0 ded(ddd)=edd(l1); ddd=ddd+1; end end end if templength(dvex1) & temp=length(ded) dvex=ded(temp); else f=1; endend程序二:Hamilton改良圈算法(找出比较好的Hamilton路)function C

17、 d1= hamiltonglf(v)%d表示权值矩阵%C表示算法最终找到的Hamilton圈。%v = 51 67;37 84;41 94;2 99;18 54;4 50;24 42;25 38;13 40;7 64;22 60;25 62;18 40;41 26;n=size(v,1);subplot(1,2,1)hold on;plot (v(:,1),v(:,2),*); %描点for i=1:n str1=V;str2=num2str(i); dot=str1,str2; text(v(i,1)-1,v(i,2)-2,dot); %给点命名endplot (v(:,1),v(:,2)

18、;%连线plot(v(n,1),v(1,1),v(n,2),v(1,2);for i =1:n for j=1:n d(i,j)=sqrt(v(i,1)-v(j,1)2+(v(i,2)-v(j,2)2); endendd2=0;for i=1:n if i3 for m=4:n+1 for i=1:(m-3) for j=(i+2):(m-1) if (d(C(i),C(j)+d(C(i+1),C(j+1)d(C(i),C(i+1)+d(C(j),C(j+1) C1(1:i)=C(1:i); for k=(i+1):j C1(k)=C(j+i+1-k); end C1(j+1):m)=C(j+

19、1):m); end end end end elseif n=3 if nfloor(a(1)/n) t2=floor(a(1)/n)+1; else t2=floor(a(1)/n); end J(t1,t2)=1,J(t2,t1)=1; W(t1,:)=0;W(t2,:)=0; W(:,t1)=0;W(:,t2)=0;endJ;程序二:匈牙利算法(完美匹配算法,包括三个文件fc01,fc02,fc03)function e,s=fc01(a,flag)if nargin=1 flag=0;endb=a;if flag=0 cmax=max(max(b); b=cmax-b;endm=si

20、ze(b);for i =1:m(1) b(i,:)=b(i,:)-min(b(i,:);endfor j=1:m(2) b(:,j)=b(:,j)-min(b(:,j);endd=(b=0);e,total=fc02(d);while total=m(1) b=fc03(b,e); d=(b=0); e,total=fc02(d);endinx=sub2ind(size(a),e(:,1),e(:,2);e=e,a(inx);s=sum(a(inx);function e,total=fc02(d)total=0;m=size(d);e=zeros(m(1),2);t=sum(sum(d);

21、nump=sum(d);while t=0 s,inp=sort(nump); inq=find(s); ep=inp(inq(1); inp=find(d(ep,:); numq=sum(d(:,inp); s,inq=sort(numq); eq=inp(inq(1); total=total+1; e(total,:)=ep,eq; inp=find(d(:,eq); nump(inp)=nump(inp)-1; nump(ep)=0; t=t-sum(d(ep,:)-sum(d(:,eq)+1; d(ep,:)=0*d(ep,:); d(:,eq)=0*d(:,eq);endfunct

22、ion b=fc03(b,e)m=size(b);t=1;p=ones(m(1),1);q=zeros(m(1),1);inp=find(e(:,1)=0);p(e(inp,1)=0;while t=0 tp=sum(p+q); inp=find(p=1); n=size(inp); for i=1:n(1) inq=find(b(inp(i),:)=0); q(inq)=1; end inp=find(q=1); n=size(inp); for i=1:n(1) if all(e(:,2)-inp(i)=0 inq=find(e(:,2)-inp(i)=0); p(e(inq)=1; en

23、d end tq=sum(p+q); t=tq-tp;endinp=find(p=1);inq=find(q=0);cmin=min(min(b(inp,inq);inq=find(q=1);b(inp,:)=b(inp,:)-cmin;b(:,inq)=b(:,inq)+cmin;第六讲:最大流最小费用问题程序一:2F算法(Ford-Fulkerson算法),求最大流%C=0 5 4 3 0 0 0 0;0 0 0 0 5 3 0 0;0 0 0 0 0 3 2 0;0 0 0 0 0 0 2 0;%0 0 0 0 0 0 0 4;0 0 0 0 0 0 0 3;0 0 0 0 0 0 0

24、5;0 0 0 0 0 0 0 0 function f wf=fulkersonf(C,f1)%C表示容量%f1表示当前流量,默认为0%f表示最大流%wf表示最大流的流量n=length(C);if nargin=1; f=zeros(n,n);else f=f1;endNo=zeros(1,n);d=zeros(1,n);while (1) No(1)=n+1; d(1)=Inf; while (1) pd=1; for (i=1:n) if (No(i) for (j=1:n) if (No(j)=0 & f(i,j)d(i) d(j)=d(i); end elseif (No(j)=0

25、 & f(j,i)0) 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 if (pd) break; end dvt=d(n);t=n; 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=No(t); endendwf=0;for (j=1:n) wf=wf+f(1,j

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1