function ACAforTSP(city) n=size(city,1); d=zeros(n,n); [ii jj]=meshgrid(1:n); d=arrayfun(@(i,j)sqrt(sum((city(i,:)-city(j,:)).^2)),ii,jj); d=d+eye(n)*1e-4; m=35; alpha=1; beta=5; rho=.1; q=1; eta=1./d; tau=ones(n,n); table=zeros(m,n); iter=1; iter_max=200; route_best=zeros(iter_max,n); length_best=zeros(iter_max,1); while iter<=iter_max table(:,1)=unidrnd(n,m,1); city_index=1:n; for i=1:m for j=2:n tabu=table(i,1:(j-1)); allow=setdiff(1:n,tabu); p=zeros(size(allow)); p=arrayfun(@(k)tau(tabu(end),allow(k))^alpha*eta(tabu(end),allow(k))^beta,1:length(allow)); p=p/sum(p); table(i,j)=allow(find(cumsum(p)>=rand,1,'first')); end end l=zeros(m,1); for i=1:m route=table(i,:); for j=1:(n-1) l(i)=l(i)+d(route(j),route(j+1)); end l(i)=l(i)+d(route(n),route(1)); end if iter==1 [min_length,min_index]=min(l); length_best(iter)=min_length; route_best(iter,:)=table(min_index,:); else [min_length,min_index]=min(l); length_best(iter)=min(length_best(iter-1),min_length); if length_best(iter)==min_length route_best(iter,:)=table(min_index,:); else route_best(iter,:)=route_best(iter-1,:); end end delta_tau=zeros(n,n); for i=1:m for j=1:(n-1) delta_tau(table(i,j),table(i,j+1))=delta_tau(table(i,j),table(i,j+1))+q/length(i); end delta_tau(table(i,n),table(i,1))=delta_tau(table(i,n),table(i,1))+q/length(i); end tau=(1-rho)*tau+delta_tau; iter=iter+1; table=zeros(m,n); end [shortest_length index]=min(length_best); shortest_route=route_best(index,:); end 不送