(完整版)蚁群算法matlab程序实例整理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
function [y,val]=QACS
tic
load att48 att48;
MAXIT=300; % 最大循环次数
NC=48; % 城市个数
tao=ones(48,48);% 初始时刻各边上的信息最为1
rho=0.2; % 挥发系数
alpha=1;
beta=2;
Q=100;
mant=20; % 蚂蚁数量
iter=0; % 记录迭代次数
for i=1:NC % 计算各城市间的距离
for j=1:NC
distance(i,j)=sqrt((att48(i,2)-att48(j,2))^2+(att48(i,3)-att48(j,3))^2);
end
end
bestroute=zeros(1,48); % 用来记录最优路径
routelength=inf; % 用来记录当前找到的最优路径长度
% for i=1:mant % 确定各蚂蚁初始的位置
% end
for ite=1:MAXIT
for ka=1:mant %考查第K只蚂蚁
deltatao=zeros(48,48); % 第K只蚂蚁移动前各边上的信息增量为零
[routek,lengthk]=travel(distance,tao,alpha,beta);
if lengthk routelength=lengthk; bestroute=routek; end for i=1:NC-1 % 第K只蚂蚁在路径上释放的信息量 deltatao(routek(i),routek(i+1))=deltatao(routek(i),routek(i+1))+Q/lengthk ; end deltatao(routek(48),1)=deltatao(routek(48),1)+Q/lengthk; end for i=1:NC-1 for j=i+1:NC if deltatao(i,j)==0 deltatao(i,j)=deltatao(j,i); y=bestroute; end val=routelength; end toc end tao=(1-rho).*tao+deltatao; end y=bestroute; val=routelength; toc function [y,val]=travel(distance,tao,alpha,beta) % 某只蚂蚁找到的某条路径[m,n]=size(distance); p=fix(m*rand)+1; %fix取整函数 val=0; % 初始路径长度设为0 tabuk=[p]; % 假设该蚂蚁都是从第p 个城市出发的 for i=1:m-1 np=tabuk(length(tabuk)); % 蚂蚁当前所在的城市号 p_sum=0; for j=1:m if isin(j,tabuk) continue; else ada=1/distance(np,j); p_sum=p_sum+tao(np,j)^alpha*ada^beta; end end cp=zeros(1,m); % 转移概率 for j=1:m if isin(j,tabuk) continue; else ada=1/distance(np,j); cp(j)=tao(np,j)^alpha*ada^beta/p_sum; end end NextCity=pchoice(cp); tabuk=[tabuk,NextCity]; val=val+distance(np,NextCity); end y=tabuk; function y=isin(x,A) % 判断数x 是否在向量A 中,如在返回1 ,否则返回0 y=0; for i=1:length(A) if A(i)==x y=1; break; end end function y=pchoice(A) a=rand; tempA=zeros(1,length(A)+1); for i=1:length(A) tempA(i+1)=tempA(i)+A(i); end for i=2:length(tempA) if a<=tempA(i) y=i-1; break; end end