蟻羣算法

蟻羣算法

1.算法原理

蟻羣算法是模擬螞蟻覓食的原理,設計出的一種羣集智能算法。螞蟻在覓食過程中能夠在其經過的路徑上留下一種稱之爲信息素的物質,並在覓食過程中能夠感知這種物質的強度,並指導自己行動方向,它們總是朝着該物質強度高的方向移動,因此大量螞蟻組成的集體覓食就表現爲一種對信息素的正反饋現象。某一條路徑越短,路徑上經過的螞蟻越多,其信息素遺留的也就越多,信息素的濃度也就越高,螞蟻選擇這條路徑的機率也就越高,由此構成的正反饋過程,從而逐漸的逼近最優路徑,找到最優路徑。

2.基本流程

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

3.數據獲取

3.1信息素重要程度因子改變時

3.1.1
alpha = 1;
beta = 5;
rho = 0.1;
最短距離:23712.7846
最短路徑:27 7 29 15 4 33 26 8 30 1 18 11 14 19 3 24 40 22 34 32 13 17 9 38 16 36 5 35 25 10 2 12 23 6 39 31 21 28 20 37 27
在這裏插入圖片描述
3.1.2
alpha = 3;
beta = 5;
rho = 0.1;
最短距離:24330.1047
最短路徑:15 4 33 26 8 30 1 18 11 14 19 24 40 22 3 34 32 13 17 9 38 16 36 5 35 25 10 2 12 23 6 21 31 39 28 20 27 7 29 37 15在這裏插入圖片描述
3.1.3
alpha = 5;
beta = 5;
rho = 0.1;
最短距離:24002.2686
最短路徑:7 27 29 15 4 33 26 8 30 1 18 11 14 19 34 32 13 40 22 3 24 17 9 38 16 36 5 35 25 10 2 12 23 6 39 31 21 28 20 37 7
在這裏插入圖片描述

3.2啓發函數重要程度因子改變時

3.2.1
alpha = 1;
beta = 5;
rho = 0.1;
最短距離:23712.7846
最短路徑:27 7 29 15 4 33 26 8 30 1 18 11 14 19 3 24 40 22 34 32 13 17 9 38 16 36 5 35 25 10 2 12 23 6 39 31 21 28 20 37 27
在這裏插入圖片描述
3.2.2
alpha = 1;
beta = 4;
rho = 0.1;
最短距離:23163.2512
最短路徑:24 40 22 3 34 32 13 17 9 38 16 36 5 35 25 10 2 12 23 6 39 31 21 28 20 7 27 29 37 15 4 33 26 8 30 1 18 11 14 19 24
在這裏插入圖片描述
3.2.3
alpha = 1;
beta = 3;
rho = 0.1;
最短距離:23144.2149
最短路徑:27 7 29 37 15 4 33 26 8 30 1 18 11 14 19 24 40 22 3 34 32 13 17 9 38 16 36 5 35 25 10 2 12 23 6 39 31 21 28 20 27
在這裏插入圖片描述
3.2.4
alpha = 1;
beta = 2;
rho = 0.1;
最短距離:23795.7455
最短路徑:20 28 27 7 29 37 15 4 33 26 8 30 1 18 11 14 19 24 40 22 3 34 32 13 17 9 38 16 36 5 35 25 10 2 12 23 6 31 39 21 20
在這裏插入圖片描述

3.3信息素揮發因子改變時

3.3.1
alpha = 1;
beta = 5;
rho = 0.1;
最短距離:23712.7846
最短路徑:27 7 29 15 4 33 26 8 30 1 18 11 14 19 3 24 40 22 34 32 13 17 9 38 16 36 5 35 25 10 2 12 23 6 39 31 21 28 20 37 27
在這裏插入圖片描述
3.3.2
alpha = 1;
beta = 5;
rho = 0.3;
最短距離:23679.5938
最短路徑:39 31 21 28 20 37 29 7 27 15 4 33 26 8 30 1 18 11 14 19 24 40 22 3 34 32 13 17 9 38 16 36 5 35 25 10 2 12 23 6 39
在這裏插入圖片描述3.3.3
alpha = 1;
beta = 5;
rho = 0.6;
最短距離:23929.6762
最短路徑:26 33 4 8 30 1 18 11 14 19 24 40 22 3 34 32 13 17 9 38 16 36 5 35 25 10 2 12 23 6 39 31 21 28 20 15 29 7 27 37 26
在這裏插入圖片描述

4.算法實現(matlab)

4.1
城市40座通過隨機函數生成,再將其導入citys.mat中使用
在這裏插入圖片描述
4.2代碼實現

%% 旅行商問題(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.6;                           % 信息素揮發因子
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
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('各代最短距離與平均距離對比')

5.結論

5.1信息素重要程度因子

(1)alpha越小,最鄰近城市被選中概率越大。
(2)收斂速度隨alpha的值的增大而增快。
(3)隨着alpha值增大,螞蟻選擇之前走過的路徑的可能性越大,探索隨機性減小。
(4)當alpha值過小時,螞蟻搜索範圍會減少,易陷入局部最優解。

5.2啓發函數重要程度因子

(1)beta越小,螞蟻越傾向於根據信息素濃度確定路徑。
(2)隨着beta值增大,螞蟻選擇局部較短路徑可能性增大,容易陷入局部最優解。
(3)隨着beta值得增大,特別是beta大於3時,算法收斂性變差。

5.3信息素揮發因子

(1)rho較大時,信息素揮發速率大,降低了算法的全局搜索能力。
(2)收斂速度隨着rho的增大而加快。
(3)rho過大會失去很多有效路徑,容易影響隨機性和全局最優性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章