蚂蚁算法matlab代码及说明.docx

上传人:b****8 文档编号:10924740 上传时间:2023-02-23 格式:DOCX 页数:12 大小:19.14KB
下载 相关 举报
蚂蚁算法matlab代码及说明.docx_第1页
第1页 / 共12页
蚂蚁算法matlab代码及说明.docx_第2页
第2页 / 共12页
蚂蚁算法matlab代码及说明.docx_第3页
第3页 / 共12页
蚂蚁算法matlab代码及说明.docx_第4页
第4页 / 共12页
蚂蚁算法matlab代码及说明.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

蚂蚁算法matlab代码及说明.docx

《蚂蚁算法matlab代码及说明.docx》由会员分享,可在线阅读,更多相关《蚂蚁算法matlab代码及说明.docx(12页珍藏版)》请在冰豆网上搜索。

蚂蚁算法matlab代码及说明.docx

蚂蚁算法matlab代码及说明

[转]蚁群算法TSP(旅行商问题)通用matlab程序

分类:

优化算法2007-04-2307:

51

function[R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q)

%%=========================================================================

%%ACATSP.m

%%AntColonyAlgorithmforTravelingSalesmanProblem

%%ChengAihua,PLAInformationEngineeringUniversity,ZhengZhou,China

%%Email:

%%Allrightsreserved

%%-------------------------------------------------------------------------

%%主要符号说明

%%Cn个城市的坐标,n×2的矩阵

%%NC_max最大迭代次数

%%m蚂蚁个数

%%Alpha表征信息素重要程度的参数

%%Beta表征启发式因子重要程度的参数

%%Rho信息素蒸发系数

%%Q信息素增加强度系数

%%R_best各代最佳路线

%%L_best各代最佳路线的长度

%%=========================================================================

%%第一步:

变量初始化

n=size(C,1);%n表示问题的规模(城市个数)

D=zeros(n,n);%D表示完全图的赋权邻接矩阵

fori=1:

n

forj=1:

n

ifi~=j

D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;

else

D(i,j)=eps;

end

D(j,i)=D(i,j);

end

end

Eta=1./D;%Eta为启发因子,这里设为距离的倒数

Tau=ones(n,n);%Tau为信息素矩阵

Tabu=zeros(m,n);%存储并记录路径的生成

NC=1;%迭代计数器

R_best=zeros(NC_max,n);%各代最佳路线

L_best=inf.*ones(NC_max,1);%各代最佳路线的长度

L_ave=zeros(NC_max,1);%各代路线的平均长度

whileNC<=NC_max%停止条件之一:

达到最大迭代次数

%%第二步:

将m只蚂蚁放到n个城市上

Randpos=[];

fori=1:

(ceil(m/n))

Randpos=[Randpos,randperm(n)];

end

Tabu(:

1)=(Randpos(1,1:

m))';

%%第三步:

m只蚂蚁按概率函数选择下一座城市,完成各自的周游

forj=2:

n

fori=1:

m

visited=Tabu(i,1:

(j-1));%已访问的城市

J=zeros(1,(n-j+1));%待访问的城市

P=J;%待访问城市的选择概率分布

Jc=1;

fork=1:

n

iflength(find(visited==k))==0

J(Jc)=k;

Jc=Jc+1;

end

end

%下面计算待选城市的概率分布

fork=1:

length(J)

P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);

end

P=P/(sum(P));

%按概率原则选取下一个城市

Pcum=cumsum(P);

Select=find(Pcum>=rand);

to_visit=J(Select

(1));

Tabu(i,j)=to_visit;

end

end

ifNC>=2

Tabu(1,:

)=R_best(NC-1,:

);

end

%%第四步:

记录本次迭代最佳路线

L=zeros(m,1);

fori=1:

m

R=Tabu(i,:

);

forj=1:

(n-1)

L(i)=L(i)+D(R(j),R(j+1));

end

L(i)=L(i)+D(R

(1),R(n));

end

L_best(NC)=min(L);

pos=find(L==L_best(NC));

R_best(NC,:

)=Tabu(pos

(1),:

);

