蚁群算法学习

**

蚁群算法的基本原理(简单概括):

**

  • 刚开始蚂蚁按照同等概率选择各条路径。
  • 蚂蚁在经过的路径下留下信息素。
  • 短的路径蚂蚁会率先找到食物源,因此信息素浓度偏大。
  • 由于信息素的挥发,较长路径上的信息素逐渐消失

特点:正反馈;不容易陷入局部最优,易于找到全局最优解;分布式计算特点;

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

写代码的时候对结果产生了一个误区,就是最好的结果会在最后一次运算中产生,也就是说蚂蚁们最后的结果会趋于一致,结果应该是最后一次未必会产生最好的结果,随机性还是有的,最好的结果会在运行的中间产生。(这个误区卡了我好久哇)
在这里插入图片描述
在这里插入图片描述
下面附上原理:

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_21567935/article/details/83381963