**
**
刚开始蚂蚁按照同等概率选择各条路径。蚂蚁在经过的路径下留下信息素。短的路径蚂蚁会率先找到食物源,因此信息素浓度偏大。由于信息素的挥发,较长路径上的信息素逐渐消失特点:正反馈;不容易陷入局部最优,易于找到全局最优解;分布式计算特点;
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写代码的时候对结果产生了一个误区,就是最好的结果会在最后一次运算中产生,也就是说蚂蚁们最后的结果会趋于一致,结果应该是最后一次未必会产生最好的结果,随机性还是有的,最好的结果会在运行的中间产生。(这个误区卡了我好久哇) 下面附上原理: