可以直接运行的蚁群算法(matlab版)D=[0177.6320.4184.8150 408 230.4156 344.4256.8372 120 321.6177.60 279.669.6188.4367.2189.6247.2303.6141.6331.2157.6177.6320.4279.60 268.8398.4147.690404.4174 196.8111.6200.4122.4184.869.6268.80 195.6356.4259.2254.4373.272320.4227.2146.4150 188.4398.4195.60 486 308.4166.8422.4267.6450 198 342408 367.2147.6356.4486 0 177.6492 321.6284.4199.2288 210230.4189.690259.2308.4177.60 314.4238.8226.8141.6110.4152.4156 247.2404.4254.4166.8492 314.40 428.4326.4456 204 400.8344.4303.6174 373.2422.4321.6238.8428.40 362135.6224.4296.4256.8141.6196.872267.6284.4226.8326.4362 0 248.4216 74.4372 331.2111.6320.4450 199.2141.6456 135.6248.40 252 174120 157.6200.4227.2198 288 110.4204 224.4216252 0 220321.6177.6122.4146.4342 210 152.4400.8296.474.4174 220 0];m=31;Alpha=1;Beta=5;Rho=0.1;NC_max=50;Q=100;n=13;m=200;NC_max=100;%n表示问题的规模(城市个数),m蚂蚁个数,NC_max最大迭代次数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)];endTabu(:,1)=(Randpos(1,1:m))';%%第三步:m 只蚂蚁按概率函数选择下一座城市,完成各自的周游forj=2:nfori=1:mvisited=Tabu(i,1:(j-1));%已访问的城市J=zeros(1,(n-j+1));%待访问的城市P=J;%待访问城市的选择概率分布Jc=1;fork=1:niflength(find(visited==k))==0J(Jc)=k;Jc=Jc+1;endend%下面计算待选城市的概率分布fork=1:length(J)P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);endP=P/(sum(P));%按概率原则选取下一个城市Pcum=cumsum(P);Select=find(Pcum>=rand);to_visit=J(Select(1));Tabu(i,j)=to_visit;endendifNC>=2Tabu(1,:)=R_best(NC-1,:);end%%第四步:记录本次迭代最佳路线L=zeros(m,1);fori=1:mR=Tabu(i,:);forj=1:(n-1)L(i)=L(i)+D(R(j),R(j+1));endL(i)=L(i)+D(R(1),R(n));endL_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:mforj=1:(n-1)Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);endDelta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);endTau=(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)Draw Route(C,Shortest_Route)subplot(1,2,2)plot(L_best)hold onplot(L_ave)