• 蚁群算法(ACA)及其Matlab实现


    1基本原理

    本质上也是一种概率算法,通过大概率收敛到最佳值,和其他的智能算法很相似。蚁群分泌的信息素存在正反馈,使得较佳的解

    具有大概率被选到,当全局都选用较佳的解,变可以得到整体的最优解。

    2几个关键点:

      1) 概率选择:

          受信息素浓度和启发函数影响,启发函数为距离的倒数

       2)信息素挥发

          考虑到信息素随时间的挥发,加入挥发因子                

    3程序设计步骤:

        1初始化各个参数:包括各点的距离,信息素的初始浓度,蚂蚁数量,信息素挥发因子

                                        信息素和启发函数的重要度因子,启发函数,最大迭代次数,路径记录表等等

          2迭代:对每个蚂蚁随机制定初始值,再根据概率选择,选择出每只蚂蚁的路径,确定每只蚂蚁的路径总长度,

                       以及蚁群的最佳路径长度和平均长度,并对信息素进行更新。

          3展示:展示出最佳路径,以及最佳路径对迭代的变化图

       4Matlab代码

    clc,clear                                                                                    %清空环境中的变量
    load data.txt                                                                           %读入城市的坐标
    t0 = clock;                                                                                %程序计时开始
    %%
    %%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%
    city=data;
    n = size(city,1);                                                                      %城市距离初始化
    D = zeros(n,n);                                                    
    for i = 1:n
        for j = 1:n
               if i ~= j
                D(i,j) = sqrt(sum((city(i,:) - city(j,:)).^2));
            else
                D(i,j) = 0;      %设定的对角矩阵修正值
            end
        end    
    end
    m=30;                                                                                        %蚂蚁数量
    alpha = 1;                                                                                 % 信息素重要程度因子
    beta = 5;                                                                                  % 启发函数重要程度因子
    v = 0.1;                                                                                     % 信息素挥发因子
    Q = 0.5;                                                                                     % 信息因子常系数
    H= 1./D;                                                                         % 启发函数
    T= ones(n,n);                                                                         % 信息素矩阵
    Table = zeros(m,n);                                                               % 路径记录表
    iter = 1;                                                                                    % 迭代次数初值
    iter_max = 50;                                                                     % 最大迭代次数 
    best_route = zeros(iter_max,n);                                       % 各代最佳路径       
    best_length = zeros(iter_max,1);                                     % 各代最佳路径的长度  
    %%
    while iter<=iter_max
       
                            % 随机产生每只蚂蚁的起点城市
                              start = zeros(m,1);
                              for i = 1:m
                                  temp = randperm(n);
                                  start(i) = temp(1);
                              end
                              Table(:,1) = start; 
                              city_index=1:n;
                              for i = 1:m
                              % 逐个城市路径选择
                             for j = 2:n
                                 tabu = Table(i,1:(j - 1));                                                   % 已访问的城市集合
                                 allow =city_index( ~ismember(city_index,tabu));    % 筛选出未访问的城市集合
                                 P = zeros(1,length(allow));
                                 % 计算相连城市的转移概率
                                 for k = 1:length(allow)
                                     P(k) = T(tabu(end),allow(k))^alpha * H(tabu(end),allow(k))^beta;
                                 end
                                 P = P/sum(P);
                                 % 轮盘赌法选择下一个访问城市
                                Pc = cumsum(P);     %参加说明2(程序底部)
                                target_index = find(Pc >= rand); 
                                target = allow(target_index(1));
                                Table(i,j) = target;
                             end
                          end
    
                              % 计算各个蚂蚁的路径距离
                                      Length = zeros(m,1);
                                      for i = 1:m
                                          Route = [Table(i,:) Table(i,1)];
                                          for j = 1:n
                                              Length(i) = Length(i) + D(Route(j),Route(j + 1));
                                          end
                                      end   
                 %对最优路线和距离更新            
                       if iter == 1
                          [min_length,min_index] = min(Length);
                          best_length(iter) = min_length;  
                          best_route(iter,:) = Table(min_index,:);
                      else
                          [min_length,min_index] = min(Length);
                               if min_length<best_length(iter-1)
                                         best_length(iter)=min_length;
                                         best_route(iter,:)=Table(min_index,:);
                               else
                                        best_length(iter)=best_length(iter-1);
                                        best_route(iter,:)=best_route(iter-1,:);
                               end 
                       end
                                % 更新信息素
                              Delta_T= zeros(n,n);
                              % 逐个蚂蚁计算
                              for i = 1:m
                                  % 逐个城市计算
                                  Route = [Table(i,:) Table(i,1)];
                                  for j = 1:n
                                      Delta_T(Route(j),Route(j+1)) = Delta_T(Route(j),Route(j+1)) +D(Route(j),Route(j+1))* Q/Length(i);
                                  end
                              end
                              T= (1-v) * T + Delta_T;
                                     % 迭代次数加1,并清空路径记录表
                            iter = iter + 1;
                            Table = zeros(m,n);              
    end
    %--------------------------------------------------------------------------
    %% 结果显示
    shortest_route=best_route(end,:);                 %选出最短的路径中的点
    short_length=best_length(end);
    Time_Cost=etime(clock,t0);
    disp(['最短距离:' num2str(short_length)]);
    disp(['最短路径:' num2str([shortest_route shortest_route(1)])]);
    disp(['程序执行时间:' num2str(Time_Cost) '秒']);
    %--------------------------------------------------------------------------
    %% 绘图
    figure(1)
    %采用连线图画起来
    plot([city(shortest_route,1);city(shortest_route(1),1)], [city(shortest_route,2);city(shortest_route(1),2)],'o-');
    for i = 1:size(city,1)
        %对每个城市进行标号
        text(city(i,1),city(i,2),['   ' num2str(i)]);
    end
    xlabel('城市位置横坐标')
    ylabel('城市位置纵坐标')
    title(['蚁群算法最优化路径(最短距离):' num2str(short_length) ''])
    
    figure(2)
    %画出收敛曲线
    plot(1:iter_max,best_length,'b')
    xlabel('迭代次数')
    ylabel('距离')
    title('迭代收敛曲线')
    

     程序说明:采用蚁群算法求取TSP问题,共有34个城市,从txt文件加载数据:

    运行结果:

     

  • 相关阅读:
    【BZOJ 3090】 树形DP
    【BZOJ 2323】 2323: [ZJOI2011]细胞 (DP+矩阵乘法+快速幂*)
    【BZOJ 1019】 1019: [SHOI2008]汉诺塔 (DP?)
    【BZOJ 3294】 3294: [Cqoi2011]放棋子 (DP+组合数学+容斥原理)
    【BZOJ 3566】 3566: [SHOI2014]概率充电器 (概率树形DP)
    【BZOJ 2121】 (字符串DP,区间DP)
    【BZOJ 4305】 4305: 数列的GCD (数论)
    【UOJ 179】 #179. 线性规划 (单纯形法)
    【BZOJ 4568】 4568: [Scoi2016]幸运数字 (线性基+树链剖分+线段树)
    【BZOJ 4027】 4027: [HEOI2015]兔子与樱花 (贪心)
  • 原文地址:https://www.cnblogs.com/jacksin/p/9163508.html
Copyright © 2020-2023  润新知