function [Shortest_Route,Shortest_Length]=anttsp(city,iter_max,m,Alpha,Beta,Rho,Q)
n=size(city,1)
d=zeros(n,n)
d=squareform(pdist(city))
Eta=1./d
Tau=ones(n,n)
Tabu=zeros(m,n)
nC=1
R_best=zeros(iter_max,n)
L_best=inf.*ones(iter_max,1)
while nC<=iter_max
route=[]
for i=1:ceil(m/n)
route=[route,randperm(n)]
end
Tabu(:,1)=(route(1,1:m))'
for j=2:n
for i=1:m
visited=Tabu(i,1:(j-1))
J=zeros(1,(n-j+1))
P=J
Jc=1
for k=1:n
if isempty(find(visited==k, 1))
J(Jc)=k
Jc=Jc+1
end
end
for k=1:length(J)
P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta)
end
P=P/(sum(P))
Pcum=cumsum(P)
Select=find(Pcum>=rand)
if isempty(Select)%是不是一定能保证Select不为空
Tabu(i,j)=round(1+(n-1)*rand)
else
next_visit=J(Select(1))
Tabu(i,j)=next_visit
end
end
end
if nC>=2
Tabu(1,:)=R_best(nC-1,:)
end
L=zeros(m,1)
for i=1:m
R=Tabu(i,:)
for j=1:(n-1)
L(i)=L(i)+d(R(j),R(j+1))
end
L(i)=L(i)+d(R(1),R(n))
end
L_best(nC)=min(L)
pos=find(L==L_best(nC))
R_best(nC,:)=Tabu(pos(1),:)
nC=nC+1
Delta_Tau=zeros(n,n)
for i=1:m
for j=1:(n-1)
Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i)
end
Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i)
end
Tau=(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))
end
n个城市,编号为1---nfor循环的次数是蚂蚁重复城市的次数,比如5个蚂蚁放到4个城市,需要重复两遍才能放完蚂蚁,每次循环产生n个1---n的随机数,相当于随机n个城市,产生城市序列
循环结束
Tabu一句表示将m个蚂蚁随机,每个蚂蚁放到前面产生的城市序列中,每个蚂蚁一个城市,需要m个,所以提取前面1:m个序列
'表示转置,没有多大用处,可能参与后面的计算方便。
我感觉如果m,n很大的话,你这样做会产生很大的浪费,计算很多的随机数,这样的话更好,一句就得:(如果变量Randpos后面没有用到的话,如果用到了,还要用你的程序)
Tabu=ceil(n*rand(1,m))'
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)