主函数:
clear
clc
m=5;%种群规模
[pop,pheromone]=initialization(m)%分别求出初始矩阵与信息素
antfirstcity=firstcity(m)%每只蚂蚁随机选择出发的城市
antcity=selectcity(pop,m,pheromone,antfirstcity)%每只蚂蚁每一步选择的城市
newpheromone=newpheromones(m,antcity,pop,pheromone)%更新信息素
函数initialization:
function [pop,pheromone]=initialization(m)
pop=[inf,3,1,2;3,inf,5,4;1,5,inf,2;2,4,2,inf];
newpop=pop;
f=ones(1,5);
c=0;
n=2;
i=1;
while n<5
[min_newpop,index]=min(newpop,[],2);
j=index(i);
c=c+min_newpop(i);
f(n)=j;
newpop(i,:)=inf;
newpop(:,i)=inf;
i=j;
n=n+1;
end
c=c+pop(i,1);
pheromone=m/c;
pheromone=ones(4,4)*pheromone;
函数firstcity:
function antfirstcity=firstcity(m)
city=['A','B','C','D'];
antfirstcity=char(zeros(1,m));
for i=1:m
ran=rand();
if ran<0.25
antfirstcity(i)=city(1);
elseif ran<0.5
antfirstcity(i)=city(2);
elseif ran<0.75
antfirstcity(i)=city(3);
else
antfirstcity(i)=city(4);
end
end
函数selectcity:
function antcity=selectcity(pop,m,pheromone,antfirstcity)
antcity=char(zeros(m,5));
antcity(:,1)=antfirstcity;
antcity(:,5)=antfirstcity;
for i=1:m
city=['A','B','C','D'];
newcity=city;
for j=2:4
for n=1:6-j
if newcity(n) == antfirstcity(i)
newcity(n)=[];
break
end
end
x=antfirstcity(i)-'A'+1;
y(1:5-j)=newcity(1:5-j)-'A'+1;
p1=zeros(1,5-j);
for v=1:5-j
p1(v)=pheromone(x,y(v))*(1/pop(x,y(v)))^2;
end
p=p1/sum(p1);
q=rand();
if j==2
if q<p(1)
antcity(i,2)=newcity(1);
antfirstcity(i)=newcity(1);
elseif q<p(2)
antcity(i,2)=newcity(2);
antfirstcity(i)=newcity(2);
else
antcity(i,2)=newcity(3);
antfirstcity(i)=newcity(3);
end
elseif j==3
if q<p(1)
antcity(i,3)=newcity(1);
antfirstcity(i)=newcity(1);
else
antcity(i,3)=newcity(2);
antfirstcity(i)=newcity(2);
end
else
antcity(i,4)=newcity(1);
antfirstcity(i)=newcity(1);
end
end
end
函数newpheromones:
function newpheromone=newpheromones(m,antcity,pop,pheromone)
num=zeros(m,5);
num(:)=antcity(:)-'A'+1;
c=zeros(m,1);
for r=1:m
for t=1:4
c(r)=c(r)+pop(num(r,t),num(r,t+1));
end
end
for mm=1:4
for nn=1:4
sumnum=0;
for i=1:m
for j=1:4
if num(i,j)==mm
if num(i,j+1)-num(i,j)==nn-mm ;
sumnum=sumnum+1/c(i);
end
end
end
end
newpheromone(mm,nn)=0.5*pheromone(mm,nn)+sumnum;
end
end