蚁群算法:
蚁群算法(Ant Colony Optimization,ACO)是一种启发式优化算法,灵感来源于蚂蚁在寻找食物并沿最短路径到达食物源的行为。ACO是基于蚂蚁群体行为的模拟,用于解决组合优化问题,如旅行商问题(TSP)、调度问题、路径规划等。蚁群算法的核心原理包括信息素的表达和更新、路径选择和信息素挥发。蚁群算法在解决离散组合优化问题方面效果显著,尤其对于需要探索大量搜索空间的问题具有较好的适用性。它被广泛应用于路由优化、资源调度、网络优化、基因序列分析等领域。
蚁群算法基本工作流程
*蚁群行为模拟:模拟一群蚂蚁在问题空间中移动。
每只蚂蚁根据信息素和启发式信息选择下一步的移动方向。
信息素更新:蚂蚁在路径上释放信息素。信息素表示路径的好坏程度,一般通过信息素浓度表示路径的吸引力。蚂蚁释放的信息素量与路径质量成正比。
路径选择:蚂蚁根据信息素浓度和启发式信息(可能是距离、路径成本等)来选择下一步的移动方向。蚂蚁更倾向于选择信息素浓度较高的路径,但也会引入一定的随机性以保证探索性。
信息素挥发:信息素在时间中逐渐挥发,以模拟信息素的衰减。这有助于防止算法陷入局部最优,增加对新路径的探索。ACO通过不断的迭代模拟蚂蚁搜索过程,经过多次迭代更新信息素、路径选择,逐步引导蚂蚁群体朝着更优解的方向移动。经过多次迭代后,信息素浓度高的路径将更可能被选择,从而最终达到优化问题的解决。
代码实现:
import numpy as np
#总共6个城市
num_points = 6
distance_matrix = [[1000,3,93,13,33,9],[4,1000,77,42,21,16],[45,17,1000,36,16,28],[39,90,80,1000,56,7],[28,46,88,33,1000,25],[3,88,18,46,92,1000]]# 城市距离
distance_matrix=np.array(distance_matrix)
print("城市间距离:\n",distance_matrix)
def cal_total_distance(routine):
num_points, = routine.shape
#输出的为路径的总值
return sum([distance_matrix[routine[i % num_points], routine[(i + 1) % num_points]] for i in range(num_points)])
n_dim=num_points
max_iter=10 #最大迭代次数
size_pop=10#种群数、蚂蚁数
alpha=1 #信息素
beta=2 #适应度的重要度(启发式信息)
rho=0.1
Tau = np.ones((n_dim, n_dim)) # 信息素矩阵初始化,每代进行更新
Table = np.zeros((size_pop, n_dim)).astype(np.int) # 某一代每个蚂蚁的爬行路径
# print(Table)
y = None # 某一代每个蚂蚁的爬行总距离
generation_best_X, generation_best_Y = [], [] # 记录各代的最佳情况
best_x, best_y = None, None
prob_matrix_distance = 1 / distance_matrix
for i in range(max_iter):
prob_matrix = (Tau ** alpha) * (prob_matrix_distance ** beta)
for j in range(size_pop):
Table[j, 0] = 0
for k in range(n_dim - 1):
taboo_set = set(Table[j, :k + 1])
allow_list = list(set(range(n_dim)) - taboo_set)
prob = prob_matrix[Table[j, k], allow_list]
prob = prob / prob.sum()
next_point = np.random.choice(allow_list, size=1, p=prob)[0]
Table[j, k + 1] = next_point
y = np.array([cal_total_distance(i) for i in Table])
index_best = y.argmin()
x_best, y_best = Table[index_best, :].copy(), y[index_best].copy()
generation_best_X.append(x_best)
generation_best_Y.append(y_best)
delta_tau = np.zeros((n_dim, n_dim))
for j in range(size_pop):
for k in range(n_dim - 1):
n1, n2 = Table[j, k], Table[j, k + 1]
delta_tau[n1, n2] += 1 / y[j]
n1, n2 = Table[j, n_dim - 1], Table[j, 0]
delta_tau[n1, n2] += 1 / y[j]
Tau = (1 - rho) * Tau + delta_tau
best_generation = np.array(generation_best_Y).argmin()
best_x = generation_best_X[best_generation]
best_y = generation_best_Y[best_generation]
print("最好路由,最短距离\n",best_x,best_y)
随机生成50个城市的TSP问题,然后利用公开的代码scikit-opt的函数来使用蚁群算法。
num_points = 50
#总共50个城市
#生成50个点位置
points_coordinate=np.random.rand(num_points, 2)
#该函数用于计算两个输入集合的距离
istance_matrix=spatial.distance.cdist(points_coordinate, points_coordinate, metric='euclidean')
探讨:在ACO中参数α,β,ρ对算法性能的影响。
运行结果如下:下图是alpa为1.β为2
改变α为0.5,beta为1进行实验
改变alpha等于0,beta=1
参数分析:
α是信息启发式因子,α值越大,妈蚁选择之前走过的路径可能性就越大,搜索路径的随机性减弱,α越小,蚁群搜索范围就会减少,容易陷入局部最优。
β是期望启发式因子,β值越大,蚁群就越容易选择局部较短路径,这时算法的收敛速度是加快了,但是随机性却不高,容易得到局部的相对最优。
ρ是信息挥发因子,1-ρ表示残留因子,ρ过小时,在各路径上残留的信息素过多,导致无效的路径继续被搜索,影响到算法的收敛速率; ρ过大,无效的路径虽然可以被排除搜索,但是不能保证有效的路径也会被放弃搜索,影响到最优值的搜索。