L_ave(NC)=mean(L);

NC=NC+1

%%第五步:

更新信息素

Delta_Tau=zeros(n,n);

fori=1:

m

forj=1:

(n-1)

Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);

end

Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);

end

Tau=(1-Rho).*Tau+Delta_Tau;

%%第六步:

禁忌表清零

Tabu=zeros(m,n);

end

%%第七步:

输出结果

Pos=find(L_best==min(L_best));

Shortest_Route=R_best(Pos

(1),:

Shortest_Length=L_best(Pos

(1))

subplot(1,2,1)

DrawRoute(C,Shortest_Route)

subplot(1,2,2)

plot(L_best)

holdon

plot(L_ave)

functionDrawRoute(C,R)

%%=========================================================================

%%DrawRoute.m

%%画路线图的子函数

%%-------------------------------------------------------------------------

%%CCoordinate节点坐标,由一个N×2的矩阵存储

%%RRoute路线

%%=========================================================================

N=length(R);

scatter(C(:

1),C(:

2));

holdon

plot([C(R

(1),1),C(R(N),1)],[C(R

(1),2),C(R(N),2)])

holdon

forii=2:

N

plot([C(R(ii-1),1),C(R(ii),1)],[C(R(ii-1),2),C(R(ii),2)])

holdon

end

设置初始参数如下:

m=31;Alpha=1;Beta=5;Rho=0.1;NC_max=200;Q=100;

31城市坐标为:

13042312

36391315

41772244

37121399

34881535

33261556

32381229

41961004

4312790

4386570

30071970

25621756

27881491

23811676

1332695

37151678

39182179

40612370

37802212

36762578

40292838

42632931

34291908

35072367

33942643

34393201

29353240

31403550

25452357

27782826

23702975

体验新版博客

上一篇:

[转]遗传算法的发展现状与应用实例

下一篇:

[转]基于matlabTSP问题蚁群算法的实现

分享|评论(0)|阅读(32)|固定链接|类别(优化算法)|发表于07:

51|最后修改于2007-04-2307:

52

另一种代码说明

%%第二步:

将m只蚂蚁放到n个城市(过孔)上

Randpos=[];%随即存取

fori=1:

(ceil(m/n))

Randpos=[Randpos,randperm(n)];

end

Tabu(:

1)=(Randpos(1,1:

m))';

%%第三步:

m只蚂蚁按概率函数选择下一座城市(过孔),完成各自的周游

forj=2:

n%所在城市(过孔)不计算

fori=1:

m

visited=Tabu(i,1:

(j-1));%记录已访问的城市(过孔),避免重复访问

J=zeros(1,(n-j+1));%待访问的城市(过孔)

P=J;%待访问城市(过孔)的选择概率分布

Jc=1;

fork=1:

n

iflength(find(visited==k))==0%开始时置0

J(Jc)=k;

Jc=Jc+1;%访问的城市(过孔)个数自加1

end

end

%下面计算待选城市(过孔)的概率分布

fork=1:

length(J)

P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);

end

P=P/(sum(P));

%按概率原则选取下一个城市(过孔)

Pcum=cumsum(P);%cumsum,元素累加即求和

Select=find(Pcum>=rand);%若计算的概率大于原来的就选择这条路线

to_visit=J(Select

(1));

Tabu(i,j)=to_visit;

end

end

ifNC>=2

Tabu(1,:

)=R_best(NC-1,:

);

end

%%第四步:

记录本次迭代最佳路线

L=zeros(m,1);%开始距离为0,m*1的列向量

fori=1:

m

R=Tabu(i,:

);

forj=1:

(n-1)

---14-

L(i)=L(i)+D(R(j),R(j+1));%原距离加上第j个城市(过孔)到第j+1个城

市(过孔)的距离

end

L(i)=L(i)+D(R

(1),R(n));%一轮下来后走过的距离

end

L_best(NC)=min(L);%最佳距离取最小

pos=find(L==L_best(NC));

R_best(NC,:

)=Tabu(pos

(1),:

);%此轮迭代后的最佳路线

L_ave(NC)=mean(L);%此轮迭代后的平均距离

