蚁群算法

蚁群算法

一 蚁群算法基本原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c0NFR1zN-1572956837754)(C:\Users\59287\Desktop\20170513193105890.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pNS8ypie-1572956837762)(C:\Users\59287\Desktop\1.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YgmUlqRg-1572956837762)(C:\Users\59287\Desktop\2.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zICnkags-1572956837763)(C:\Users\59287\Desktop\3.jpg)]

1、蚂蚁在路径上释放信息素。

2、碰到还没走过的路口,就随机挑选一条路走。同时,释放与路径长度有关的信息素。

3、信息素浓度与路径长度成反比。后来的蚂蚁再次碰到该路口时,就选择信息素浓度较高路径。

4、最优路径上的信息素浓度越来越大。

5、最终蚁群找到最优寻食路径。

二 基于TSP问题的基本蚁群算法:

TSP求解中,假设蚁群算法中的每只蚂蚁是具有以下特征的简单智能体:

每次周游,每只蚂蚁在其经过的支路(i,j)上都留下信息素。

‚蚂蚁选择城市的概率与城市之间的距离和当前连接支路上所包含的信息素余量有关。

ƒ为了强制蚂蚁进行合法的周游,直到一次周游完成后,才允许蚂蚁游走已访问过的城市(这可由禁忌表来控制)。

三 代码实现旅行商问题(TSP)优化

在命令行运行0随机生成30个城市数据作为蚁群算法的数据

citys=rand(30,2)*3000;
save('citys.mat','citys');


运行代码

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

%% 导入数据

load citys.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,清空路径记录表

​ % 逐个城市路径选择

   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,清空路径记录表

​ % 逐个蚂蚁路径选择

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

​ % 逐个蚂蚁计算

​ % 逐个蚂蚁计算

​ % 更新信息素

      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,清空路径记录表

​ % 迭代次数加1,清空路径记录表

​ % 构建解空间

   citys_index = 1:n;

​ % 逐个蚂蚁路径选择

  for i = 1:m

​ % 逐个城市路径选择

​ % 逐个蚂蚁路径选择

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


三 结果显示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T7H6bqQk-1572956837764)(C:\Users\59287\Desktop\2.PNG)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LKtryXNU-1572956837765)(C:\Users\59287\Desktop\3.PNG)]

四 alpha beta rho设置不同值结果分析

运行结果及参数展示

alpha=1

beta=5

rho=0.1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VnwBZSW3-1572956837766)(C:\Users\59287\Desktop\1PNG.PNG)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LIq5p84f-1572956837766)(C:\Users\59287\Desktop\2.PNG)]

alpha=1

beta=1

rho=0.1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GbMhUCCS-1572956837767)(C:\Users\59287\Desktop\2.1.PNG)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-szo6LwMS-1572956837768)(C:\Users\59287\Desktop\2.2.PNG)]

beta值不同结果显示:

beta值越大,蚁群就越容易选择局部较短路径,这时算法的收敛速度是加快了,但是随机性不高,容易得到局部的相对最优

alpha=10

beta=5

rho=0.1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nRIrC16t-1572956837768)(C:\Users\59287\Desktop\3.1.PNG)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G3m3eNRF-1572956837769)(C:\Users\59287\Desktop\3.2.PNG)]

alpha值不同结果显示:

alpha值越大,蚂蚁选择之前走过的路径可能性就越大,搜索路径的随机性就减弱,alpha越小,蚁群搜索范围就会减少,容易陷入局部最优

alpha=1

beta=5

rho=0.5

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SECn2Xry-1572956837769)(C:\Users\59287\Desktop\4.1.PNG)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J26kLHOl-1572956837770)(C:\Users\59287\Desktop\4.2.PNG)]

rho值不同结果显示:

rho过小时,在各路径上的残留的信息素过多,导致无效的路径继续被搜索,影响到算法的收敛速率;
rho过大时,无效的路径虽然可以被排除搜索,但是不能保证也会被放弃搜索,影响到最优值的搜索

五 实验总结

蚁群算法是一种模拟生物界蚂蚁觅食过程的智能搜索算法,首先应用于组合优化问题,并取得了较好的结果。实验仿真结果表明:蚁群算法合理地利用了信息素,在搜索时间和解的质量之间取得了一个较好的平衡,该算法是一种有效的算法

beta值越大迭代次数越多 最小距离越长

越大,蚁群就越容易选择局部较短路径,这时算法的收敛速度是加快了,但是随机性不高,容易得到局部的相对最优

alpha=10

beta=5

rho=0.1

[外链图片转存中…(img-nRIrC16t-1572956837768)]

[外链图片转存中…(img-G3m3eNRF-1572956837769)]

alpha值不同结果显示:

alpha值越大,蚂蚁选择之前走过的路径可能性就越大,搜索路径的随机性就减弱,alpha越小,蚁群搜索范围就会减少,容易陷入局部最优

alpha=1

beta=5

rho=0.5

[外链图片转存中…(img-SECn2Xry-1572956837769)]

[外链图片转存中…(img-J26kLHOl-1572956837770)]

rho值不同结果显示:

rho过小时,在各路径上的残留的信息素过多,导致无效的路径继续被搜索,影响到算法的收敛速率;
rho过大时,无效的路径虽然可以被排除搜索,但是不能保证也会被放弃搜索,影响到最优值的搜索

五 实验总结

蚁群算法是一种模拟生物界蚂蚁觅食过程的智能搜索算法,首先应用于组合优化问题,并取得了较好的结果。实验仿真结果表明:蚁群算法合理地利用了信息素,在搜索时间和解的质量之间取得了一个较好的平衡,该算法是一种有效的算法

beta值越大迭代次数越多 最小距离越长

alpha越大 距离越短

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值