**
蚁群算法的基本原理(简单概括):
**
- 刚开始蚂蚁按照同等概率选择各条路径。
- 蚂蚁在经过的路径下留下信息素。
- 短的路径蚂蚁会率先找到食物源,因此信息素浓度偏大。
- 由于信息素的挥发,较长路径上的信息素逐渐消失
特点:正反馈;不容易陷入局部最优,易于找到全局最优解;分布式计算特点;
load('citys');
distance=pdist2(citys,citys); % 构建距离矩阵
[m n]=size(citys);
ant_num=30; % 蚂蚁数量
a=1; % 信息素重要程度
b=5; % 启发函数重要程度
r=0.1; % 信息素挥发因子
table=zeros(ant_num,m); % 信息素矩阵
tau= ones(m,m); % 信息素矩阵
distance(distance==0)=1e-4;
dta=1./distance; % 启发函数
min_length=999999999;
for i=1:200 % 迭代次数
table=zeros(ant_num,m);
ant_length=zeros(ant_num,1); % 计算每只蚂蚁走过的距离
start=round(rand(ant_num,1)*(m-1)+1); % 随机产生初始城市
table(:,1)=start;
citys_index=1:m;
for num=1:ant_num % 从每一只蚂蚁开始
for j=2:m
zhi=table(num,1:(j-1));
allow_index=~ismember(citys_index,zhi); % 判断哪些城市还没去过
allow_city=citys_index(allow_index);
p= ((tau(table(num,j-1),allow_city)).^a.*(dta(table(num,j-1),allow_city)).^b)./... % 判断去每个城市的概率
sum((tau(table(num,j-1),allow_city)).^a.*(dta(table(num,j-1),allow_city)).^b);
pc=cumsum(p);% 轮盘赌法决策下一个去的城市
target_index=find(pc>=rand);
target_city=allow_city(target_index(1));
table(num,j)=target_city;
ant_length(num,1)=distance(table(num,j-1),table(num,j))+ant_length(num,1); % 更新每一只蚂蚁的总路径
if j==m
ant_length(num,1)=distance(table(num,j),table(num,1))+ant_length(num,1);
end
end
end
if min_length>min(ant_length)
[min_length,min_index]=min(ant_length);
rout=Table(min_index,:);
end
tau=tau.*(1-r); % 信息素的挥发
for num=1:ant_num
for j=1:m % 信息素的累加
tau(table(num,j),table(num,mod(j,m)+1))=tau(table(num,j),table(num,mod(j,m)+1))+1./ant_length(num,1);
end
end
end
写代码的时候对结果产生了一个误区,就是最好的结果会在最后一次运算中产生,也就是说蚂蚁们最后的结果会趋于一致,结果应该是最后一次未必会产生最好的结果,随机性还是有的,最好的结果会在运行的中间产生。(这个误区卡了我好久哇)
下面附上原理: