function[y,val]=QACSticloadatt48att48;MAXIT=300;%最大循环次数NC=48;%城市个数tao=ones(48,48);%初始时刻各边上的信息最为1rho=0.2;%挥发系数alpha=1;beta=2;Q=100;mant=20;%蚂蚁数量iter=0;%记录迭代次数fori=1:NC%计算各城市间的距离forj=1:NCdistance(i,j)=sqrt((att48(i,2)-att48(j,2))^2+(att48(i,3)-att48(j,3))^2);endendbestroute=zeros(1,48);%用来记录最优路径routelength=inf;%用来记录当前找到的最优路径长度%fori=1:mant%确定各蚂蚁初始的位置%endforite=1:MAXITforka=1:mant%考查第K只蚂蚁deltatao=zeros(48,48);%第K只蚂蚁移动前各边上的信息增量为零[routek,lengthk]=travel(distance,tao,alpha,beta);iflengthkroutelength%找到一条更好的路径routelength=lengthk;bestroute=routek;endfori=1:NC-1%第K只蚂蚁在路径上释放的信息量deltatao(routek(i),routek(i+1))=deltatao(routek(i),routek(i+1))+Q/lengthk;enddeltatao(routek(48),1)=deltatao(routek(48),1)+Q/lengthk;endfori=1:NC-1forj=i+1:NCifdeltatao(i,j)==0deltatao(i,j)=deltatao(j,i);y=bestroute;endval=routelength;endtocendtao=(1-rho).*tao+deltatao;endy=bestroute;val=routelength;tocfunction[y,val]=travel(distance,tao,alpha,beta)%某只蚂蚁找到的某条路径[m,n]=size(distance);p=fix(m*rand)+1;%fix取整函数val=0;%初始路径长度设为0tabuk=[p];%假设该蚂蚁都是从第p个城市出发的fori=1:m-1np=tabuk(length(tabuk));%蚂蚁当前所在的城市号p_sum=0;forj=1:mifisin(j,tabuk)continue;elseada=1/distance(np,j);p_sum=p_sum+tao(np,j)^alpha*ada^beta;endendcp=zeros(1,m);%转移概率forj=1:mifisin(j,tabuk)continue;elseada=1/distance(np,j);cp(j)=tao(np,j)^alpha*ada^beta/p_sum;endendNextCity=pchoice(cp);tabuk=[tabuk,NextCity];val=val+distance(np,NextCity);endy=tabuk;functiony=isin(x,A)%判断数x是否在向量A中,如在返回1,否则返回0y=0;fori=1:length(A)ifA(i)==xy=1;break;endendfunctiony=pchoice(A)a=rand;tempA=zeros(1,length(A)+1);fori=1:length(A)tempA(i+1)=tempA(i)+A(i);endfori=2:length(tempA)ifa=tempA(i)y=i-1;break;endend