基本蚁群算法
参考:https://blog.csdn.net/liuxin0108/article/details/115936358
蚁群算法实际上是正反馈原理和启发式算法相结合的一种算法。在选择路径时,蚂蚁不仅利用了路径上的信息素,而且用到了城市间距离的倒数作为启发式因子。实验结果表明,ant-cycle 模型比 ant-quantity 和 ant-density 模型有更好的性能。这是因为 ant-cycle 模型利用全局信息更新路径上的信息素量,而 ant-quantity 和 ant-density 模型使用局部信息。
基本流程
(1)参数初始化
(2)循环次数 Nc=Nc+1
(3)蚂蚁的禁忌表索引号 k = 1。
(4)蚂蚁数目 k = k + 1。
(5)蚂蚁个体根据状态转移概率公式(1)计算的概率选择元素 j 并前进,j∈Jk(i)j∈Jk(i)。
(6)修改禁忌表指针,即选择好之后将蚂蚁移动到新的元素,并把该元素移动到该蚂蚁个体的禁忌表中。
(7)若集合 C 中元素未遍历完,即 k < m,则跳转到第(4)步;否则执行第(8)步。
(8)记录本次最佳路线。
(9)根据式(2)和式(3)更新每条路径上的信息量。
(10)若满足结束条件,即如果循环次数 Nc≥GNc≥G ,则循环结束并输出程序优化结果;否则清空禁忌表并跳转到第(2)步。
蚁群算法的运算流程如下图所示:
关键参数说明
在蚁群算法中,不仅信息素和启发函数乘积以及蚂蚁之间的合作行为会严重影响到算法的收敛性,蚁群算法的参数也是影响其求解性能和效率的关键因素。信息素启发式因子 α、期望启发因子 β、信息素蒸发系数 ρ、信息素强度 Q、蚂蚁数目 m 等都是非常重要的参数,其选取方法和选取原则直接影响到蚁群算法的全局收敛性和求解效率。
信息素启发式因子 α
信息素启发式因子 α 代表信息量对是否选择当前路径的影响程度,即反映蚂蚁在运动过程中所积累的信息量在指导蚁群搜索中的相对重要程度。α 的大小反映了蚁群在路径搜索中随机性因素作用的强度,其值越大,蚂蚁在选择以前走过的路径的可能性就越大,搜索的随机性就会减弱;而当启发式因子 α 的值过小时,则易使蚁群的搜索过早陷于局部最优。根据经验,信息素启发式因子 α 取值范围一般为 [1,4] 时,蚁群算法的综合求解性能较好。
期望启发因子 β
期望启发因子 β 表示在搜索时路径上的信息素在指导蚂蚁选择路径时的向导性,它的大小反映了蚁群在搜索最优路径的过程中的先验性和确定性因素的作用强度。期望启发因子 β 的值越大,蚂蚁在某个局部点上选择局部最短路径的可能性就越大,虽然这个时候算法的收敛速度得以加快,但蚁群搜索最优路径的随机性减弱,而此时搜索易于陷入局部最优解。根据经验,期望启发因子 β 取值范围一般为 [3,5] 时,蚁群算法的综合求解性能较好。
实际上,信息素启发式因子 α 和期望启发因子 β 是一对关联性很强的参数:蚁群算法的全局寻优性能,首先要求蚁群的搜索过程必须要有很强的随机性;而蚁群算法的快速收敛性能,又要求蚁群的搜索过程必须要有较高的确定性。因此,两者对蚁群算法性能的影响和作用是相互配合、密切相关的,算法要获得最优解,就必须在这二者之间选取一个平衡点,只有正确选定它们之间的搭配关系,才能避免在搜索过程中出现过早停滞或陷入局部最优等情况的发生。
信息素蒸发系数 ρ
蚁群算法中的人工蚂蚁是具有记忆功能的,随着时间的推移,以前留下的信息素将会逐渐消逝,蚁群算法与其他各种仿生进化算法一样,也存在着收敛速度 慢、容易陷入局部最优解等缺陷,而信息素蒸发系数 ρ 大小的选择将直接影响到整个蚁群算法的收敛速度和全局搜索性能。在蚁群算法的抽象模型中,ρ 表示信息素蒸发系数,1 - ρ 则表示信息素持久性系数。因此,ρ 的取值范围应该是 0~1 之间的一个数,表示信息素的蒸发程度,它实际上反映了蚂蚁群体中个体之间相互影响的强弱。ρ 过小时,则表示以前搜索过的路径被再次选择的可能性过大,会影响到算法的随机性能和全局搜索能力;ρ 过大时,说明路径上的信息素挥发的相对变多,虽然可以提高算法的随机搜索性能和全局搜索能力,但过多无用搜索操作势必会降低算法的收敛速度
蚂蚁数目 m
蚁群算法是一种随机搜索算法,与其他模拟进化算法一样,通过多个候选解组成的群体进化过程来寻求最优解,在该过程中不仅需要每个个体的自适应能力,更需要群体之间的相互协作能力。蚁群在搜索过程中之所以表现出复杂有序的行为,是因为个体之间的信息交流与相互协作起着至关重要的作用。
对于旅行商问题,单个蚂蚁在一次循环中所经过的路径,表现为问题可行解集中的一个解,m 只蚂蚁在一次循环中所经过的路径,则表现为问题解集中的一个子集。显然,子集增大(即蚂蚁数量增多),可以提高蚁群算法的全局搜索能力以及算法的稳定性;但蚂蚁数目增大后,会使大量的曾被搜索过的解(路径)上的信息素的变化趋于平均,信息正反馈的作用不明显,虽然搜索的随机性得到了加强,但收敛速度减慢;反之,子集较小(蚂蚁数量少),特别是当要处理的问题规模比较大时,会使那些从来未被搜索到的解(路径)上的信息素减小到接近于 0,搜索的随机性减弱,虽然收敛速度加快了,但会使算法的全局性能降低,算法的稳定性差,容易出现过早停滞现象。m 一般取 10~50。
信息素强度 Q 对算法性能的影响
在蚁群算法中,各个参数的作用实际上是紧密联系的,其中对算法性能起着主要作用的是信息启发式因子 α、期望启发式因子 β 和信息素挥发因子 ρ 这三个参数,总信息量 Q 对算法性能的影响有赖于上述三个参数的选取,以及算法模型的选取。例如,在 ant-cycle 模型和 ant-quantity 模型中,总信息量 Q 所起的作用显然是有很大差异的,即随着问题规模的不同,其影响程度也将不同。相关人员研究结果表明:总信息量 Q 对 ant-cycle 模型蚁群算法的性能没有明显的影响。因此,在算法参数的选择上,参数 Q 不必作特别的考虑,可以任意选取。
最大进化代数 G
最大进化代数 G 是表示蚁群算法运行结束条件的一个参数,表示蚁群算法运行到指定的进化代数之后就停止运行,并将当前群体中的最佳个体作为所求问题的最优解输出。一般 G 取 100~500。
Python代码实现
scikit-opt库直接调用
这里作为demo,随机生成距离矩阵. 实战中从真实数据源中读取。
import numpy as np
from scipy import spatial
import matplotlib.pyplot as plt
num_points = 50
points_coordinate = np.random.rand(num_points, 2) # generate coordinate of points
distance_matrix = spatial.distance.cdist(points_coordinate, points_coordinate, metric='euclidean')
def cal_total_distance(routine):
'''The objective function. input routine, return total distance.
cal_total_distance(np.arange(num_points))
'''
num_points, = routine.shape
return sum([distance_matrix[routine[i % num_points], routine[(i + 1) % num_points]] for i in range(num_points)])
from sko.ACA import ACA_TSP
aca = ACA_TSP(func=cal_total_distance, n_dim=num_points,
size_pop=50, max_iter=200,
distance_matrix=distance_matrix)
best_points, best_distance = aca.run()
print(best_points)
print(best_distance)
fig, ax = plt.subplots(1, 2)
best_points_ = np.concatenate([best_points, [best_points[0]]])
best_points_coordinate = points_coordinate[best_points_, :]
ax[0].plot(best_points_coordinate[:, 0], best_points_coordinate[:, 1], 'o-r')
ax[1].plot(aca.generation_best_Y)
plt.show()
[ 0 28 1 21 42 20 3 25 48 4 43 44 9 36 30 19 5 15 39 13 6 47 2 10
29 8 35 40 12 23 33 49 26 31 46 17 16 41 22 34 37 24 27 11 18 7 38 14
45 32]
5.579572075708274