图论matlab程序大全Word文档下载推荐.docx

上传人:b****5 文档编号:18619713 上传时间:2022-12-29 格式:DOCX 页数:33 大小:25.05KB
下载 相关 举报
图论matlab程序大全Word文档下载推荐.docx_第1页
第1页 / 共33页
图论matlab程序大全Word文档下载推荐.docx_第2页
第2页 / 共33页
图论matlab程序大全Word文档下载推荐.docx_第3页
第3页 / 共33页
图论matlab程序大全Word文档下载推荐.docx_第4页
第4页 / 共33页
图论matlab程序大全Word文档下载推荐.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

图论matlab程序大全Word文档下载推荐.docx

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

图论matlab程序大全Word文档下载推荐.docx

=n

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)

n=length(W);

U=W;

m=1;

whilem<

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

fori=1:

[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));

另外两种程序

最小生成树程序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))=[];

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:

loop=max(size(a))-1;

whilelength(result)<

loop

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)];

index(find(index==v2))=v1;

data(:

flag)=[];

index(:

第四讲:

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,:

forj=1:

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;

运行以下程序求其最大解:

输入矩阵a,然后输入[t,m]=fc01(a)

运行以下程序求其最小解:

输入矩阵a,然后输入[t,m]=fc01(a,1)

匈牙利算法的另一程序

匈牙利算法的MATLAB程序代码如下:

m=5;

n=5;

A=[01100

11011

01100

00011];

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%获得仅含一条边的初始匹配M

while

(1)

m)x(i)=0;

end%将记录X中点的标号和标记*

n)y(i)=0;

end%将记录Y中点的标号和标记*

m)pd=1;

%寻找X中M的所有非饱和点

for(j=1:

n)if(M(i,j))pd=0;

if(pd)x(i)=-n-1;

end%将X中M的所有非饱和点都给以标号0和标记*,程序中用n+1表

示0标号,标号为负数时表示标记*

pd=0;

while

(1)xi=0;

m)if(x(i)<

0)xi=i;

end%假如X中存在一个既有标号又有标记*的点,则任

取X中一个既有标号又有标记*的点

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

当前位置:首页 > 工程科技 > 能源化工

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

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