一、蟻群算法簡介
蟻群算法(AG)是一種模擬螞蟻覓食行為的模擬優化算法,它是由意大利學者Dorigo M等人於1991年首先提出,並首先使用在解決TSP(旅行商問題)上。
1、螞蟻在路徑上釋放信息素。
2、碰到還沒走過的路口,就隨機挑選一條路走。同時,釋放與路徑長度有關的信息素。
3、信息素濃度與路徑長度成反比。后來的螞蟻再次碰到該路口時,就選擇信息素濃度較高路徑。
4、最優路徑上的信息素濃度越來越大。
5、最終蟻群找到最優尋食路徑。
三、蟻群算法流程圖

四、實例應用
基於TSP問題的基本蟻群算法
原理講解參考老師上課講解的PPT不做過多粘貼
1.源代碼:
%% 旅行商問題(TSP)優化
%% 清空環境變量
clear all
clc
%% 導入數據
citys = ceil(rand(50,2)*50000)
%load newcitys.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.05; % 信息素揮發因子
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('各代最短距離與平均距離對比')
運行結果:
利用函數citys = ceil(rand(50,2)*50000) 隨機產生五十個城市坐標


2.研究信息素重要程度因子alpha, 啟發函數重要程度因子beta,信息素揮發因子rho對結果的影響
為了保證變量唯一我重新設置五十個城市信息進行實驗

在原來設值

運行結果:

實驗結果可知當迭代到120次趨於穩定
2.1 alpha值對實驗結果影響
(1)當alpha=4時
運行結果

實驗結果可知當迭代到48次左右趨於穩定
(2)當alpha=8時
運行結果:

有圖可知迭代40次左右趨於穩定,搜索性較小
(3)當alpha= 0.5
運行結果:

有圖可知迭代到140次左右趨於穩定
(4)當alpha=0.2時
運行結果:

結果趨於110次左右穩定
所以如果信息素因子值設置過大,則容易使隨機搜索性減弱;其值過小容易過早陷入局部最優
2.2 beta值對實驗影響
(1)當 beta=8時
運行結果

結果迭代75次左右趨於穩定
(2)當 beta=1時
運行結果:

結果迭代130次左右趨於穩定
所以beta如果值設置過大,雖然收斂速度加快,但是易陷入局部最優;其值過小,蟻群易陷入純粹的隨機搜索,很難找到最優解
2.3 rho值對實驗結果影響
(1)當rho=3時
運行結果:

結果迭代75次左右趨於穩定
(2)當rho=0.05
運行結果:

結果迭代125次左右趨於穩定
所以如果rho取值過大時,容易影響隨機性和全局最優性;反之,收斂速度降低
總結:蟻群算法對於參數的敏感程度較高,參數設置的好,算法的結果也就好,參數設置的不好則運行結果也就不好,所以通常得到的只是局部最優解。
