蚁群算法

简介

• 蚁群优化(ant colony optimization, ACO)是20世纪90年代初由意大利学者 M.Dorigo等通过模拟蚂蚁的行为而提出的一种随机优化技术。
• 最初用于求解旅行商问题, 现在已经成功用于许多组合优化问题 。本次实验正是以解决旅行商问题为例。

算法原理

蚂蚁的觅食行为及其优化过程
双桥实验
在研究蚂蚁觅食行为过程中,人们发现,尽管单只蚂蚁的能力十分有限,但整个蚁群却在觅食过程中可以发现 从蚁巢到食物源的最短路径。
在觅食过程中,蚂蚁通过“媒介质”来协调它们之间的行动。所谓“媒介质”指的是一种以环境的变化为媒介的间接通信方式。蚂蚁在寻找食物时,以其产生的被称为信息素的化学物质作为媒介而间接的传递信息。当蚂蚁从 蚁穴走到食物源,从而形成了含有信息素的路径。
• 蚁群算法是对自然界蚂蚁的寻径方式进行模似而得出的一种仿生算法:蚂蚁在运动过程中,能够在它所经过的路径上留下信息素(pheromone)的物质进行信息传递,而且蚂蚁在运动过程中能够感知这种物质,并以此指导自己运动方向。
• 由大量蚂蚁组成的蚁群集体行为便表现出一种信息正反馈现象:某一路径上走过的蚂蚁越多,则后来者选择该路径的概率就越大。

在这里插入图片描述

基本流程

• 在ACO 算法中,人工蚂蚁实际上代表的是一个解的随机构建过程,从最初的空解开始,通过不断地向部分解添加解的成分而构建出一个完整的解
• AS算法对TSP的求解主要有两大步骤:
• 1、路径构建
• 2、信息素更新
蚁群算法实现TSP过程为:将m只蚂蚁放入到n个随机选择的城市中,那么每个蚂蚁每步的行动是:根据–定的依据选择下一个它还没有访问的城市;同时在完成一步(从一个城市到达另一个城市)或者一个循环(完成对所有n个城市的访问)后,更新所有路径上的信息素浓度。
在这里插入图片描述

重要参数

1.蚂蚁个数:约为城市数量的1.5倍。如果蚂蚁数量过大,则每条路径上的信息素浓度趋于平均,正反馈作用减弱,从而导致收敛速度减慢;如果过小,则可能导致一些从未搜索过的路径信息素浓度减小为0,导致过早收敛,解的全局最优性降低。
2.信息素重要程度因子:反映了蚂蚁运动过程中积累的信息量在指导蚁群搜索中的相对重要程度,取值范围通常在[1, 4]之间。
3.启发函数重要程度因子:反映了启发式信息在指导蚁群搜索中的相对重要程度,取值范围在[3, 4.5]之间。
4.信息素挥发因子:反映了信息素的消失水平,取值范围通常在[0.2, 0.5]之间。
在这里插入图片描述

代码展示

%% 旅行商问题(TSP)优化
%% 清空环境变量
clear all
clc

%% 导入数据
load citys_data.mat

%% 计算城市间相互距离
fprintf('Computing Distance Matrix... \n');
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

%% 初始化参数
fprintf('Initializing Parameters... \n');
m = 60;                              % 蚂蚁数量
alpha = 1;                           % 信息素重要程度因子
beta = 5;                            % 启发函数重要程度因子
rho = 0.1;                           % 信息素挥发因子
iter_max = 100;                      % 最大迭代次数 
Q = 1;                               % 常系数
Eta = 1./D;                          % 启发函数
Tau = ones(n,n);                     % 信息素矩阵
Table = zeros(m,n);                  % 路径记录表
iter = 1;                            % 迭代次数初值

Route_best = zeros(iter_max,n);      % 各代最佳路径       
Length_best = zeros(iter_max,1);     % 各代最佳路径的长度  
Length_ave = zeros(iter_max,1);      % 各代路径的平均长度  

