图论matlab模板程序Word下载.docx

上传人:b****5 文档编号:20058067 上传时间:2023-01-16 格式:DOCX 页数:25 大小:19.96KB
下载 相关 举报
图论matlab模板程序Word下载.docx_第1页
第1页 / 共25页
图论matlab模板程序Word下载.docx_第2页
第2页 / 共25页
图论matlab模板程序Word下载.docx_第3页
第3页 / 共25页
图论matlab模板程序Word下载.docx_第4页
第4页 / 共25页
图论matlab模板程序Word下载.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

图论matlab模板程序Word下载.docx

《图论matlab模板程序Word下载.docx》由会员分享,可在线阅读,更多相关《图论matlab模板程序Word下载.docx(25页珍藏版)》请在冰豆网上搜索。

图论matlab模板程序Word下载.docx

W(j,k)=-1;

%关联矩阵终点值为-1

%有向边的两个顶点

ifF(a

(1),i)==1

%有向边由a

(1)指向a

(2)

else

%有向边由a

(2)指向a

(1)

第二讲:

最短路问题

程序0:

最短距离矩阵

W表示图的权值矩阵

D表示图的最短距离矩阵

%连通图中各项顶点间最短距离的计算

functionD=shortdf(W)

%对于W(i,j),若两顶点间存在弧,则为弧的权值,否则为inf;

当i=j时W(i,j)=0

n=length(W);

D=W;

m=1;

whilem<

=n

fori=1:

forj=1:

ifD(i,j)>

D(i,m)+D(m,j)

D(i,j)+D(i,m)+D(m,j);

%距离进行更新

m=m+1;

D;

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<

forj=1:

ifl(i)>

l(j)+W(j,i)

l(i)=l(j)+W(j,i);

z(i)=j-1;

ifj<

i

i=j-1;

i=i+1;

 

floyd算法(计算任意两点间的最短距离)

function[d,r]=floyd(a)

n=size(a,1);

d=a;

forj=1:

r(i,j)=j;

end

r;

fork=1:

ifd(i,k)+d(k,j)<

d(i,j)

d(i,j)=d(i,k)+d(k,j);

r(i,j)=r(i,k);

n2short.m计算指定两点间的最短距离

function[Pu]=n2short(W,k1,k2)

U=W;

ifU(i,j)>

U(i,m)+U(m,j)

U(i,j)=U(i,m)+U(m,j);

m=m+1;

u=U(k1,k2);

P1=zeros(1,n);

k=1;

P1(k)=k2;

V=ones(1,n)*inf;

kk=k2;

whilekk~=k1

V(1,i)=U(k1,kk)-W(i,kk);

ifV(1,i)==U(k1,i)

P1(k+1)=i;

kk=i;

wrow=find(P1~=0);

forj=length(wrow):

-1:

1

P(k)=P1(wrow(j));

程序四、n1short.m(计算某点到其它所有点的最短距离)

function[PmD]=n1short(W,k)

n=size(W,1);

D=zeros(1,n);

[Pd]=n2short(W,k,i);

Pm{i}=P;

D(i)=d;

程序五:

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<

dt2

d=dt1;

P=[p1p2(2:

length(p2))p3(2:

length(p3))];

else

p=[p4p5(2:

length(p5))p6(2:

length(p6))];

d;

第三讲:

最小生成树

最小生成树的Kruskal算法

function[Tc]=krusf(d,flag)

ifnargin==1

n=size(d,2);

m=sum(sum(d~=0))/2;

b=zeros(3,m);

forj=(i+1):

ifd(i,j)~=0

b(1,k)=i;

b(2,k)=j;

b(3,k)=d(i,j);

b=d;

n=max(max(b(1:

2,:

)));

m=size(b,2);

[B,i]=sortrows(b'

3);

B=B'

;

c=0;

T=[];

t=1:

n;

ift(B(1,i))~=t(B(2,i))

T(1:

2,k)=B(1:

2,i);

c=c+B(3,i);

tmin=min(t(B(1,i)),t(B(2,i)));

tmax=max(t(B(1,i)),t(B(2,i)));

ift(j)==tmax

t(j)=tmin;

ifk==n

break;

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<

l)

min=inf;

l

iflistV(i)==1

iflistV(j)==0&

min>

a(i,j)

min=a(i,j);

b=a(i,j);

s=i;

d=j;

listV(d)=1;

distance(e)=b;

source(e)=s;

destination(e)=d;

e=e+1;

T=[source;

destination];

forg=1:

e-1

c(g)=a(T(1,g),T(2,g));

第四讲:

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;

ifmod(a(i),2)==1

ifm~=0

fprintf('

thereisnotexitEulerpath.\n'

T=0;

c=0;

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;

forg=1:

eds

c=c+d(T(1,g),T(2,g));

flagg=0;

function[flaged]=edf(matr,eds,vexs,ed,tem)

flag=1;

[dvexf]=flecvexf(matr,i,vexs,eds,ed,tem);

iff==1

ifdvex~=0

i)=[vexs(1,i)dvex];

vexs(1,i+1)=dvex;

matr(vexs(1,i+1),vexs(1,i))=0;

else

function[dvexf]=flecvexf(matr,i,vexs,eds,ed,temp)

f=0;