NC=NC+1%迭代继续

%%第五步:

更新信息素

Delta_Tau=zeros(n,n);%开始时信息素为n*n的0矩阵

fori=1:

m

forj=1:

(n-1)

Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);

%此次循环在路径(i,j)上的信息素增量

end

Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);

%此次循环在整个路径上的信息素增量

end

Tau=(1-Rho).*Tau+Delta_Tau;%考虑信息素挥发,更新后的信息素

%%第六步:

禁忌表清零

Tabu=zeros(m,n);%%直到最大迭代次数

end

%%第七步:

输出结果

Pos=find(L_best==min(L_best));%找到最佳路径(非0为真)

Shortest_Route=R_best(Pos

(1),:

)%最大迭代次数后最佳路径

Shortest_Length=L_best(Pos

(1))%最大迭代次数后最短距离

subplot(1,2,1)%绘制第一个子图形

DrawRoute(C,Shortest_Route)%画路线图的子函数

subplot(1,2,2)%绘制第二个子图形

plot(L_best)

holdon%保持图形

plot(L_ave,'r')

title('平均距离和最短距离')%标题

functionDrawRoute(C,R)

双钻头于遗传算法MATLAB计算部分程序如下:

%VerifyInputs

[N,dims]=size(xy);

[nr,nc]=size(dmat);

---15-

ifN~=nr||N~=nc

error('InvalidXYorDMATinputs!

')

end

n=N;

%SanityChecks

pop_size=4*ceil(pop_size/4);

num_iter=max(1,round(real(num_iter

(1))));

show_prog=logical(show_prog

(1));

show_res=logical(show_res

(1));

%Initialize

pop=zeros(pop_size,n);

fork=1:

pop_size

pop(k,:

)=randperm(n);

end

%RuntheGA

global_min=Inf;

total_dist=zeros(1,pop_size);

dist_history=zeros(1,num_iter);

tmp_pop=zeros(4,n);

new_pop=zeros(pop_size,n);

ifshow_prog

pfig=figure('Name','TSP_GA|CurrentBest

Solution','Numbertitle','off');

end

foriter=1:

num_iter

%EvaluateEachPopulationMember(CalculateTotalDistance)

forp=1:

pop_size

d=dmat(pop(p,n),pop(p,1));%ClosedPath

fork=2:

n

d=d+dmat(pop(p,k-1),pop(p,k));

end

total_dist(p)=d;

end

%FindtheBestRoute

[min_dist,index]=min(total_dist);

dist_history(iter)=min_dist;

ifmin_dist

global_min=min_dist;

opt_rte=pop(index,:

);

ifshow_prog

%PlottheBestRoute

figure(pfig);

rte=opt_rte([1:

n1]);

ifdims==3,plot3(xy(rte,1),xy(rte,2),xy(rte,3),'r.-');

---16-

elseplot(xy(rte,1),xy(rte,2),'r.-');end

title(sprintf('TotalDistance=%1.4f,Iteration

=%d',min_dist,iter));

end

end

%GeneticAlgorithmOperators

rand_pair=randperm(pop_size);

forp=4:

4:

pop_size

rtes=pop(rand_pair(p-3:

p),:

);

dists=total_dist(rand_pair(p-3:

p));

[ignore,idx]=min(dists);

best_of_4_rte=rtes(idx,:

);

ins_pts=sort(ceil(n*rand(1,2)));

I=ins_pts

(1);

J=ins_pts

(2);

fork=1:

4%MutatetheBesttogetThreeNewRoutes

tmp_pop(k,:

)=best_of_4_rte;

switchk

case2%Flip

tmp_pop(k,I:

J)=fliplr(tmp_pop(k,I:

J));

case3%Swap

tmp_pop(k,[IJ])=tmp_pop(k,[JI]);

case4%Slide

tmp_pop(k,I:

J)=tmp_pop(k,[I+1:

JI]);

otherwise%DoNothing

end

end

new_pop(p-3:

p,:

)=tmp_pop;

end

pop=new_pop;

End

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

当前位置:首页 > 法律文书 > 调解书

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

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