文章目录
蚁群优化算法(Ant Colony Optimization, ACO)
1. 简介
蚁群算法通过模拟蚂蚁觅食的过程,是一种天然的解决离散组合优化问题的方法,在解决典型组合优化问
题,如:
- 旅行商问题(TSP ) 、
- 车辆路径问题( VRP ) 、
- 车间作业调度问题( CJSP)
时具有明显的优越性,由Dorigo 等人于1 991 年在第一届欧洲人丁生命会议( European Conference on Artificial Intelligence , ECAL) 上提出
1.1 信息素
蚂蚁在寻找食物的过程中往往是随机选择路径的, 但它们能感知当前地面上的信息素浓度,并倾向于往信息素浓度高的方向行进。
每只蚂蚁
- 路径选择:某一个路的信息浓度越大,越有大的概率选择路径
- 路径长了:减少信息素的产生,使得后面的蚂蚁有比较小的概率选择这个路径
- 路径短了(更好的解):增加信息素的产生,使得后面的蚂蚁有更大的概率选择这个路径
1.2 基本定义对照
蚁群觅食现象 | 蚁群优化算法 |
---|---|
蚁群 | 搜索空间的一组有效解(表现为种群规模m) |
觅食空间 | 问题的搜索空间(表现为问题的规模、解的维数n) |
信息素 | 信息素浓度变量 |
蚁巢到食物的一条路径 | 一个有效解 |
找到的最短路径 | 问题的最优解 |
2. 基本流程
AS 算法对TSP 的求解流程主要有两大步骤: 路径构建和信息素更新。
我们以TSP的求解路径作为问题样例
2.1 路径构建
p k ( i , j ) = { [ τ ( i , j ) ] α [ η ( i , j ) ] β ∑ r ∈ J k ( i ) [ τ ( i , u ) ] ∗ [ η ( i , u ) ] β , j ∈ J k ( i ) 0 , 其他 p_k(i, j)= \begin{cases}\frac{[\tau(i, j)]^\alpha[\eta(i, j)]^\beta}{\sum_{\mathrm{r} \in J_k(i)}[\tau(i, u)]^*[\eta(i, u)]^\beta}, & j \in J_k(i) \\ 0, & \text { 其他 }\end{cases} pk(i,j)=⎩ ⎨ ⎧∑r∈Jk(i)[τ(i,u)]∗[η(i,u)]β[τ(i,j)]α[η(i,j)]β,0,j∈Jk(i) 其他
其中,
J
k
(
i
)
J_k(i)
Jk(i)表示从城市t 可以直接到达的且又不在蚂蚁访问过的城市序列
R
k
R_k
Rk中的城市集合。
η
(
i
,
j
)
\eta(i, j)
η(i,j) 是一个启发式信息, 通常由
η
(
i
,
j
)
=
1
/
d
i
j
\eta(i, j)=1 / d_{i j}
η(i,j)=1/dij, 直接计算。
r
(
i
,
j
)
表示边
(
i
,
j
)
r(i , j) 表示边(i, j)
r(i,j)表示边(i,j)
上的信息素量。
长度越短、信息素浓度越大的路径被蚂蚁选择的概率越大。 α 和 β \alpha和\beta α和β是两个预先设置的参数, 用来控制启发式信息与信息素浓度作用的权重关系。
- 当 α = 0 \alpha = 0 α=0时, 算法演变成传统的随机贪婪算法, 最邻近城市被选中的概率最大。(与路径有关)
- 当 β = 0 \beta = 0 β=0时,蚂蚁完全只根据信息素浓度确定路径,算法将快速收敛,这样构建出的最优路径往往与实际目标有着较大的差异, 算法的性能比较糟糕。(与信息素含量有关)
- 实验表明,在AS 中设置 α = 1 , β = 2 5 \alpha = 1, \beta = 2~5 α=1,β=2 5比较合适。
2.2 信息素更新
在算法初始化时,问题空间中所有的边上的信息素都被初始化为 τ 0 \tau_0 τ0
- 如果 τ 0 \tau_0 τ0太小,算法容易早熟
- 如果 τ 0 \tau_0 τ0太大,信息素对搜索方向的指导作用太低,也会影响算法性能
一般来说,我们设置
τ
0
=
m
/
C
n
n
\tau_0=m / C^{nn}
τ0=m/Cnn
- m 是蚂蚁的个数
- C n n C^{nn} Cnn是由贪婪算法构造的路径的长度
信息素蒸发
首先, 每一轮过后,问题空间中的所有路径上的信息素都会发生蒸发,我们为所有边上的信息素乘上一个小于1 的常数
AS 中城市t 与城市)的相连边上的信息素 τ ( i , j ) \tau(i, j) τ(i,j)按如下公式进行更新:
τ
(
i
,
j
)
=
(
1
−
ρ
)
⋅
τ
(
i
,
j
)
+
∑
k
=
1
m
Δ
τ
k
(
i
,
j
)
Δ
τ
k
(
i
,
j
)
=
{
(
C
k
)
−
1
,
(
i
,
j
)
∈
R
k
0
,
其他
\begin{aligned} &\tau(i, j)=(1-\rho) \cdot \tau(i, j)+\sum_{k=1}^m \Delta \tau_k(i, j) \\ &\Delta \tau_k(i, j)= \begin{cases}\left(C_k\right)^{-1}, & (i, j) \in R^k \\ 0, & \text { 其他 }\end{cases} \end{aligned}
τ(i,j)=(1−ρ)⋅τ(i,j)+k=1∑mΔτk(i,j)Δτk(i,j)={(Ck)−1,0,(i,j)∈Rk 其他
下面是AS求解TSP问题的伪代码流程图
//功能: 蚂蚁系统伪代码
//说明:本例以求解 TSP 问题为目标
// 参数 : N 为城市规模
procedure AS
for each edge
set initial pheromone value tau_0
end for
while not stop
for each ant k
randomly choose an initial city.
for i=1 to n
choose next city j with the probability
end for
end for
compute the length C_k of the tour onstructed
by the kth ant.
for each edge
update the pheromone value
end for
end while
print result.
end procedure
2.3 路径构建方式
2.3.1 顺序构建
当一只蚂蚁完成一轮完整的构建并返回到初始城市之后, 下一只蚂蚁才开始构建;
2.3.2 并行构建
所有蚂蚁同时开始构建,每次所有蚂蚁各走一步(从当前城市移动到下一个城市)
3. 蚁群算法的改进
3.1 精华蚂蚁系统
答案是肯定的, 精华蚂蚁系统( Elitist Ant System, EAS) 是对基础AS 的第一次改进, 它在原AS 信息素更新原则的基础上增加了一个对至今最优路径的强化手段。在每轮信息素更新完毕后,搜索到至今最优路径的那只蚂蚁将会为这条路径添加额外的信息素。
τ ( i , j ) = ( 1 − ρ ) ⋅ τ ( i , j ) + ∑ k = 1 ∞ Δ τ k ( i , j ) + e Δ b ( i , j ) Δ τ k ( i , j ) = { ( C k ) − 1 , ( i , j ) ∈ R k 0 , 其他 Δ τ b ( i , j ) = { ( C b ) − 1 , ( i , j ) 在路径 T b 上. 0 , 其他 \begin{aligned} &\tau(i, j)=(1-\rho) \cdot \tau(i, j)+\sum_{k=1}^{\infty} \Delta \tau_k(i, j)+e \Delta_b(i, j) \\ &\Delta \tau_k(i, j)= \begin{cases}\left(C_k\right)^{-1}, & (i, j) \in R^k \\ 0, & \text { 其他 }\end{cases} \\ &\Delta \tau_b(i, j)= \begin{cases}\left(C_b\right)^{-1}, & (i, j) \text { 在路径 } T_b \text { 上. } \\ 0, & \text { 其他 }\end{cases} \end{aligned} τ(i,j)=(1−ρ)⋅τ(i,j)+k=1∑∞Δτk(i,j)+eΔb(i,j)Δτk(i,j)={(Ck)−1,0,(i,j)∈Rk 其他 Δτb(i,j)={(Cb)−1,0,(i,j) 在路径 Tb 上. 其他
3.2 基于排列的蚂蚁系统
只有生成了至今最优路径的蚂蚁和排名在前(w - 1) 的蚂蚁才被允许释放信息素,蚂蚁在边 ( i , j ) (i,j) (i,j)上释放的信息素 Δ τ k ( i , j ) \Delta \tau_k(i, j) Δτk(i,j)的权值由蚂蚁的排名决定
τ ( i , j ) = ( 1 − ρ ) ⋅ τ ( i , j ) + ∑ k = 1 ω − 1 ( ω − k ) Δ τ k ( i , j ) + ω Δ b ( i , j ) Δ τ k ( i , j ) = { ( C k ) − 1 , ( i , j ) ∈ R k 0 , 其他 Δ τ b ( i , j ) = { ( C b ) − 1 , ( i , j ) 在路径 T b 上 0 , 其他 \begin{aligned} &\tau(i, j)=(1-\rho) \cdot \tau(i, j)+\sum_{k=1}^{\omega-1}(\omega-k) \Delta \tau_k(i, j)+\omega \Delta_b(i, j) \\ &\Delta \tau_k(i, j)= \begin{cases}\left(C_k\right)^{-1}, & (i, j) \in R^k \\ 0, & \text { 其他 }\end{cases} \\ &\Delta \tau_b(i, j)= \begin{cases}\left(C_b\right)^{-1}, & (i, j) \text { 在路径 } T_b \text { 上 } \\ 0, & \text { 其他 }\end{cases} \end{aligned} τ(i,j)=(1−ρ)⋅τ(i,j)+k=1∑ω−1(ω−k)Δτk(i,j)+ωΔb(i,j)Δτk(i,j)={(Ck)−1,0,(i,j)∈Rk 其他 Δτb(i,j)={(Cb)−1,0,(i,j) 在路径 Tb 上 其他
3.3 最大最小蚂蚁系统
在基本AS 算法的基础上进行了下列四项改进。
- 只允许迭代最优蚂蚁(在本次迭代构建出最短路径的蚂蚁) , 或者至今最优蚂蚁释放信息素。
- 信息素量大小的取值范围被限制在一个区间内。
- 信息素初始值为信息素取值区间的上限, 并伴随一个较小的信息素蒸发速率。
- 每当系统进入停滞状态, 问题空间内所有边上的信息素量都会被重新初始化。
注意迭代最优和至今最优的区别
- 只使用至今最优更新规则进行信息素的更新, 搜索的导向性很强, 算法会很快收敛到 T b T_b Tb附近
- 只使用迭代最优更新规则,则算法的探索能力会得到增强,但收敛速度会下降。
在MMAS 中,当算法接近或是进入停滞状态时,问题空间内所有边上的信息素浓度都将被重新初始化,从而有效地利用系统进入停滞状态后的迭代周期继续进行搜索,使算法具有更强的全局寻优能力
4. 蚁群系统 Ant Colony System, ACS
与蚂蚁系统的不同点:
- 使用一种伪随机比例规则(pseudorandom proportional) 选择下一城市节点
- 信息素全局更新规则只在属于至今最优路径的边上蒸发和释放信息素
- 新增信息素局部更新规则
4.1 状态转移规则
蚂蚁k从当前城市,访问下一城市的概率为 j = { arg max j ∈ J k ( i ) { [ τ ( i , j ) ] , [ η ( i , j ) ] β } , q ⩽ q 0 S , 其他 j= \begin{cases}\arg \max _{j \in J_k(i)}\left\{[\tau(i, j)],[\eta(i, j)]^\beta\right\}, & q \leqslant q_0 \\ S, & \text { 其他 }\end{cases} j={argmaxj∈Jk(i){[τ(i,j)],[η(i,j)]β},S,q⩽q0 其他
蚂蚁选择当前最优移动方向的概率为
q
0
q_0
q0,同时,蚂蚁以
(
1
−
q
0
)
(1-q_0)
(1−q0)的概率有偏向地搜索各条边。
我们通常将
q
>
q
0
q>q_0
q>q0时的算法执行方式称为偏向探索
p k ( i , j ) = { [ τ ( i , j ) ] [ η ( i , j ) ] β ∑ u ∈ J k ( i ) [ τ ( i , u ) ] [ η ( i , u ) ] β , j ∈ J k ( i ) 0 , 其他 p_k(i, j)= \begin{cases}\frac{[\tau(i, j)][\eta(i, j)]^\beta}{\sum_{u \in J_k(i)}[\tau(i, u)][\eta(i, u)]^\beta}, & j \in J_k(i) \\ 0, & \text { 其他 }\end{cases} pk(i,j)=⎩ ⎨ ⎧∑u∈Jk(i)[τ(i,u)][η(i,u)]β[τ(i,j)][η(i,j)]β,0,j∈Jk(i) 其他
4.2 全局更新规则
全局更新规则,对于全局最优路径,全部更新一次信息素,且只对全局最优路径的信息素进行更新,与AS不同,其他非最优的路径则不进行更新
更新公式如下:
τ ( i , j ) = ( 1 − ρ ) ⋅ τ ( i , j ) + ρ ⋅ Δ τ b ( i , j ) , ∀ ( i , j ) ∈ T b \tau(i, j)=(1-\rho) \cdot \tau(i, j)+\rho \cdot \Delta \tau_b(i, j), \quad \forall(i, j) \in T_b τ(i,j)=(1−ρ)⋅τ(i,j)+ρ⋅Δτb(i,j),∀(i,j)∈Tb
4.3 局部更新规则
每一个蚂蚁经过每个边都会更新该边的信息素
更新公式如下:
τ
(
i
,
j
)
=
(
1
−
ξ
)
⋅
τ
(
i
,
j
)
+
ξ
⋅
τ
0
\tau(i, j)=(1-\xi) \cdot \tau(i, j)+\xi \cdot \tau_0
τ(i,j)=(1−ξ)⋅τ(i,j)+ξ⋅τ0
ξ
\xi
ξ为取值为0.1时,
τ
0
\tau_0
τ0取值为
1
/
(
n
C
n
n
)
1 /\left(n C^{nn}\right)
1/(nCnn)算法对大多数实例有着非常好的性能。
计算出来的更新后的信息素相比更新前减少了, 也就是说, 信息素局部更新规则作用于某条边上会使得这条边被其他蚂蚁选中的概率减少。这种机制大大增加了算法的探索能力, 后续蚂蚁倾向于探索未被使用过的边, 有效地避免了算法进入停滞状态。
5. 蚁群算法的其他改进版本
- 近似非确定性树搜索( Approximate Nondeterministic Tree Search, ANTS)
- 多态蚁群算法( Polymorphic Ant Colony Algorithm,PACA)
- 带聚类处理的蚁群算法( Clustering Processing Ant Colony Algorithm, CP ACA)
- 连续正交蚁群算法( Continuous Orthogonal Ant Colony, COAC)
写在最后
各位看官,都看到这里了,麻烦动动手指头给博主来个点赞8,您的支持作者最大的创作动力哟!
才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位作为学习交流之用,不作任何商业用途,若涉及版权问题请速与作者联系,望悉知