数学建模学习笔记(一) 蚁群算法(MATLAB)

蚁群算法

1.什么是蚁群算法?

1.1 算法概述

蚁群算法(Ant Colony Algorithm, ACA)由Marco Dorigo于1992年在他的博士论文中首次提出。

蚁群系统(Ant System(AS)或Ant Colony System(ACS))是由意大利学者Dorigo、Maniezzo等人于20世纪90年代首先提出来的。他们在研究蚂蚁觅食的过程中,发现蚁群整体会体现一些智能的行为,例如蚁群可以在不同的环境下,寻找最短到达食物源的路径。

​ 后经进一步研究发现,这是因为蚂蚁会在其经过的路径上释放一种可以称之为“信息素(pheromone)”的物质,蚁群内的蚂蚁对“信息素”具有感知能力,它们会沿着“信息素”浓度较高路径行走,而每只路过的蚂蚁都会在路上留下“信息素”,这就形成一种类似正反馈的机制,这样经过一段时间后,整个蚁群就会沿着最短路径到达食物源了。

数学建模学习笔记(一) 蚁群算法(MATLAB)_第1张图片

​ 由上述蚂蚁找食物模式演变来的算法,即是蚁群算法。这种算法具有分布计算、信息正反馈启发式搜索的特征,本质上是进化算法中的一种启发式全局优化算法

​ 最近几年,该算法在网络路由中的应用受到越来越多学者的关注,并提出了一些新的基于蚂蚁算法的路由算法。同传统的路由算法相比较,该算法在网络路由中具有信息分布式性、动态性、随机性和异步性等特点,而这些特点正好能满足网络路由的需要。

蚁群算法演练

蚁群算法应用广泛,如旅行商问题(traveling salesman problem,简称TSP)、指派问题、Job-shop调度问题、车辆路径问题(vehicle routing problem)、图着色问题(graph coloring problem)和网络路由问题(network routing problem)等等。

1.2 数学原理

数学建模学习笔记(一) 蚁群算法(MATLAB)_第2张图片

关于蚁群算法中释放信息素的特点,定义了三种模型:

  • 第一种模型假设信息素总量一定。信息素浓度和经过路径的长度成反比。
数学建模学习笔记(一) 蚁群算法(MATLAB)_第3张图片

  • 第二种模型中不使用经过的总路径,而仅仅使用相邻城市的路径长度。
数学建模学习笔记(一) 蚁群算法(MATLAB)_第4张图片

  • 第三种模型更简单,不管距离长短,释放的信息素都一样。
数学建模学习笔记(一) 蚁群算法(MATLAB)_第5张图片

本文下面设计的MATLAB程序,以第一种模型为例。

1.3 算法步骤

数学建模学习笔记(一) 蚁群算法(MATLAB)_第6张图片

2.算法实例

2.1 旅行商问题(TSP)

  • Traveling Salesman Problem, TSP 是一个非常经典的问题

  • 在N个城市中各经历一次后再回到出发点,使所经过的路程最短。

  • 若不考虑方向性和周期性,在给定N的条件下,可能存在的闭合路径可达到1/2*N!数量级。当N较大时,枚举法的计算量之大难以想象。。

  • TSP问题经常被视为验证优化算法性能的一个“金标准”

数学建模学习笔记(一) 蚁群算法(MATLAB)_第7张图片

2.2 实例代码(MATLAB)

%% I. 清空环境变量
clear all
clc
%% II. 导入数据
% load citys_data.mat
 citys = [16.4700   96.1000
     16.4700   94.4400
     20.0900   92.5400
     22.3900   93.3700
     25.2300   97.2400
     22.0000   96.0500
     20.4700   97.0200
     17.2000   96.2900
     16.3000   97.3800
     14.0500   98.1200
     16.5300   97.3800
     21.5200   95.5900
     19.4100   97.1300
     20.0900   92.5500];
%% III. 计算城市间相互距离
n = size(citys,1); % 城市数量
D = zeros(n,n);
for i = 1:n
    for j = 1:n
        if i ~= j
            D(i,j) = sqrt(sum((citys(i,:) - citys(j,:)).^2));
        else
            D(i,j) = 1e-4;  %如果是0会导致矩阵对角线都是0 导致启发函数无穷大 因此取个很小的值    
        end
    end    
end
 
%% IV. 初始化参数
m = 50;                              % 蚂蚁数量
alpha = 1;                           % 信息素重要程度因子
beta = 5;                            % 启发函数重要程度因子
rho = 0.1;                           % 信息素挥发因子
Q = 1;                               % 常系数
Eta = 1./D;                          % 启发函数
Tau = ones(n,n);                     % 信息素矩阵
Table = zeros(m,n);                  % 路径记录表,每一行代表一个蚂蚁走过的路径
iter = 1;                            % 迭代次数初值
iter_max = 200;                      % 最大迭代次数 
Route_best = zeros(iter_max,n);      % 各代最佳路径       
Length_best = zeros(iter_max,1);     % 各代最佳路径的长度  
Length_ave = zeros(iter_max,1);      % 各代路径的平均长度  
 
