蟻群算法(ACA)及其Matlab實現


1基本原理

本質上也是一種概率算法,通過大概率收斂到最佳值,和其他的智能算法很相似。蟻群分泌的信息素存在正反饋,使得較佳的解

具有大概率被選到,當全局都選用較佳的解,變可以得到整體的最優解。

2幾個關鍵點:

  1) 概率選擇:

      受信息素濃度和啟發函數影響,啟發函數為距離的倒數

   2)信息素揮發

      考慮到信息素隨時間的揮發,加入揮發因子                

3程序設計步驟:

    1初始化各個參數:包括各點的距離,信息素的初始濃度,螞蟻數量,信息素揮發因子

                                    信息素和啟發函數的重要度因子,啟發函數,最大迭代次數,路徑記錄表等等

      2迭代:對每個螞蟻隨機制定初始值,再根據概率選擇,選擇出每只螞蟻的路徑,確定每只螞蟻的路徑總長度,

                   以及蟻群的最佳路徑長度和平均長度,並對信息素進行更新。

      3展示:展示出最佳路徑,以及最佳路徑對迭代的變化圖

   4Matlab代碼

 

clc,clear                                                                                    %清空環境中的變量
load data.txt                                                                           %讀入城市的坐標
t0 = clock;                                                                                %程序計時開始
%%
%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%
city=data;
n = size(city,1);                                                                      %城市距離初始化
D = zeros(n,n);                                                    
for i = 1:n
    for j = 1:n
           if i ~= j
            D(i,j) = sqrt(sum((city(i,:) - city(j,:)).^2));
        else
            D(i,j) = 0;      %設定的對角矩陣修正值
        end
    end    
end
m=30;                                                                                        %螞蟻數量
alpha = 1;                                                                                 % 信息素重要程度因子
beta = 5;                                                                                  % 啟發函數重要程度因子
v = 0.1;                                                                                     % 信息素揮發因子
Q = 0.5;                                                                                     % 信息因子常系數
H= 1./D;                                                                         % 啟發函數
T= ones(n,n);                                                                         % 信息素矩陣
Table = zeros(m,n);                                                               % 路徑記錄表
iter = 1;                                                                                    % 迭代次數初值
iter_max = 50;                                                                     % 最大迭代次數 
best_route = zeros(iter_max,n);                                       % 各代最佳路徑       
best_length = zeros(iter_max,1);                                     % 各代最佳路徑的長度  
%%
while iter<=iter_max
   
                        % 隨機產生每只螞蟻的起點城市
                          start = zeros(m,1);
                          for i = 1:m
                              temp = randperm(n);
                              start(i) = temp(1);
                          end
                          Table(:,1) = start; 
                          city_index=1:n;
                          for i = 1:m
                          % 逐個城市路徑選擇
                         for j = 2:n
                             tabu = Table(i,1:(j - 1));                                                   % 已訪問的城市集合
                             allow =city_index( ~ismember(city_index,tabu));    % 篩選出未訪問的城市集合
                             P = zeros(1,length(allow));
                             % 計算相連城市的轉移概率
                             for k = 1:length(allow)
                                 P(k) = T(tabu(end),allow(k))^alpha * H(tabu(end),allow(k))^beta;
                             end
                             P = P/sum(P);
                             % 輪盤賭法選擇下一個訪問城市
                            Pc = cumsum(P);     %參加說明2(程序底部)
                            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,:) Table(i,1)];
                                      for j = 1:n
                                          Length(i) = Length(i) + D(Route(j),Route(j + 1));
                                      end
                                  end   
             %對最優路線和距離更新            
                   if iter == 1
                      [min_length,min_index] = min(Length);
                      best_length(iter) = min_length;  
                      best_route(iter,:) = Table(min_index,:);
                  else
                      [min_length,min_index] = min(Length);
                           if min_length<best_length(iter-1)
                                     best_length(iter)=min_length;
                                     best_route(iter,:)=Table(min_index,:);
                           else
                                    best_length(iter)=best_length(iter-1);
                                    best_route(iter,:)=best_route(iter-1,:);
                           end 
                   end
                            % 更新信息素
                          Delta_T= zeros(n,n);
                          % 逐個螞蟻計算
                          for i = 1:m
                              % 逐個城市計算
                              Route = [Table(i,:) Table(i,1)];
                              for j = 1:n
                                  Delta_T(Route(j),Route(j+1)) = Delta_T(Route(j),Route(j+1)) +D(Route(j),Route(j+1))* Q/Length(i);
                              end
                          end
                          T= (1-v) * T + Delta_T;
                                 % 迭代次數加1,並清空路徑記錄表
                        iter = iter + 1;
                        Table = zeros(m,n);              
end
%--------------------------------------------------------------------------
%% 結果顯示
shortest_route=best_route(end,:);                 %選出最短的路徑中的點
short_length=best_length(end);
Time_Cost=etime(clock,t0);
disp(['最短距離:' num2str(short_length)]);
disp(['最短路徑:' num2str([shortest_route shortest_route(1)])]);
disp(['程序執行時間:' num2str(Time_Cost) '秒']);
%--------------------------------------------------------------------------
%% 繪圖
figure(1)
%采用連線圖畫起來
plot([city(shortest_route,1);city(shortest_route(1),1)], [city(shortest_route,2);city(shortest_route(1),2)],'o-');
for i = 1:size(city,1)
    %對每個城市進行標號
    text(city(i,1),city(i,2),['   ' num2str(i)]);
end
xlabel('城市位置橫坐標')
ylabel('城市位置縱坐標')
title(['蟻群算法最優化路徑(最短距離):' num2str(short_length) ''])

figure(2)
%畫出收斂曲線
plot(1:iter_max,best_length,'b')
xlabel('迭代次數')
ylabel('距離')
title('迭代收斂曲線')

 

 程序說明:采用蟻群算法求取TSP問題,共有34個城市,從txt文件加載數據:

運行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM