蚁群优化问题

一、起源和原理

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

2、原理
蚁群优化算法作为一种全局最优化搜素方法,同遗传算法一样,灵感都来源于自然界,并有良好的搜素性能。然而,从数学的角度来理解分析它们的工作方式是很难的,因为这些算法都具有很复杂的随机过程。
ACO算法的过程具有一定的随机性,这就要求初始化蚂蚁的数量和更新信息素的次数必须足够的多,只有这样才能最终收敛到全局最优解。虽然这使得ACO算法的执行需要花费比较长的时间,但是算法具有找到全局最优解的能力,并且寻找最优解的能力比一般的算法要好。ACO算法的运行时间并不能简单地通过减少蚂蚁数量和运行次数来减少,这样会使得算法过于早熟,即蚂蚁会很快的全部集中在一条局部最优的路径上,而不是全局最优路径。当考虑像ACO算法这样的随机算法时,算法的运行时间通常被表示为一个随机变量来测量算法解决一个参数化问题所需要的执行步骤数。
AS算法对TSP的求解主要有两大步骤:
(1)路径构建
(2)信息素更新
当所有蚂蚁都构建完一条路径之后,算法 将根据AS中的信息素蒸发规则进行信息素的更新。

AS求解TSP的流程图和伪代码:

在这里插入图片描述

二、实验代码

%% 旅行商问题(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 = 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 = 150;                      % 最大迭代次数 
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
 %% 结果显示
[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('各代最短距离与平均距离对比')

三、实验结果

在这里插入图片描述
在这里插入图片描述

四、实验分析

1、 信息素重要程度因子(alpha)
alpha决定算法搜索的方向,影响算法的搜索能力。信息素重要程度因子越小,最邻近城市被选中的概率越大,蚂蚁越注重“眼前利益”。alpha=0时,算法等同于随机贪婪算法。
alpha=1,
在这里插入图片描述
alpha=2,
在这里插入图片描述
alpha=0,随机贪婪
在这里插入图片描述

2、启发函数重要程度因子(beta )
beta越小,蚂蚁越倾向于根据信息素浓度确定路径,算法收敛越快。
beta=0时,构建出的最优路径与实际目标有着较大差异,算法的性能比较糟糕。
beta=5 时:
在这里插入图片描述
beta=10时:
在这里插入图片描述
beta=0,算法比较糟糕,达不到实际目标
在这里插入图片描述
在这里插入图片描述

3、信息素挥发因子(rho )
信息素挥发因子影响蚂蚁个体之间相互影响的强弱,关系到算法的全局搜索能力和收敛速度。
rho较大时,信息素挥发速率大,那些从未被蚂蚁选择过的边上的信息素急剧减小到接近0,降低算法的全局探索能力。
rho较小时,算法具有较高的全局搜索能力,但是由于各个路径的信息素浓度差距拉大较慢,算法收敛速度较慢。
rho=0.02时,全局探索能力较弱
在这里插入图片描述
rho=0.4时,
在这里插入图片描述

发布了9 篇原创文章 · 获赞 1 · 访问量 294

猜你喜欢

转载自blog.csdn.net/weixin_45380156/article/details/102918524