目录
- 一、蚁群算法简介🍓
- 1.ACA基本思想
- 2.ACA基本原理
- 3.ACA基本步骤
- 二、算法求解TSP问题🍎
- 1.导入数据
- 2.计算城市间相互距离
- 3.初始化参数
- 4.迭代寻找最佳路径
- 5.结果显示
- End
一、蚁群算法简介🍓
蚁群算法(Ant Colony Algorithm,ACA),20世纪90年代 M.Dorigo(意大利)受自然界蚂蚁觅食行为的启发提出一种新的优化算法解决旅行商问题(TSP),并取得较好的结果。
1.ACA基本思想
蚂蚁在寻找食物时,会在其经过的路径上释放一种信息素,并能够感知其他蚂蚁释放的信息素。信息素浓度的大小表征路径的远近,信息素浓度越高,表示对应的路径距离越短。通常,蚂蚁会以较大的概率优先选择信息素浓度较高的路径,并释放一定量的信息素,以增强该条路径上的信息素浓度,这样会形成一个正反馈。最终找到一条从巢穴到食物源的最佳路径,即最短距离。路径上的信息素浓度会随着时间的推进而逐渐衰减。
将蚁群算法应用于解决优化问题的基本思路为:用蚂蚁的行走路径表示待优化问题的可行解,整个蚂蚁群体的所有路径构成待优化问题的解空间。路径较短的蚂蚁释放的信息素量较多,随着时间的推进较短的路径上累积的信息素浓度逐渐增高,选择该路径的蚂蚁个数也越来越多。最终,整个蚁群集中到最佳的路径上,即对应优化问题的最优解。
2.ACA基本原理
将以解决TSP问题为例描述ACA基本原理。
设整个蚂蚁群体中蚂蚁的数量为 m,城市的数量为 n,城市与城市之间的距离为di,j(i,j=1,2,…,n),t 时刻城市 i 与城市 j 连接路径上的信息素浓度为τi,j(t)。初始时刻,各个城市间连接路径上的信息素浓度相同:τi,j(0)=τ0。
蚂蚁 k(k=1,2,…,m)根据各个城市间连接路径上的信息素浓度决定其下一个访问城市,设 Pki,j(t)表示 t 时刻蚂蚁 k 从城市 i 转移到城市 j 的概率,其计算公式为:
其中,ηij(t)为启发函数,ηij(t)=1/dij,表示蚂蚁从城市 i 转移到城市 j 的期望,allowk(k=1,2,…,m)为蚂蚁k待访问城市的集合,开始时allowk中有(n-1)个元素,即出去蚂蚁k出发城市的其他所有城市。随着时间的推进allowk中的元素不断减少,直至为空,表示所有的城市均访间完毕。α 为信息素重要程度因子,其值越大表示信息素的浓度在转移中起的影响越大。β 为启发函数重要程度因子,其值越大表示启发函数在转移中的影响越大,蚂蚁会以较大的概率转移到距离短的城市。
在蚂蚁释放信息素的同时,各个城市间连接路径上的信息素也会逐渐消失,设 ρ(0<ρ<1)表示信息素的挥发程度。当所有蚂蚁完成一次循环后,各个城市间连路径上的信息素浓度需进行实时更新:
其中,△τki,j 表示第 k 只蚂蚁在城市 i 与城市 j 连接路径上释放的信息素浓度;△τi,j 表示所蚂蚁在城市 i 与城市 j 连接路径上释放的信息素浓度之和。
针对蚂蚁释放信息素问题,有 3 种不同的模型,分别称之为 ant cycle system、ant quantity systcm 和 ant density system:
- 1.ant cycle system
ant cycle system 模型中,△τki,j 的计算公式为:
Q为常数,表示蚂蚁循环一次所释放的信息素总量,Lk为第 k 只蚂蚁经过路径的长度。利用蚂蚁经过路径的整体信息(经过路径的总长)计算释放的信息素浓度 - 2.ant quantity systcm
利用蚂蚁经过路径的局部信息(经过各个城市间的距离)计算释放的信息素浓度。 - 3.ant density system
只是简单地将信息素释放的浓度取为固定值,没有考虑不同蚂蚁经过路径长短的影响。
3.ACA基本步骤
- 1.初始化参数
种群大小(蚂蚁数) m、信息素重要程度因子 α、启发函数重要程度因子 β、信息素挥发因子 ρ、信息素释放总量 Q、最大选代次数itermax、迭代次数初始值 iter = 1; - 2.构建解空间
将各个蚂蚁随机地置于不同出发点,对每个蚂蚁 k(k=1,2,…,m),计算 Pki,j(t) 来确定其下一个待访问的城市,直到所有蚂蚁访问完所有的城市; - 3.更新信息素
计算各个蚂蚁经过的路径长度 L(=1,2,…,m),记录当前选代次数中的最优解(最短路径),同时对各个城市连接路径上的信息素浓度进行更新; - 4.判断是否终止
若 iter<itermax,则令 iter = iter+1,清空蚂蚁经过路径的记录表,并返回步骤2;否则,输出最优解。
二、算法求解TSP问题🍎
1.导入数据
load citys_data.mat
城市坐标 x y:
citys_data:
1304 2312
3639 1315
4177 2244
3712 1399
3488 1535
3326 1556
3238 1229
4196 1004
4312 790
4386 570
3007 1970
2562 1756
2788 1491
2381 1676
1332 695
3715 1678
3918 2179
4061 2370
3780 2212
3676 2578
4029 2838
4263 2931
3429 1908
3507 2367
3394 2643
3439 3201
2935 3240
3140 3550
2545 2357
2778 2826
2370 2975
2.计算城市间相互距离
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
3.初始化参数
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 = 200; % 最大迭代次数
Route_best = zeros(iter_max,n); % 各代最佳路径
Length_best = zeros(iter_max,1); % 各代最佳路径的长度
Length_ave = zeros(iter_max,1); % 各代路径的平均长度
4.迭代寻找最佳路径
while iter <= iter_max
% 随机产生各个蚂蚁的起点城市
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,清空路径记录表
iter = iter + 1;
Table = zeros(m,n);
end
5.结果显示
[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('各代最短距离与平均距离对比')
最短距离:15828.7082
最短路径:15 14 12 13 11 23 16 4 2 5 6 7 8 9 10 3 18 17 19 24 25 20 21 22 26 28 27 30 31 29 1 15
>>
End
- 采用正反馈机制,使得搜索过程不断收敛,最终逼近最优解。
- 每个个体可以通过释放信息素来改变周围的环境,且每个个体能够感知周围环境的实时变化,个体间通过环境进行间接地通讯。
- 搜索过程采用分布式计算方式,多个个体同时进行并行计算,大大提高了算法的计算能力和运行效率。
- 启发式的概率搜索方式不容易陷入局部最优,易于寻找到全局最优解。
☕物有本末,事有终始,知所先后。🍭
🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