%% V. 迭代寻找最佳路径
while iter <= iter_max
     % 随机产生各个蚂蚁的起点城市
      start = zeros(m,1);
      for i = 1:m
          temp = randperm(n);
          start(i) = temp(1);
      end
      Table(:,1) = start; 
      citys_index = 1:n;
      % 逐个蚂蚁路径选择
      for i = 1:m
          % 逐个城市路径选择
         for j = 2:n
             tabu = Table(i,1:(j - 1));           % 已访问的城市集合(禁忌表)
             allow_index = ~ismember(citys_index,tabu);
             allow = citys_index(allow_index);  % 待访问的城市集合
             P = allow;
             % 计算城市间转移概率
             for k = 1:length(allow)
                 P(k) = Tau(tabu(end),allow(k))^alpha * Eta(tabu(end),allow(k))^beta;
             end
             P = P/sum(P);
             % 轮盘赌法选择下一个访问城市
             Pc = cumsum(P);     
            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,:);
          for j = 1:(n - 1)
              Length(i) = Length(i) + D(Route(j),Route(j + 1));
          end
          Length(i) = Length(i) + D(Route(n),Route(1));
      end
      % 计算最短路径距离及平均距离
      if iter == 1
          [min_Length,min_index] = min(Length);
          Length_best(iter) = min_Length;  
          Length_ave(iter) = mean(Length);
          Route_best(iter,:) = Table(min_index,:);
      else
          [min_Length,min_index] = min(Length);
          Length_best(iter) = min(Length_best(iter - 1),min_Length);
          Length_ave(iter) = mean(Length);
          if Length_best(iter) == min_Length
              Route_best(iter,:) = Table(min_index,:);
          else
              Route_best(iter,:) = Route_best((iter-1),:);
          end
      end
      % 更新信息素
      Delta_Tau = zeros(n,n);
      % 逐个蚂蚁计算
      for i = 1:m
          % 逐个城市计算
          for j = 1:(n - 1)
              Delta_Tau(Table(i,j),Table(i,j+1)) = Delta_Tau(Table(i,j),Table(i,j+1)) + Q/Length(i);
          end
          Delta_Tau(Table(i,n),Table(i,1)) = Delta_Tau(Table(i,n),Table(i,1)) + Q/Length(i);
      end
      Tau = (1-rho) * Tau + Delta_Tau;
    % 迭代次数加1,清空路径记录表
    iter = iter + 1;
    Table = zeros(m,n);
end
 
%% VI. 结果显示
[Shortest_Length,index] = min(Length_best);
Shortest_Route = Route_best(index,:);
disp(['最短距离:' num2str(Shortest_Length)]);
disp(['最短路径:' num2str([Shortest_Route Shortest_Route(1)])]);
%% VII. 绘图
figure(1)
plot([citys(Shortest_Route,1);citys(Shortest_Route(1),1)],...
     [citys(Shortest_Route,2);citys(Shortest_Route(1),2)],'o-');
grid on
for i = 1:size(citys,1)
    text(citys(i,1),citys(i,2),['   ' num2str(i)]);
end
text(citys(Shortest_Route(1),1),citys(Shortest_Route(1),2),'       起点');
text(citys(Shortest_Route(end),1),citys(Shortest_Route(end),2),'       终点');
xlabel('城市位置横坐标')
ylabel('城市位置纵坐标')
title(['蚁群算法优化路径(最短距离:' num2str(Shortest_Length) ')'])
figure(2)
plot(1:iter_max,Length_best,'b',1:iter_max,Length_ave,'r:')
legend('最短距离','平均距离')
xlabel('迭代次数')
ylabel('距离')
title('各代最短距离与平均距离对比')

2.3 结果展示

数学建模学习笔记(一) 蚁群算法(MATLAB)_第8张图片

3.ACA算法特点

  • 采用正反馈机制,使得搜索过程不断收敛,最终逼近于最优解;

  • 每个个体可以通过释放信息素来改变周围的环境,且每个个体能够感知周围环境的实时变化,个体间通过环境(信息素)进行间接地通讯。对比之下,粒子群优化算法中采用局部最优解、全局最优解的广播来实现通讯。

  • 搜索过程采用分布式计算方式,多个个体同时进行并行计算,大大提高了算法的计算能力和运行效率;

  • 启发式的概率搜索方式,不容易陷入局部最优,易于寻找到全局最优解。

ACA中也采用轮盘赌法,和遗传算法中的启发方法一样,即选择最大的概率那个选项继续前进。

4.相关链接

https://blog.csdn.net/lyxleft/article/details/82980760蚁群算法(Ant Colony Algorithm, ACA)简介及其MATLAB实现

https://cloud.tencent.com/developer/article/1103493干货|十分钟快速get蚁群算法(附代码)

https://www.jianshu.com/p/ad645d64abcd蚁群算法及其MATLAB实现

你可能感兴趣的:(数学建模学习笔记(一) 蚁群算法(MATLAB))