edd=find(matr(vexs(1,i),:

dvex=0;

dvex1=[];

ded=[];

iflength(edd)==1

dvex=edd;

dd=1;

dd1=0;

kkk=0;

forkk=1:

length(edd)

m1=find(vexs==edd(kk));

ifsum(m1)==0

dvex1(dd)=edd(kk);

dd=dd+1;

dd1=1;

kkk=kkk+1;

ifkkk==length(edd)

tem=vexs(1,i)*ones(1,kkk);

edd1=[tem;

edd];

forl1=1:

kkk

lt=0;

ddd=1;

forl2=1:

ifedd1(1:

2,l1)==ed(1:

2,l2)

lt=lt+1;

iflt==0

ded(ddd)=edd(l1);

ddd=ddd+1;

iftemp<

=length(dvex1)

dvex=dvex1(temp);

elseiftemp>

length(dvex1)&

temp<

=length(ded)

dvex=ded(temp);

f=1;

Hamilton改良圈算法(找出比较好的Hamilton路)

function[Cd1]=hamiltonglf(v)

%d表示权值矩阵

%C表示算法最终找到的Hamilton圈。

%v=[5167;

3784;

4194;

299;

1854;

450;

2442;

2538;

1340;

764;

2260;

2562;

1840;

4126];

n=size(v,1);

subplot(1,2,1)

holdon;

plot(v(:

1),v(:

2),'

*'

%描点

str1='

V'

str2=num2str(i);

dot=[str1,str2];

text(v(i,1)-1,v(i,2)-2,dot);

%给点命名

2));

%连线

plot([v(n,1),v(1,1)],[v(n,2),v(1,2)]);

fori=1:

d(i,j)=sqrt((v(i,1)-v(j,1))^2+(v(i,2)-v(j,2))^2);

d2=0;

ifi<

d2=d2+d(i,i+1);

d2=d2+d(n,1);

text(10,30,num2str(d2));

n=size(d,2);

C=[linspace(1,n,n)1];

fornnn=1:

20

C1=C;

ifn>

3

form=4:

n+1

(m-3)

forj=(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);

fork=(i+1):

j

C1(k)=C(j+i+1-k);

C1((j+1):

m)=C((j+1):

m);

elseifn<

=3

ifn<

=2

ItdoesnotexistHamiltoncircle.'

Anycirlceistherightanswer.'

C=C1;

d1=0;

d1=d1+d(C(i),C(i+1));

d1;

subplot(1,2,2);

v2=[v;

v(1,1),v(1,2)];

plot(v(C(:

),1),v(C(:

),2),'

r'

text(10,30,num2str(d1));

第五讲:

匹配问题及算法

较大基础匹配算法

functionJ=matgraf(W)

J=zeros(n,n);

whilesum(sum(W))~=0

a=find(W~=0);

t1=mod(a

(1),n);

ift1==0

t1=n;

ifa

(1)/n>

floor(a

(1)/n)

t2=floor(a

(1)/n)+1;

t2=floor(a

(1)/n);

J(t1,t2)=1,J(t2,t1)=1;

W(t1,:

)=0;

W(t2,:

W(:

t1)=0;

W(:

t2)=0;

J;

匈牙利算法(完美匹配算法,包括三个文件fc01,fc02,fc03)

function[e,s]=fc01(a,flag)

b=a;

ifflag==0

cmax=max(max(b)'

b=cmax-b;

m=size(b);

m

(1)

b(i,:

)=b(i,:

)-min(b(i,:

));

m

(2)

b(:

j)=b(:

j)-min(b(:

j));

d=(b==0);

[e,total]=fc02(d);

whiletotal~=m

(1)

b=fc03(b,e);

d=(b==0);

[e,total]=fc02(d);

inx=sub2ind(size(a),e(:

1),e(:

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)'

nump=sum(d'

whilet~=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);

functionb=fc03(b,e)

t=1;

p=ones(m

(1),1);

q=zeros(m

(1),1);

inp=find(e(:

1)~=0);

p(e(inp,1))=0;

tp=sum(p+q);

inp=find(p==1);

n=size(inp);

n

(1)

inq=find(b(inp(i),:

)==0);

q(inq)=1;

inp=find(q==1);

ifall(e(:

2)-inp(i))==0

inq=find((e(:

2)-inp(i))==0);

p(e(inq))=1;

tq=sum(p+q);

t=tq-tp;

inp=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=[05430000;

00005300;

00000320;

00000020;

%00000004;

00000003;

00000005;

00000000]

function[fwf]=fulkersonf(C,f1)

%C表示容量

%f1表示当前流量,默认为0

%f表示最大流±

í

Ê

¾

×

î

´

ó

Á

÷

%wf表示最大流的流量

n=length(C);

ifnargin==1;

f=zeros(n,n);

f=f1;

No=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:

if(No(j)==0&

f(i,j)<

C(i,j))

No(j)=i;

d(j)=C(i,j)-f(i,j);

pd=0;

if(d(j)>

d(i))

d(j)=d(i);

elseif(No(j)==0&

f(j,i)>

0)

No(j)=-i;

d(j)=f(j,i);

if(No(n)|pd)

if(pd)

dvt=d(n);

t=n;

if(No(t)>

f(No(t),t)=f(No(t),t)+dvt;

elseif(No(t)<

f(No(t),t)=f(No(t),t)-dvt;

if(No(t)==1)

No(i)=0;

d(i)=0;

break

t=No(t);

wf=0;

for(j=1:

wf=wf+f(1,j);

e

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 公务员考试

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

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