文章目录
- 前言
- 1.测试函数
- 1.1 针状函数
- 1.1.1 表达式
- 1.1.2 特征
- 1.1.3 图像
- 1.2 Brains’s rcos函数
- 1.2.1 表达式
- 1.2.2 特征
- 1.2.3 图像
- 1.3 Griewank函数
- 1.3.1 表达式
- 1.3.2 特征
- 1.3.3 图像
- 1.4 Easom’s函数
- 1.4.1 表达式
- 1.4.2 特征
- 1.4.3 图像
- 1.5 Schwefel’s函数
- 1.5.1 表达式
- 1.5.2 特征
- 1.5.3 图像
- 2. PSO(Particle swarm optimization)
- 2.1 解决的问题
- 2.2 API
- 2.3 参数
- 2.4 示例
- 2.4.1 不带约束条件
- 2.4.2 带约束条件
- 3.Genetic Algorithm(recommended)
- 3.1 解决的问题
- 3.2 API
- 3.2.1 Genetic Algorithm
- 3.2.2 Genetic Algorithm for TSP(Travelling Salesman Problem)
- 3.3 TSP的目标函数定义的示例
- 3.4 示例
- 3.5.1 目标函数优化
- 3.5.2 TSP
- 4.Differential Evolution
- 4.1 解决的问题
- 4.2 API
- 4.3 参数
- 4.4 示例
- 特别篇:GA与DE的区别
- 5.SA(Simulated Annealing)
- 5.1 解决的问题
- 5.2 API
- 5.2.1 Simulated Annealing
- 5.2.2 SA for TSP
- 5.3 示例
- 5.3.1 目标函数优化
- 5.3.2 TSP
- 5.4 bug
- 6.ACA (Ant Colony Algorithm) for tsp
- 6.1 解决的问题
- 6.2 API
- 6.3 参数
- 6.4 示例
- 7.immune algorithm (IA)
- 7.1 解决的问题
- 7.2 API
- 7.3 参数
- 7.4 示例
- 8.Artificial Fish Swarm Algorithm (AFSA)
- 8.1 解决的问题
- 8.2 API
- 8.3 参数
- 8.4 示例
前言
本文着力于介绍scikit-opt工具包中七大启发式算法的API调用方法,关于具体的数学原理和推导过程,本文不再介绍,请读者自行查询相关文献。
1.测试函数
为了检验这些启发式算法的效果,本文使用了以下五种专门用于测试的函数。
1.1 针状函数
1.1.1 表达式
1.1.2 特征
该函数是一个多峰函数,在(50,50)处取得全局最大值1.1512,第二最大值在其全局最大值附近,采用一般的优化方法很容易陷入局部极大值点。
1.1.3 图像
1.2 Brains’s rcos函数
1.2.1 表达式
1.2.2 特征
有3个全局最小值:0.397887,分别位于 (-pi, 12.275), (pi, 2.275), (9.42478, 2.475)。
还有一个局部最小值为:0.8447
1.2.3 图像
1.3 Griewank函数
1.3.1 表达式
1.3.2 特征
在(0,0,…,0)处取得全局极小值0
1.3.3 图像
1.4 Easom’s函数
1.4.1 表达式
1.4.2 特征
在(pi,pi)处取得全局最小值-1。
1.4.3 图像
1.5 Schwefel’s函数
1.5.1 表达式
1.5.2 特征
1.5.3 图像
2. PSO(Particle swarm optimization)
2.1 解决的问题
- 目标函数优化
2.2 API
2.3 参数
参数 | 含义 |
func | 欲优化的目标函数 |
n_dim | 所给函数的参数个数 |
pop | 粒子群规模 |
max_iter | 最大迭代次数 |
lb(lower bound) | 函数参数的下限 |
ub(upper bound) | 函数参数的上限 |
w | 惯性因子 |
c1 | 个体学习因子 |
c2 | 社会学习因子 |
constraint_eq | 等式约束条件,适用于非线性约束 |
constraint_ueq | 不等式约束条件,适用于非线性约束 |
参数详解:
- 定义目标函数func时,参数有且只有一个
- 惯性权重w描述粒子上一代速度对当前代速度的影响。w 值较大,全局寻优能力强,局部寻优能力弱;反之,则局部寻优能力强。 当问题空间较大时,为了在搜索速度和搜索精度之间达到平衡,通常做法是使算法在前期有较高的全局搜索能力以得到合适的种子,而在后期有较高的局部搜索能力以提高收敛精度。所以w不宜为一个固定的常数。
- 个体学习因子c1 =0称为无私型粒子群算法,即“只有社会,没有自我”,会迅速丧失群体多样性,容易陷入局部最优解而无法跳出;社会学习因子c2=0称为自我认识型粒子群算法,即“只有自我,没有社会”,完全没有信息的社会共享,导致算法收敛速度缓慢; c1,c2都不为0,称为完全型粒子群算法,完全型粒子群算法更容易保持收敛速度和搜索效果的均衡,是较好的选择。通常设置c1=c2=2,但不一定必须等于2,通常c1=c2∈[0,4]。
- 群体大小pop是一个整数,pop很小时陷入局部最优解的可能性很大;pop很大时PSO的优化能力很好, 但是当群体数目增长至一定水平时,再增长将不再有显著作用,而且数目越大计算量也越大。群体规模pop一般取20~40,对较难或特定类别的问题 可以取到100~200。
- 定义约束条件时,需要用元组,元组中用匿名函数
2.4 示例
2.4.1 不带约束条件
2.4.2 带约束条件
- 可以看到收敛更快了
3.Genetic Algorithm(recommended)
3.1 解决的问题
- 目标函数优化
- TSP(Travelling Salesman Problem)问题
3.2 API
3.2.1 Genetic Algorithm
参数 | 含义 |
func | 欲优化的目标函数 |
n_dim | 所给函数的参数个数 |
size_pop | 种群初始规模 |
max_iter | 最大迭代次数 |
prob_mut | 变异概率 |
lb(lower bound) | 函数参数的下限 |
ub(upper bound) | 函数参数的上限 |
constraint_eq | 等式约束条件,适用于非线性约束 |
constraint_ueq | 不等式约束条件,适用于非线性约束 |
precision | 精度要求 |
调整这些参数可以对算法的性能产生影响,具体如下:
- 调整
size_pop
:增加种群数量,可以增加搜索空间,但会导致计算代价增加。 - 调整
max_iter
:增加迭代次数可以增加搜索空间,但会增加运行时间。 - 调整
prob_mut
:增加个体基因突变的概率,可以增加种群的多样性,但会降低稳定性,易陷入局部最优解。 - 调整
precision
:增加精度可以增加结果的精确度,但会增加计算时间和计算量。 - 调整约束条件:添加约束条件可以使得解更符合实际限制,但会增加计算复杂度。
- 调整
early_stop
:合理设置提前终止算法的条件可以减少不必要的运行时间。
3.2.2 Genetic Algorithm for TSP(Travelling Salesman Problem)
参数 | 含义 |
func | 欲优化的目标函数 |
n_dim | 所给函数的参数个数 |
size_pop | 种群初始规模 |
max_iter | 最大迭代次数 |
prob_mut | 变异概率 |
3.3 TSP的目标函数定义的示例
首先,我们来讲解一下TSP问题是什么:TSP(Traveling Salesman Problem)指的是给定一个包含N个城市的地图,每对城市之间都有一个距离。现在需要找到一条路径,使得在该路径上每个城市仅仅只被经过一次,并且要求走过的总路程最小化。
那么,为了解决这个问题,需要先生成N个随机的城市,并计算它们之间的距离。(每个城市用一个坐标点表示,计算距离可以使用欧几里得距离公式)
针对上述问题,代码的流程可以描述如下:
- 首先,生成随机的城市坐标。
- 接着,根据这些城市坐标计算它们之间的距离。
- 最后,定义一个目标函数,计算按某种顺序依次经过这些城市的总路程。
按照这个思路,我们可以写出如下的代码:
下面还有一个官方给出的版本,比较简洁:
3.4 示例
3.5.1 目标函数优化
- 经过实测,GA对目标函数的优化不如PSO和DE
3.5.2 TSP
4.Differential Evolution
4.1 解决的问题
- 目标函数优化
4.2 API
4.3 参数
参数 | 含义 |
func | 欲优化的目标函数 |
n_dim | 所给函数的参数个数 |
size_pop | 种群初始规模 |
max_iter | 最大迭代次数 |
prob_mut | 变异概率 |
lb(lower bound) | 函数参数的下限 |
ub(upper bound) | 函数参数的上限 |
constraint_eq | 等式约束条件,适用于非线性约束 |
constraint_ueq | 不等式约束条件,适用于非线性约束 |
调整这些参数会对算法的收敛速度、性能和精度产生影响:
-
F
的调整会影响算法的收敛速度和性能,在实际应用中,通常取值范围在[0.5, 1]之间,较小的值会降低算法的收敛速度,较大的值会提高算法的性能但易于陷入局部最优。 -
size_pop
的调整会影响算法的搜索范围和精度,在实际应用中,通常取值范围在[10, 100]之间,较小的值会降低算法的搜索范围和精度,较大的值会提高算法的搜索范围但易于陷入局部最优。 -
max_iter
的调整会影响算法的收敛速度和性能,在实际应用中,通常取值范围在[50, 1000]之间,较小的值会降低算法的收敛速度,较大的值会提高算法的性能但易于陷入局部最优。 -
prob_mut
的调整会影响算法的搜索范围和精度,在实际应用中,通常取值范围在[0.2, 0.5]之间,较小的值会降低算法的搜索范围和精度,较大的值会提高算法的搜索范围但易于陷入局部最优。 -
lb
和ub
的调整会影响算法的搜索范围和精度,较宽的取值范围会提高算法的搜索范围但易于陷入局部最优,较窄的取值范围会提高算法的精度但易于陷入搜索空间的局限性。
4.4 示例
特别篇:GA与DE的区别
差分进化算法(Differential Evolution,DE)和遗传算法(Genetic Algorithm,GA)都是优化问题的常用解法,它们本质上都是一种基于种群的进化算法。但是从算法的具体实现角度来看,它们之间存在一些区别,包括:
- 变异操作的方式:DE是通过差分操作对整个种群进行变异,而GA是通过单点交叉、多点交叉、变异等操作对个体进行变异。
- 交叉操作的方式:DE不使用交叉操作,而GA是通过交叉操作将两个个体的染色体交换基因片段。
- 参数的个数:DE只有 3 个参数(个体数、变异概率、缩放因子),而GA有更多的参数,如交叉概率、变异概率、选择算法、染色体长度等。
- 算法的收敛速度:DE通过局部搜索和全局搜索相结合的方式,通常能够在较少的迭代次数内得到较为理想的全局最优解;而GA通常较难避免陷入局部最优解,收敛速度可能会比DE慢。
总的来说,DE更适合处理具有连续性的目标函数,对噪声和非线性函数的适应性非常强,而GA更适合解决具有离散性或组合性质的优化问题,如旅行商问题等。
5.SA(Simulated Annealing)
5.1 解决的问题
- 目标函数优化
- TSP(Travelling Salesman Problem)问题
5.2 API
5.2.1 Simulated Annealing
参数 | 含义 |
func | 欲优化的目标函数 |
目标函数的初始点 | |
T_max | 初始温度 |
T_min | 最小温度 |
L | 内循环迭代次数 |
max_stay_counter | 最大停留次数 |
lb(lower bound) | 函数参数的下限 |
ub(upper bound) | 函数参数的上限 |
参数详解:
- func:优化器所要优化的目标函数。它是一个接受输入参数x并返回实数值的函数。
- x0:优化器的起始点,它是一个长度为n的列表,n为目标函数的自变量数量。
- T_max:初始温度的上限。在退火过程中,温度将不断地减小,直到小于等于T_min。T_max的大小决定了退火过程中的起始温度,取值较高可以使得更多的移不动的状态被接受,但同时可能导致计算时间增加和结果不稳定。
- T_min:温度的下限。当温度降到T_min以下时,退火过程结束。T_min的大小影响退火过程的终止时间以及最终结果的质量,通常情况下应该设置为一个很小的正数,并与目标函数的值域有关。
- L:每个温度下的迭代次数。每次迭代中,优化器从当前点x尝试随机扰动得到一个新的点x_new,如果目标函数值变小,则接受x_new作为新的点;否则以一定概率接受该点以避免陷入局部最小值。L的大小决定每个温度下的计算量,取值过小可能导致结果不充分,取值过大可能导致计算时间增加。
- max_stay_counter:接受状态的最大连续次数。如果连续生成的L个新状态都没有比当前状态更优,则认为算法已经陷入局部极小值,此时退出迭代,返回当前状态作为最优解。max_stay_counter的大小影响算法的全局搜索能力,设定过小可能导致算法过早退出,在局部极小值附近震荡,设定过大可能导致算法无法收敛于正确解。
调整这些参数会对模拟退火算法的性能和结果产生影响,一般地:
- 如果发现算法很难找到可接受的状态,可适当提高T_max并减小L,以增加接受状态的可能性,并减少在状态空间中锁定的时间。
- 如果想缩短算法时间或者降低计算量、并行化搜索过程,可以减小L、max_stay_counter或T_max等参数,以减少每个温度下的迭代次数、搜索到的状态数或搜索的状态空间范围。
- 如果想得到更精确的结果,可以增加L、max_stay_counter或T_min等参数,以扩大搜索范围或提高算法在搜索到局部最优解后跳出局部最优解的概率。
5.2.2 SA for TSP
5.3 示例
5.3.1 目标函数优化
5.3.2 TSP
5.4 bug
- 本人发现在使用SA_TSP的途中,只要问题的复杂度上升,SA_TSP几乎必定会给出错误的结果。在上面的例子中,我只给出了10个点位,这时的SA_TSP看起来适应地很好。但是,当我把点位增加到50,SA_TSP给出了如下的错误结果:
- 如有读者知道原因,请联系本人!
6.ACA (Ant Colony Algorithm) for tsp
6.1 解决的问题
- TSP(Travelling Salesman Problem)问题
6.2 API
6.3 参数
参数 | 含义 |
func | 欲优化的目标函数 |
n_dim | 所给函数的参数个数 |
size_pop | 种群初始规模 |
max_iter | 最大迭代次数 |
distance_matrix | TSP问题的距离矩阵 |
alpha | 信息素重要程度因子 |
beta | 信息素浓度因子 |
rho | 信息素挥发系数 |
-
size_pop
:种群规模对算法的效率和精度有很大的影响。种群规模越大,算法在搜索空间中的覆盖率越高,但相应的计算开销也越大,运行时间和内存开销也会增加。如果种群规模过小,算法可能会陷入局部最优解,从而影响算法的质量。 -
max_iter
:迭代次数越多,算法对解的搜索空间越广,容易得到更优的解,但是也会消耗更多的计算资源,从而影响算法的运行效率。 -
distance_matrix
:距离矩阵的准确性对算法的精度和运行效率有很大影响。如果距离矩阵不准确,算法可能会得到错误的结果,从而影响算法的质量。距离矩阵的计算也需要很大的计算开销,如果距离矩阵过于复杂,算法的运行效率也会受到影响。 -
alpha
和beta
:信息素重要程度因子和启发函数重要程度因子都可以影响算法的全局搜索能力和局部搜索能力。信息素重要程度因子越大,蚂蚁走过的路径上信息素的影响越大,算法的全局搜索能力越强,但是局部搜索能力会弱化。启发函数重要程度因子越大,蚂蚁选择路径时更加倾向于走近目标城市,因此算法的局部搜索能力会增强,但是全局搜索能力会弱化。 -
rho
:信息素挥发程度因子主要用于控制信息素的更新速度。如果挥发程度因子设置得过大,信息素的更新速度会很快,导致算法的不稳定性增加;如果设置得过小,信息素的更新速度会很慢,影响算法的收敛速度。
需要根据具体问题的特点和问题需求来选择和调整参数。
6.4 示例
7.immune algorithm (IA)
7.1 解决的问题
- TSP(Travelling Salesman Problem)问题
7.2 API
7.3 参数
参数 | 含义 |
func | TSP问题的目标函数 |
n_dim | 所给函数的参数个数 |
size_pop | 种群初始规模 |
max_iter | 最大迭代次数 |
prob_mut | 个体突变的概率 |
T | 模拟退火算法的初始温度 |
alpha | 模拟退火算法中温度下降的比例 |
- size_pop:增加种群数量可能会导致更多的个体能够探索更广阔的解空间,但是也会增加算法的计算时间和消耗的内存。
- max_iter:增加迭代次数可能会导致更好的解或计算时间更长。
- prob_mut:增加突变概率能够使算法更有机会在探索过程中跳出局部最优解,但是也会增加计算复杂度。
- T:增加初始温度可能会使算法能够更快地探索解空间,但是也可能导致算法探索不够全面或收敛不够彻底。
- alpha:增加温度下降比例可以加速算法的收敛速度,但是也可能导致算法过早收敛到次优解。
7.4 示例
8.Artificial Fish Swarm Algorithm (AFSA)
8.1 解决的问题
- 目标函数优化
8.2 API
8.3 参数
参数 | 含义 |
func | 欲优化的目标函数 |
n_dim | 所给函数的参数个数 |
size_pop | 种群初始规模 |
max_iter | 最大迭代次数 |
max_try_num | 当某一代的最优解无法更新时,最多重复尝试的次数 |
step | 每步的步长 |
visual | 可视化界面的比例 |
q | 温度调节的参数,用于控制降温速度 |
delta | 更新解的相关参数,控制上一次最优解和当前最优解的距离 |
这些参数的调整会影响AFSA算法的收敛性、全局最优解的寻优效果以及时间成本。具体来说:
- size_pop:一般来说,种群数量越大,能够全局搜索的能力就越强,但同时也会增加计算时间和内存消耗。如果时间和内存资源允许,可以考虑适当增加该参数的值。
- max_iter:迭代次数过低可能导致算法收敛不到最优解,而迭代次数过高可能会浪费计算时间,同时也可能陷入局部最优解而无法跳出。需要根据实际问题进行调节。
- max_try_num:该参数的增加会增加算法迭代所需的时间,但同时可以增加算法跳出局部最优解的可能性。如果算法收敛不到最优解,可以适当增加该参数的值。
- step:如果步长设置过大,算法可能会在搜索过程中快速跳过最优解附近的板块,从而无法找到最优解。如果步长过小,算法搜索效率较低。需要根据具体问题进行调节。
- visual:可视化界面可以帮助理解算法搜索过程以及寻优效果,但同时也会占用计算资源。可以根据具体需求进行调节。
- q:较低的q值会减缓温度(降温)的下降速度,可能会导致算法长时间在局部最优解周围徘徊。较高的q值将降温速度加快,可能有助于算法跳出局部最优解,但同时也可能会降低算法全局优化的精度。需要根据实际问题进行调节。
- delta:delta参数越大,跳出局部最优解的可能性越大,但同时可能会增加算法的计算时间和空间复杂度。如果算法很难跳出局部最优解,可以适当增加该参数的值。
8.4 示例
- 如果把步长缩小成0.5,delta缩小成0.5,那么这个算法针对Easom’s函数给出了错误的答案