一、概念
蚁群算法是一种启发式群体智能优化算法,灵感来源于自然界中蚂蚁群体的觅食行为:
- 蚂蚁在觅食时会分泌一种称为"信息素(Pheromone)"的化学物质,并倾向于选择信息素浓度高的路径;
- 短路径上的蚂蚁往返时间短,信息素积累更快;长路径上的信息素因挥发而浓度低;
- 通过这种"信息素正反馈"机制,蚂蚁群体最终会集中到最优(最短)路径上。
蚁群算法主要用于解决组合优化问题(如旅行商问题TSP、路径规划、调度问题等),其核心是模拟信息素的分泌、挥发和群体决策过程。
二、核心理论
蚁群算法的工作流程基于"信息素引导-路径选择-信息素更新"的循环,核心机制包括:
- 路径构建:每个蚂蚁从起点出发,根据路径上的信息素浓度和路径本身的启发信息(如距离),概率性地选择下一个节点(需满足问题约束,如TSP中不重复访问城市)。
- 信息素更新 :所有蚂蚁完成一次路径构建后,对路径上的信息素进行更新:
- 挥发:所有路径上的信息素按比例减少(避免信息素无限积累,增强算法探索性);
- 沉积:蚂蚁根据自身路径的优劣(如长度)在走过的路径上分泌信息素(优质路径沉积更多,强化正反馈)。
- 迭代优化:重复"路径构建-信息素更新"过程,直到找到满意解或达到最大迭代次数。
三、数学公式
以经典的旅行商问题(TSP) 为例(目标:寻找访问所有城市且总距离最短的回路),定义如下符号:
- n n n:城市数量;
- m m m:蚂蚁数量;
- τ i j ( t ) \tau_{ij}(t) τij(t): t t t 时刻城市 i i i 到城市 j j j 的信息素浓度;
- η i j \eta_{ij} ηij:启发式信息(通常为距离的倒数, η i j = 1 / d i j \eta_{ij} = 1/d_{ij} ηij=1/dij, d i j d_{ij} dij 是城市 i i i 到 j j j 的距离);
- a l l o w e d k allowed_k allowedk:蚂蚁 k k k 尚未访问的城市集合;
- L k L_k Lk:蚂蚁 k k k 构建的路径总长度。
1. 路径选择概率
在 t t t 时刻,蚂蚁 k k k 从城市 i i i 转移到未访问城市 j j j 的概率为:
p i j k ( t ) = { [ τ i j ( t ) ] α ⋅ [ η i j ] β ∑ l ∈ a l l o w e d k [ τ i l ( t ) ] α ⋅ [ η i l ] β if j ∈ a l l o w e d k 0 otherwise p_{ij}^k(t) = \begin{cases} \frac{[\tau_{ij}(t)]^\alpha \cdot [\eta_{ij}]^\beta}{\sum_{l \in allowed_k} [\tau_{il}(t)]^\alpha \cdot [\eta_{il}]^\beta} & \text{if } j \in allowed_k \\ 0 & \text{otherwise} \end{cases} pijk(t)=⎩ ⎨ ⎧∑l∈allowedk[τil(t)]α⋅[ηil]β[τij(t)]α⋅[ηij]β0if j∈allowedkotherwise
- α \alpha α:信息素重要度因子( α ≥ 0 \alpha \geq 0 α≥0),控制信息素对路径选择的影响( α \alpha α 越大,蚂蚁越依赖信息素);
- β \beta β:启发式信息重要度因子( β ≥ 0 \beta \geq 0 β≥0),控制距离对路径选择的影响( β \beta β 越大,蚂蚁越倾向于选择短路径)。
2. 信息素更新
所有蚂蚁完成路径构建后(迭代 t → t + 1 t \to t+1 t→t+1),信息素更新分为两步:
(1)信息素挥发
所有路径上的信息素按固定比例 ρ \rho ρ( 0 < ρ < 1 0 < \rho < 1 0<ρ<1,挥发系数)减少:
τ i j ( t + 1 ) = ( 1 − ρ ) ⋅ τ i j ( t ) \tau_{ij}(t+1) = (1 - \rho) \cdot \tau_{ij}(t) τij(t+1)=(1−ρ)⋅τij(t)
(2)信息素沉积
每个蚂蚁 k k k 在其路径上沉积信息素,沉积量与路径长度成反比:
τ i j ( t + 1 ) = τ i j ( t + 1 ) + ∑ k = 1 m Δ τ i j k \tau_{ij}(t+1) = \tau_{ij}(t+1) + \sum_{k=1}^m \Delta \tau_{ij}^k τij(t+1)=τij(t+1)+k=1∑mΔτijk
其中, Δ τ i j k \Delta \tau_{ij}^k Δτijk 为蚂蚁 k k k 在路径 i → j i \to j i→j 上的信息素沉积量:
Δ τ i j k = { Q L k if 蚂蚁 k 经过路径 i → j 0 otherwise \Delta \tau_{ij}^k = \begin{cases} \frac{Q}{L_k} & \text{if 蚂蚁 } k \text{ 经过路径 } i \to j \\ 0 & \text{otherwise} \end{cases} Δτijk={LkQ0if 蚂蚁 k 经过路径 i→jotherwise
- Q Q Q:信息素总量常数( Q > 0 Q > 0 Q>0),控制单次沉积的信息素规模;
- L k L_k Lk 越小(路径越优), Δ τ i j k \Delta \tau_{ij}^k Δτijk 越大,优质路径的信息素浓度增长越快。
四、算法流程与推导逻辑
蚁群算法的流程设计基于对蚂蚁觅食行为的模拟,核心逻辑推导如下:
-
初始化:
- 设定参数:蚂蚁数量 m m m、 α \alpha α、 β \beta β、 ρ \rho ρ、 Q Q Q、最大迭代次数 N max N_{\text{max}} Nmax;
- 初始化信息素矩阵:通常令 τ i j ( 0 ) = τ 0 \tau_{ij}(0) = \tau_0 τij(0)=τ0(常数,如 τ 0 = m / Q \tau_0 = m/Q τ0=m/Q),确保初始时所有路径信息素浓度相同。
-
路径构建逻辑:
- 每个蚂蚁随机选择起点,通过式(1)的概率分布选择下一个城市(未访问过),直到遍历所有城市并返回起点,形成闭合路径。
- 概率公式的设计理由:平衡"信息素引导"(历史经验)和"启发式信息"(局部短路径),避免算法过早收敛到局部最优或陷入随机搜索。
-
信息素更新逻辑:
- 挥发机制(式2):防止信息素无限积累,使算法能"遗忘"较差路径,保留探索新路径的能力;
- 沉积机制(式3-4):优质路径(短 L k L_k Lk)获得更多信息素,强化正反馈,引导后续蚂蚁向优路径聚集。
-
迭代终止:
- 当迭代次数达到 N max N_{\text{max}} Nmax,或最优路径长度连续多轮不再改善时,输出当前最优路径。
五、Python实现(解决TSP问题)
以"中国31个城市坐标"为例,实现基本蚁群算法:
python
import numpy as np
import matplotlib.pyplot as plt
# 1. 数据准备:中国31个城市坐标(简化版,仅列出部分)
cities = np.array([
[1304, 2312], [3639, 1315], [4177, 2244], [3712, 1399], [3488, 1535],
[3326, 1556], [3238, 1229], [4196, 1044], [4312, 790], [4386, 570],
# 省略其他21个城市坐标,完整数据可自行补充
])
n_cities = cities.shape[0] # 城市数量
# 2. 初始化参数
m = 30 # 蚂蚁数量
alpha = 1.0 # 信息素重要度
beta = 2.0 # 启发式信息重要度
rho = 0.1 # 挥发系数
Q = 1000 # 信息素总量
max_iter = 100 # 最大迭代次数
# 距离矩阵(d_ij:城市i到j的距离)
d = np.zeros((n_cities, n_cities))
for i in range(n_cities):
for j in range(n_cities):
d[i, j] = np.linalg.norm(cities[i] - cities[j])
# 启发式信息(η_ij = 1/d_ij,避免除零)
eta = 1 / (d + 1e-10)
# 初始化信息素矩阵
tau = np.ones((n_cities, n_cities)) * 0.1 # τ_0 = 0.1
# 3. 蚁群算法主循环
best_length = float('inf') # 最优路径长度
best_path = None # 最优路径
for iter in range(max_iter):
# 记录每个蚂蚁的路径和长度
paths = [] # 路径:每个元素是蚂蚁的访问顺序(如[0, 3, 1, ..., 0])
lengths = [] # 对应路径的长度
for k in range(m):
# 蚂蚁k的路径构建
path = []
visited = set() # 已访问城市
current = np.random.randint(n_cities) # 随机起点
path.append(current)
visited.add(current)
# 访问剩余城市
while len(visited) < n_cities:
# 计算当前城市到未访问城市的转移概率
current_city = path[-1]
allowed = [j for j in range(n_cities) if j not in visited]
# 分子:τ^α * η^β
prob_numerator = [tau[current_city, j]**alpha * eta[current_city, j]** beta for j in allowed]
# 概率归一化
prob = prob_numerator / np.sum(prob_numerator)
# 按概率选择下一个城市
next_city = np.random.choice(allowed, p=prob)
path.append(next_city)
visited.add(next_city)
# 返回起点,形成闭合路径
path.append(path[0])
paths.append(path)
# 计算路径长度
length = 0
for i in range(n_cities):
length += d[path[i], path[i+1]]
lengths.append(length)
# 更新全局最优
if length < best_length:
best_length = length
best_path = path
# 信息素更新:先挥发,再沉积
# 挥发
tau = (1 - rho) * tau
# 沉积
for k in range(m):
path = paths[k]
length = lengths[k]
for i in range(n_cities):
u = path[i]
v = path[i+1]
tau[u, v] += Q / length # 双向更新(对称TSP)
tau[v, u] += Q / length
# 打印迭代信息
if (iter + 1) % 10 == 0:
print(f"迭代 {iter+1}/{max_iter},当前最优长度:{best_length:.2f}")
# 4. 可视化最优路径
plt.figure(figsize=(8, 6))
plt.scatter(cities[:, 0], cities[:, 1], c='red', label='城市')
best_path_coords = cities[best_path]
plt.plot(best_path_coords[:, 0], best_path_coords[:, 1], 'b-', label='最优路径')
plt.title(f'蚁群算法求解TSP(最优长度:{best_length:.2f})')
plt.legend()
plt.show()
六、sklearn中的使用说明
蚁群算法属于优化算法 ,主要用于组合优化、参数寻优等问题,而sklearn是专注于机器学习模型的库,未直接集成蚁群算法。
若需在机器学习中结合蚁群算法(如特征选择、超参数优化),可通过以下方式实现:
- 特征选择:用蚁群算法寻找最优特征子集(将特征视为"城市",特征间的相关性或重要性视为"距离");
- 超参数优化:将超参数空间映射为"城市",用蚁群算法搜索最优超参数组合。
替代工具 :专门的优化库如 DEAP(分布式进化算法库)、Optuna(超参数优化框架)支持蚁群算法或类似的启发式优化方法。
七、总结
- 优点:鲁棒性强(对初值不敏感)、全局搜索能力强(通过群体协作和正反馈)、适合解决复杂组合优化问题。
- 缺点 :收敛速度较慢(需多次迭代)、参数敏感( α \alpha α、 β \beta β、 ρ \rho ρ 需调优)、对高维问题效率低。
- 适用场景:旅行商问题(TSP)、车辆路径规划(VRP)、网络路由优化、调度问题等组合优化领域。