目录
1.前言——我对算法的理解
2.算法的种类
3.算法原理总结(首段段末给出完整篇)
3.1 模拟退火算法SA
3.2 禁忌搜索TS与邻域搜索
3.3 粒子群算法PSO
3.4 遗传算法GA与差分进化算法DE
3.5 蚁群算法ACO/AS
智能优化算法,也叫启发式算法,元启发式算法等,都差不多。主要包括我们常提到的:粒子群算法PSO,遗传算法GA,模拟退火算法SA,禁忌搜索算法TS,蚁群算法AC,大邻域搜索算法VNS,自适应大邻域搜索ALNS等等。
之所以提到上面几种,是因为它们太经典了。
尽管近些年智能优化算法层出不穷,每隔一阵就有新的算法出现。比如帝国竞争,文化算法,灰狼算法等等。我个人的观点是,算法这么多,没必要都学。除非你是对算法特别感兴趣,或者是计算机相关专业,必须要深究算法,那可以蹭热点或者开发新算法。但对于大多数人来说,之所以用算法,本质原因是为了解决问题,那么好好分析问题本身属性,解好问题更重要。当然行有余力的吸收多种算法的精华于一身,取长补短当然更好。
闲话不多说,开始正题。
接下来分为篇1和篇2,总结下一开始提到的几种经典算法的原理。原理是最最精华的部分,理解了原理,有一个更高层次的把控;也能更好地融合各种算法的优势;当然还可以更好的理解代码。个人感悟是理解了原理,代码debug运行几遍,就可以差不多掌握算法了。
开始之前,我们先概览下算法大家族,把算法分门别类下。按照不同的角度,大概可以分为这么几类。
算法按照主要的维度,可以分为:个体寻优和群体寻优两大类。
我个人感觉相同之处都是利用计算机强大的算力,尽可能搜索更多的范围,也就是遍及更多的可行域(这样找到最优解的可能性大一些);但是也不能一味的漫无目的地搜索,所以我们会参照一定的行动指南,比如目标函数下降最快;或是经验等等,让搜索更有效率,不过这样又会带来一个问题,就是容易陷入短视思维,也就是会陷入局部最优解。所以算法最精妙的原理是:在搜索尽可能多的可行域(穷举)和构思出一定的行动指南(贪婪)之间把握平衡点,最终寻得最优。当然,这里的最优,可能不是我们常规意义上的最优。而是,从搜索的方案当中选出最好的,是较好的满意的,不是最好的。我们说的智能优化指的是寻优,不断变优的意思。
模拟退火,Simulated annealing,简称SA,是对贪婪搜索的一种改进算法,——完整介绍见这篇。
算法的核心在于:以一定的概率接受较差解。我们知道,一般迭代的思路是,每次都期望往更好的方向走,每一步都更好,也就是说接受更好的解,忽略更差解(只能前进,不能后退)。但这样容易陷入局部最优。所以我们有的时候退后一步,毕竟有时弯路反而更近嘛。以上图为例,目的是寻求最小值。贪心算法,会找到局部最优解B;而假如我们以一定的概率接受较差解,那么解空间有可能跑到右边,有可能找到全局最优解C。
现在我们用通俗的语言再来描述下:模拟退火,是仿照固体退火原理,是一种基于概率(“Metropolis接受准则”)的算法。先来复习下固体退火原理——将固体加温至充分高(加温时,固体内部粒子随温升变为无序状,内能增大),再让其徐徐冷却(徐徐冷却时粒子渐趋有序),在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。所以:模拟退火算法的基本思路是从一个较高的温度出发,伴随温度参数的不断下降,在解空间搜寻目标函数的全局最优解,以一定的概率跳出局部最优找到全局最优值。
那么模拟退火的核心是:温度怎么下降?以及以多大的概率接受较差解?以及在温度下降过程中,解空间如何变化?这三点是模拟退火的精髓,也影响着最优解的质量。也就是说,你要使用模拟退火的话,这三点必须设计好或者设计得很巧妙。
一般来说,也就是说模拟退火最基础原始的版本中,温度下降通过一个介于0-1的系数来实现,也就是温度下降系数*当前温度,就是下一时刻的温度;接受的概率是仿照固体退火原理实现的,固体热力学定理中,温度为T时,出现能量差为dE的降温概率是,可以表示为:
,这里k是一个常数,因为温度总是降低的,内能在降低,能量差为正,指数部分是负,因此保证了两点:(1)概率必定是介于
-
之间,即0-1之间;(2)温度不断在降低,因此指数部分分母在减小,指数部分在减小,那么接受较差解的概率在不断缩小。这两点保证了接受概率的合理性,以及初始接受较差解的可能性大,后面接受较差解的可能性越来越小,和认知也是一致的,初始想要遍及尽可能多的可行域,后面要保证算法收敛。也就是说,概率影响着解空间的变化。所以又回到一开始的部分,概率设计很重要。其实这种思路在很多改进型算法中也经常用。
简单来说就是判断当前解是否比原来的解好,若新解函数值比原来的解更好,那么以1的概率接受它;若比原来的解差,那么以p的概率接受它,p的取值与当前解,新解和控制参数t有关。
TS是Local Search(LS)的扩展,是一种全局逐步寻优的全局性邻域搜索算法。传统的LS是通过迭代,不断搜寻邻域中更优的解来替换当前解,实现优化,该方式容易陷入局部最优。TS是模仿人类的记忆功能,在搜索过程中标记已经找到的局部最优解及求解过程,并于之后的搜索中避开它们——完整介绍见这篇:禁忌搜索(TS——Tabu Search)与邻域搜索基础知识。
算法通过禁忌策略实现记忆功能,通过破禁准则继承LS的强局部搜索能力。种种机制的配合,使得TS一方面具备高局部搜索能力,同时又能防止算法在优化中陷入局部最优。
主要的思想是设置禁忌列表,避免陷入局部最优。所以禁忌表的设计是关键,禁忌对象和禁忌长度是设计的核心,直接影响着算法的效率和性能。
种群搜索算法,比较常见,用的也比较多。主要步骤是,交叉,变异,是仿照自然界遗传的思路设计的。核心在三个地方,编码&解码,交叉(算子),变异(算子)。它们的设计好坏直接影响着算法的性能——完整介绍见这篇。
说到这里,不得不提一下,差分进化算法——Differential Evolution,DE。因为它和遗传的步骤十分相似。它也是基于群体的启发式搜索算法,群中的每个个体对应一个解向量。(差分进化算法(Differential Evolution,DE)由Storn和Price于1995年首次提出。主要用于求解实数优化问题。该算法是一类基于群体的自适应全局优化算法,属于演化算法的一种,由于其具有结构简单、容易实现、收敛快速、鲁棒性强等特点,因而被广泛应用在数据挖掘、模式识别、数字滤波器设计、人工神经网络、电磁学等各个领域。1996年在日本名古屋举行的第一届国际演化计算(ICEO)竞赛中,差分进化算法被证明是速度最快的进化算法。——源于百度百科。)
包含,变异-交叉-选择,三个主要部分。对,你没看错,先变异,再交叉。注意这里的变异特指进行经过差分生成,交叉指的是父代(原来的个体)和子代(变异后的个体)进行交叉。
差分说白了是用后面的序列值-前面的序列,从而得到一个新序列(这叫一阶差分。)常见的差分策略是随机选取种群中两个不同的个体,将其向量差缩放后与待变异个体进行向量合成。
其中,,
和
是三个随机数,区间为
,
称为缩放因子,为一个确定的常数。
表示第
代。
也是一种种群搜索算法。主要的思路是通过蚂蚁留下的信息素来指引下一步搜索,好的路线信息素会不断累积,会吸引蚂蚁向此聚集。但是蚂蚁不是完全朝好的方向走,这本质是为了避免短视,陷入局部最优。这主要通过两方面实现,第一是按照轮盘赌或者一定的概率朝信息素多的方向走;第二信息素会挥发——完整介绍见这篇。
本质还是在多样性和精确性之间谋取平衡。
这里分享一个很棒的开源库框架:GitHub - guofei9987/scikit-opt: Genetic Algorithm, Particle Swarm Optimization, Simulated Annealing, Ant Colony Optimization Algorithm,Immune Algorithm, Artificial Fish Swarm Algorithm, Differential Evolution and TSP(Traveling salesman)