蟻羣算法
文章目錄
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過大會失去很多有效路徑,容易影響隨機性和全局最優性。