您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 能源与动力工程 > 蚁群算法商旅问题matlab程序
%%蚁群算法商旅问题matlab程序%%导入数据(城市的坐标)citys=[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];%%计算城市之间相互距离n=size(citys,1);D=zeros(n,n);fori=1:nforj=1:nifi~=jD(i,j)=sqrt(sum((citys(i,:)-citys(j,:)).^2));elseD(i,j)=1e-4;endendend%%初始化参数m=31;alpha=1;beta=5;rho=0.1;Q=1;Eta=1./D;Tau=ones(n,n);Table=zeros(n,n);iter=1;iter_max=200;Route_best=zeros(iter_max,n);Leng_best=zeros(iter_max,1);Leng_ave=zeros(iter_max,1);%%迭代寻找最佳路径(主体循环)whileiter=iter_max%(1)随机产生各个蚂蚁的起点城市start=zeros(m,1);fori=1:mtemp=randperm(n);start(i)=temp(1);endTable(:,1)=start;%(2)构建解空间citys_index=1:n;fori=1:m%逐个蚂蚁路径选择forj=2:n%逐个城市路径选择tabu=Table(i,1:(j-1));%已访问的城市集合(禁忌表)allow_index=~ismember(citys_index,tabu);allow=citys_index(allow_index);%待访问的城市集合P=allow;%计算城市间转移概率fork=1:length(allow)P(k)=Tau(tabu(end),allow(k))^alpha*Eta(tabu(end),allow(k))^beta;endP=P/sum(P);%轮盘赌法选择下一个访问城市Pc=cumsum(P);target_index=find(Pc=rand);target=allow(target_index(1));Table(i,j)=target;endend%(3)计算各个蚂蚁的路径距离Length=zeros(m,1);fori=1:mRoute=Table(i,:);forj=1:(n-1)Length(i)=Length(i)+D(Route(j),Route(j+1));endLength(i)=Length(i)+D(Route(n),Route(1));end%(4)计算最短路径距离及平均距离ifiter==1[min_Length,min_index]=min(Length);Length_best(iter)=min_Length;Length_ave(iter)=mean(Length);Route_best(iter,:)=Table(min_index,:);else[min_Length,min_index]=min(Length);Length_best(iter)=min(Length_best(iter-1),min_Length);Length_ave(iter)=mean(Length);ifLength_best(iter)==min_LengthRoute_best(iter,:)=Table(min_index,:);elseRoute_best(iter,:)=Route_best((iter-1),:);endend%(5)更新信息素Delta_Tau=zeros(n,n);%逐个蚂蚁计算fori=1:m%逐个城市计算forj=1:(n-1)Delta_Tau(Table(i,j),Table(i,j+1))=Delta_Tau(Table(i,j),Table(i,j+1))+Q/Length(i);endDelta_Tau(Table(i,n),Table(i,1))=Delta_Tau(Table(i,j),Table(i,1))+Q/Length(i);endTau=(1-rho)*Tau+Delta_Tau;%迭代次数加1,清空路径记录表iter=iter+1;Table=zeros(m,n);end%%结果显示[Shortest_Length,index]=min(Length_best);Shortest_Route=Route_best(index,:);disp(['最短距离:'num2str(Shortest_Length)]);disp(['最短路径:'num2str([Shortest_RouteRoute_best(1)])]);%%绘图figure(1)plot([citys(Shortest_Route,1);citys(Shortest_Route(1),1)],[citys(Shortest_Route,2);citys(Shortest_Route(1),2)],'b-');gridonfori=1:size(citys,1)text(citys(i,1),citys(i,2),[''num2str(i)]);endtext(citys(Shortest_Route(1),1),citys(Shortest_Route(1),2),'起点');text(citys(Shortest_Route(end),1),citys(Shortest_Route(end),2),'终点');xlabel('城市位置横坐标')ylabel('城市位置纵坐标')figure(2)plot(1:iter_max,Length_best,'b',1:iter_max,Length_ave,'r')legend('最短距离','平均距离''')xlabel('迭代次数')ylabel('距离')text('各代最短距离与平均距离对比')
本文标题:蚁群算法商旅问题matlab程序
链接地址:https://www.777doc.com/doc-7510029 .html