%% 迭代寻找最佳路径
figure;
while iter <= iter_max
    fprintf('迭代第%d次\n',iter);
    % 随机产生各个蚂蚁的起点城市
      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,清空路径记录表

 %   figure;
 %最佳路径的迭代变化过程
    [Shortest_Length,index] = min(Length_best(1:iter));
    Shortest_Route = Route_best(index,:);
    plot([citys(Shortest_Route,1);citys(Shortest_Route(1),1)],...
    [citys(Shortest_Route,2);citys(Shortest_Route(1),2)],'o-');
    pause(0.3);
 
    iter = iter + 1;
    Table = zeros(m,n);

 % end
end

%% 结果显示
[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)]);
    enda
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('各代最短距离与平均距离对比')

测试数据

city: 40个
 x       y
2968	1553
1238	1899
2611	1803
1228	954
1150	1451
2359	3118
2541	3620
2101	3412
2025	3483
1317	1164
673	1972
782	670
33	2169
2188	1102
1089	3560
2700	3028
1662	1192
2217	3771
1943	2967
1393	1245
2655	3653
2671	1488
1224	2904
868	2300
1245	3506
1029	3475
765	3149
1936	2970
358	3628
977	1661
2912	34
771	2169
2352	642
2859	2297
2933	2129
2502	812
2139	1671
606	946
1859	3304
1389	3837

运行结果

alpha->信息素重要程度因子
beta->启发函数重要程度因子
rho->信息素挥发因子
1.alpha=1,beta=3.5,rho=0.3
在这里插入图片描述最短距离:18328.1376
2.alpha=2,beta=3.5,rho=0.3
在这里插入图片描述最短距离:18399.0108
3.alpha=3,beta=3.5,rho=0.3
在这里插入图片描述最短距离:18328.1376

分析:
当固定beta=3.5,rho=0.3,而改变alpha在[1,3]之间时,在alpha=1、3时,找到更短距离的局部最优解。
4.alpha=2,beta=3,rho=0.3
在这里插入图片描述最短距离:18536.043
5.alpha=2,beta=3.5,rho=0.3
在这里插入图片描述最短距离:18396.1858
6.alpha=2,beta=4,rho=0.3
在这里插入图片描述最短距离:18523.0683

分析
当固定alpha=2,rho=0.3,而改变beta在[3,4]之间时,在beta=3.5时,找到更短距离的局部最优解。
7.alpha=2,beta=3.5,rho=0.2
在这里插入图片描述最短距离:18334.8823
8.alpha=2,beta=3.5,rho=0.3
在这里插入图片描述最短距离:18278.7888
9.alpha=2,beta=3.5,rho=0.4
在这里插入图片描述最短距离:18328.1376
分析
当固定alpha=2,beta=3.5,而改变rho在[0.2,0.4]之间时,在rho=0.3时,找到最优解。

实验结论

从上述实验结果可以看出三个影响因素对于实验结果的影响程度,
如果信息素因子值(alpha)设置过大,则容易使随机搜索性减弱;其值过小容易过早陷入局部最优
如果启发函数重要程度因子(beta)设置过大,虽然收敛速度加快,但是易陷入局部最优;其值过小,蚁群易陷入纯粹的随机搜索,很难找到最优解。
当信息素挥发因子(rho)取值过大时,容易影响随机性和全局最优性;反之,收敛速度降低。
可以看出,三个影响因素并不是越大越优或者,越小越优,需要取到合适的值才能找到最优的解,本次实验最优条件为alpha=2,beta=3.5,rho=0.3,且最短距离为18278.7888,但是实验随机性很高,很容易找不到最优解,应设大实验数量以更好的探查实验结果。

蚁群算法(AS)的优点
1.在求解性能上,具有很强的鲁棒性。
2.蚁群算法有多种改进版本可以进一步找出更优的解。
蚁群算法(AS)的缺点
1、收敛速度慢
2、易于陷入局部最优

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值