上一篇博文中详细介绍了蚁群算法的背景、蚁群算法简介以及蚁群算法与TSP问题求解的问题。在这篇博文中笔者将对TSP问题用蚁群算法求解方法以及不同种类蚁群算法的应用。
1. 算法模型的建立
1.1 数学模型
对于TSP问题,为了不失去一般性,设整个蚂蚁群体中蚂蚁的数量为
m
m
m,城市的数量为
n
n
n,城市
i
i
i与
j
j
j之间的距离为
d
i
j
,
(
i
,
j
=
1
,
2
,
.
.
.
,
n
)
d_{ij},(i,j=1,2,...,n)
dij,(i,j=1,2,...,n),
t
t
t时刻城市
i
i
i与城市
j
j
j连接路径上的信息素浓度为
τ
i
j
(
t
)
\tau_{ij}(t)
τij(t)。在初始的时刻,蚂蚁分布于不同的城市中,且各城市间连接路径上的信息素浓度相同,不妨假设
τ
i
j
(
0
)
=
τ
0
\tau_{ij}(0)=\tau_{0}
τij(0)=τ0。然后蚂蚁将按照一定概率选择路线,不妨设概率的大小为
p
i
j
k
(
t
)
p_{ij}^{k}(t)
pijk(t)为
t
t
t时刻蚂蚁
k
k
k从城市
i
i
i转移到城市
j
j
j的概率。一般定义
p
i
j
k
(
t
)
=
{
[
τ
i
j
(
t
)
]
α
⋅
[
η
i
j
(
t
)
]
β
∑
s
∈
allow
k
[
τ
i
s
(
t
)
]
α
⋅
[
η
i
s
(
t
)
]
β
,
j
∈
allow
k
0
,
j
∉
allow
k
p_{ij}^{k}(t)=\begin{cases} \frac{[\tau_{ij}(t)]^{\alpha}\cdot{[\eta_{ij}(t)]^{\beta}}}{\sum\limits_{s\in\text{allow}_{k}}[\tau_{is}(t)]^{\alpha}\cdot{[\eta_{is}(t)]^{\beta}}}&,j\in{\text{allow}_{k}}\\ 0&,j\notin{\text{allow}_{k}} \end{cases}
pijk(t)=⎩⎨⎧s∈allowk∑[τis(t)]α⋅[ηis(t)]β[τij(t)]α⋅[ηij(t)]β0,j∈allowk,j∈/allowk
其中,
η
i
j
(
t
)
\eta_{ij}(t)
ηij(t)为启发函数,表示蚂蚁从城市
i
i
i转移到城市
j
j
j的期望程度;
allow
k
,
(
k
=
1
,
2
,
.
.
.
,
m
)
\text{allow}_{k},(k=1,2,...,m)
allowk,(k=1,2,...,m)为蚂蚁
k
k
k待访问的城市集合,开始的时候
allow
k
\text{allow}_{k}
allowk中有
n
−
1
n-1
n−1个元素,即包括除了蚂蚁
k
k
k出发城市的其他很多城市,随着算法过程中时间推移
allow
k
\text{allow}_{k}
allowk元素越来越少,直到为空;
α
\alpha
α是信息素重要程度因子(信息素因子),值越大表示信息素影响越大;
β
\beta
β为启发函数重要程度因子(启发函数因子),值越大表明启发函数影响影响越大。
蚂蚁遍历每一个城市过程中,蚂蚁释放信息素的时候,各个城市之间连接路径上信息素强度也在通过挥发的方式逐渐消失。设信息素挥发程度因子为
ρ
\rho
ρ,所以当所有蚂蚁完整遍历过一遍所有城市之后,各个城市之间连接的信息素浓度为
{
τ
i
j
(
t
+
1
)
=
(
1
−
ρ
)
⋅
τ
i
j
(
t
)
+
Δ
τ
i
j
,
0
<
ρ
<
1
Δ
τ
i
j
=
∑
k
=
1
m
Δ
τ
i
j
k
\begin{cases} \tau_{ij}(t+1)=(1-\rho)\cdot{\tau_{ij}(t)}+\Delta\tau_{ij}&,0<\rho<1\\ \Delta\tau_{ij}=\sum\limits_{k=1}^{m}\Delta\tau_{ij}^{k} \end{cases}
⎩⎨⎧τij(t+1)=(1−ρ)⋅τij(t)+ΔτijΔτij=k=1∑mΔτijk,0<ρ<1
其中,
Δ
τ
i
j
k
\Delta\tau_{ij}^{k}
Δτijk是第
k
k
k只蚂蚁在城市
i
i
i与城市
j
j
j连接路径上释放的信息素的增加量。
其中启发函数定义为:
η
i
j
(
t
)
=
1
d
i
j
\eta_{ij}(t)=\frac{1}{d_{ij}}
ηij(t)=dij1
d
i
j
d_{ij}
dij表示城市之间的距离矩阵。
在Ant cycle system 模型中,
Δ
τ
i
j
k
\Delta\tau_{ij}^{k}
Δτijk一般定义为
Δ
τ
i
j
=
{
Q
L
k
,
if Ant k visits city from i to j
0
,
otherwise
\Delta\tau_{ij}=\begin{cases} \frac{Q}{L_{k}}&,\text{if Ant k visits city from i to j}\\ 0&,\text{otherwise} \end{cases}
Δτij={LkQ0,if Ant k visits city from i to j,otherwise
其中,
Q
Q
Q为信息素常数,表示蚂蚁循环一次所释放的信息素总量;
L
k
L_{k}
Lk是第
k
k
k只蚂蚁经过路径的总长度。
在其他的蚁群算法系统中,在TSP问题上对
Δ
τ
i
j
k
\Delta\tau_{ij}^{k}
Δτijk的计算不尽相同。还有两种基本的蚁群算法,即Ant quantity system模型和Ant density system模型。
在 Ant quantity system中,
Δ
τ
i
j
k
\Delta\tau_{ij}^{k}
Δτijk一般定义为:
Δ
τ
i
j
k
\Delta\tau_{ij}^{k}
Δτijk一般定义为
Δ
τ
i
j
=
{
Q
d
i
j
,
if Ant k visits city from i to j
0
,
otherwise
\Delta\tau_{ij}=\begin{cases} \frac{Q}{d_{ij}}&,\text{if Ant k visits city from i to j}\\ 0&,\text{otherwise} \end{cases}
Δτij={dijQ0,if Ant k visits city from i to j,otherwise
d
i
j
d_{ij}
dij是城市
i
i
i和城市
j
j
j之间距离。
在Ant density system模型中,
Δ
τ
i
j
k
\Delta\tau_{ij}^{k}
Δτijk一般定义为:
Δ
τ
i
j
=
{
Q
,
if Ant k visits city from i to j
0
,
otherwise
\Delta\tau_{ij}=\begin{cases} Q&,\text{if Ant k visits city from i to j}\\ 0&,\text{otherwise} \end{cases}
Δτij={Q0,if Ant k visits city from i to j,otherwise
常数 Q Q Q表示蚂蚁一次循环所释放信息素总量。这三种方法主要的区别是,Ant cycle system使用的是整体的信息,后面两种是局部信息,相对来说Ant cycle system在处理TSP问题过程中具有较好的性能,通常作为基本的蚁群模型。
1.2 算法流程
步骤1:对蚁群算法中的相关参数进行初始化处理。参数信息包括有:蚁群的规模(
m
m
m)、信息素因子(
α
\alpha
α)、启发函数因子(
β
\beta
β)、信息素挥发因子(
ρ
\rho
ρ)、信息素常数(
Q
Q
Q)、最大迭代次数(
epoches
)
\text{epoches})
epoches)等等参数信息,另外还包括有程序读入的数据信息。
步骤2:随机将蚂蚁放置于不同出发点,对每一个蚂蚁计算其下一个访问的城市,直到访问完毕所有的城市。
步骤3:计算每个蚂蚁经过的路径长度
L
k
L_{k}
Lk,记录当前迭代次数中的最优解,同时更新各个城市连接路径上的信息素浓度。
步骤4;是否达到迭代次数上限,若是则结束程序,如若否,则返回步骤2,继续求解。
2. 算法具体应用
2.1 TSP问题的求解
数据的准备:我们在这里选取TSP问题数据集TSP问题数据集。在本文中我们选取数据集eil51.tsp进行问题的求解。
在蚂蚁选择下一个城市访问的方法中,我们使用到了轮盘赌算法,它的基本过程如下所示:
(1) 计算每个个体的适应度比例,即每个个体的选择概率
p
(
x
i
)
=
f
(
x
i
)
∑
j
=
1
N
f
(
x
i
)
p(x_{i})=\frac{f(x_{i})}{\sum\limits_{j=1}^{N}f(x_{i})}
p(xi)=j=1∑Nf(xi)f(xi)
(2) 计算每个个体的累积概率,相当于在轮盘中的跨度,跨度越大则被选中的概率越大:
q
i
=
∑
j
=
1
i
f
(
x
j
)
q_{i}=\sum\limits_{j=1}^{i}f(x_{j})
qi=j=1∑if(xj)
也就是每个个体之前所有个体的选择概率之和,相当于概率论中的概率分布函数
F
(
x
)
F(x)
F(x)
(3) 随机生成
r
∈
[
0
,
1
]
r\in{[0,1]}
r∈[0,1],若
q
i
>
r
q_{i}>r
qi>r,则选择个体
x
i
x_{i}
xi。
程序运行之后的结果信息如下所示:
每次迭代过程中平均路径长度的变化如下所示:
由平均路径长度的变化图可知,蚁群算法是趋近于收敛的。程序的结果虽然并不是很好,经过多次训练之后程序结果可能会更佳。笔者将蚁群算法用python版本和MATLAB版本进行的实现,具体代码可以查找笔者github。
2.2 参数的选择
一般来说,参数的选择遵循以下的原则:
(1) 尽可能在全局上搜索最优解,用以保证解的最优性质;
(2) 算法尽快收敛,节约寻优的时间;
(3) 尽量反应出客观的存在规律,以保证这种仿生算法的真实性。
蚂蚁数量的选择:蚂蚁数量取决于问题规模的大小形式。一般来说,城市的数量
M
M
M和蚂蚁的数量
m
m
m应该适当均衡,参数
m
m
m太大,会使得被搜索过的路径上的信息素变化趋近于平均,正反馈作用减弱,以导致收敛速度减慢;反之,处理较大问题时候,容易使得未被搜索到的路径信息素量减小到
0
0
0,使得程序过早出现停滞现象,从而使得全局优化型降低。
信息素因子:它反映出了蚂蚁在运动过程中所积累的信息量在指导蚂蚁群搜索中的相对重要程度,它的值越大,那么在之前走过的路径可能性就会越大,搜索的随机性减弱;其值过小,则等同于贪婪算法,容易陷入局部最优情况。一般情况下选择
α
∈
[
1
,
4
]
\alpha\in{[1,4]}
α∈[1,4]。
启发函数因子:启发函数因子
β
\beta
β,反应出的是启发式信息在指导蚁群算法过程中的重要程度,它的值反映了蚁群寻优过程中的先验性、确定性因素作用的强度。一般来说选择
β
∈
[
3
,
4.5
]
\beta\in{[3,4.5]}
β∈[3,4.5]。
信息素挥发因子:反映出信息素挥发消失的水平,
(
1
−
ρ
)
(1-\rho)
(1−ρ)表达的是信息素残留因子,描述信息素保持的水平大小。一般情况下选择
ρ
∈
[
0.2
,
0.5
]
\rho\in{[0.2,0.5]}
ρ∈[0.2,0.5]。
信息素常量:常数
Q
Q
Q是信息素常量,表示的是蚂蚁在循环一周的时候释放在路径上的信息素总量。一般选取
Q
∈
[
10
,
1000
]
Q\in{[10,1000]}
Q∈[10,1000]。
3. 小结
本小结详细讲述了蚁群算法在TSP问题中的具体应用。需要注意的是,蚁群算法在不同方面的应用和使用,以保证蚁群算法的实用性和可靠性。