蚁群算法—ACA

道阻且长,行则将至。

目录

  • 一、蚁群算法简介
    • 1.ACA基本思想
    • 2.ACA基本原理
    • 3.ACA基本步骤
  • 二、算法求解TSP问题
    • 1.导入数据
    • 2.计算城市间相互距离
    • 3.初始化参数
    • 4.迭代寻找最佳路径
    • 5.结果显示
    • End


一、蚁群算法简介

蚁群算法(Ant Colony Algorithm,ACA),20世纪90年代 M.Dorigo(意大利)受自然界蚂蚁觅食行为的启发提出一种新的优化算法解决旅行商问题(TSP),并取得较好的结果。
蚁群算法—ACA_第1张图片

1.ACA基本思想

 蚂蚁在寻找食物时,会在其经过的路径上释放一种信息素,并能够感知其他蚂蚁释放的信息素。信息素浓度的大小表征路径的远近,信息素浓度越高,表示对应的路径距离越短。通常,蚂蚁会以较大的概率优先选择信息素浓度较高的路径,并释放一定量的信息素,以增强该条路径上的信息素浓度,这样会形成一个正反馈。最终找到一条从巢穴到食物源的最佳路径,即最短距离。路径上的信息素浓度会随着时间的推进而逐渐衰减。

 将蚁群算法应用于解决优化问题的基本思路为:用蚂蚁的行走路径表示待优化问题的可行解,整个蚂蚁群体的所有路径构成待优化问题的解空间。路径较短的蚂蚁释放的信息素量较多,随着时间的推进较短的路径上累积的信息素浓度逐渐增高,选择该路径的蚂蚁个数也越来越多。最终,整个蚁群集中到最佳的路径上,即对应优化问题的最优解。

2.ACA基本原理

将以解决TSP问题为例描述ACA基本原理。

设整个蚂蚁群体中蚂蚁的数量为 m,城市的数量为 n,城市与城市之间的距离为di,j(i,j=1,2,…,n),t 时刻城市 i 与城市 j 连接路径上的信息素浓度为τi,j(t)。初始时刻,各个城市间连接路径上的信息素浓度相同:τi,j(0)=τ0

蚂蚁 k(k=1,2,…,m)根据各个城市间连接路径上的信息素浓度决定其下一个访问城市,设 Pki,j(t)表示 t 时刻蚂蚁 k 从城市 i 转移到城市 j 的概率,其计算公式为:
在这里插入图片描述
其中,ηij(t)为启发函数,ηij(t)=1/dij,表示蚂蚁从城市 i 转移到城市 j 的期望,allowk(k=1,2,…,m)为蚂蚁k待访问城市的集合,开始时allowk中有(n-1)个元素,即出去蚂蚁k出发城市的其他所有城市。随着时间的推进allowk中的元素不断减少,直至为空,表示所有的城市均访间完毕。α 为信息素重要程度因子,其值越大表示信息素的浓度在转移中起的影响越大。β 为启发函数重要程度因子,其值越大表示启发函数在转移中的影响越大,蚂蚁会以较大的概率转移到距离短的城市。

在蚂蚁释放信息素的同时,各个城市间连接路径上的信息素也会逐渐消失,设 ρ(0<ρ<1)表示信息素的挥发程度。当所有蚂蚁完成一次循环后,各个城市间连路径上的信息素浓度需进行实时更新:
在这里插入图片描述
蚁群算法—ACA_第2张图片
其中,△τki,j 表示第 k 只蚂蚁在城市 i 与城市 j 连接路径上释放的信息素浓度;△τi,j 表示所蚂蚁在城市 i 与城市 j 连接路径上释放的信息素浓度之和。

针对蚂蚁释放信息素问题,有 3 种不同的模型,分别称之为 ant cycle systemant quantity systcmant density system

  • 1.ant cycle system
    ant cycle system 模型中,△τki,j 的计算公式为:
    在这里插入图片描述
    Q为常数,表示蚂蚁循环一次所释放的信息素总量,Lk为第 k 只蚂蚁经过路径的长度。利用蚂蚁经过路径的整体信息(经过路径的总长)计算释放的信息素浓度
  • 2.ant quantity systcm
    蚁群算法—ACA_第3张图片
    利用蚂蚁经过路径的局部信息(经过各个城市间的距离)计算释放的信息素浓度。
  • 3.ant density system
    蚁群算法—ACA_第4张图片
    只是简单地将信息素释放的浓度取为固定值没有考虑不同蚂蚁经过路径长短的影响

3.ACA基本步骤

  • 1.初始化参数
    种群大小(蚂蚁数) m、信息素重要程度因子 α、启发函数重要程度因子 β、信息素挥发因子 ρ、信息素释放总量 Q、最大选代次数itermax、迭代次数初始值 iter = 1;
  • 2.构建解空间
    将各个蚂蚁随机地置于不同出发点,对每个蚂蚁 k(k=1,2,…,m),计算 Pki,j(t) 来确定其下一个待访问的城市,直到所有蚂蚁访问完所有的城市;
  • 3.更新信息素
    计算各个蚂蚁经过的路径长度 L(=1,2,…,m),记录当前选代次数中的最优解(最短路径),同时对各个城市连接路径上的信息素浓度进行更新;
  • 4.判断是否终止
    若 itermax,则令 iter = iter+1,清空蚂蚁经过路径的记录表,并返回步骤2;否则,输出最优解。

蚁群算法—ACA_第5张图片


二、算法求解TSP问题

1.导入数据

load citys_data.mat

城市坐标 x y:

citys_data:
1304	2312
3639	1315
4177	2244
3712	1399
3488	1535
3326	1556
3238	1229
4196	1004
4312	790
4386	570
3007	1970
2562	1756
2788	1491
2381	1676
1332	695
3715	1678
3918	2179
4061	2370
3780	2212
3676	2578
4029	2838
4263	2931
3429	1908
3507	2367
3394	2643
3439	3201
2935	3240
3140	3550
2545	2357
2778	2826
2370	2975

2.计算城市间相互距离

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;
        end
    end
end

3.初始化参数

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);      % 各代路径的平均长度

4.迭代寻找最佳路径

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

5.结果显示

[Shortest_Length,index] = min(Length_best);
Shortest_Route = Route_best(index,:);
disp(['最短距离:' num2str(Shortest_Length)]);
disp(['最短路径:' num2str([Shortest_Route Shortest_Route(1)])]);

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('各代最短距离与平均距离对比')

蚁群算法—ACA_第6张图片 蚁群算法—ACA_第7张图片

最短距离:15828.7082
最短路径:15  14  12  13  11  23  16   4   2   5   6   7   8   9  10   3  18  17  19  24  25  20  21  22  26  28  27  30  31  29   1  15
>> 

End

  • 采用正反馈机制,使得搜索过程不断收敛,最终逼近最优解。
  • 每个个体可以通过释放信息素来改变周围的环境,且每个个体能够感知周围环境的实时变化,个体间通过环境进行间接地通讯。
  • 搜索过程采用分布式计算方式,多个个体同时进行并行计算,大大提高了算法的计算能力和运行效率。
  • 启发式的概率搜索方式不容易陷入局部最优,易于寻找到全局最优解。

☕物有本末,事有终始,知所先后。

☝☝☝☝☝我的CSDN☝☝☝☝☝☝

你可能感兴趣的:(优化算法,算法,启发式算法)