- 三种启发式算法的示例代码:遗传算法、粒子群算法、退火算法
- 学习优化算法的思路(避免浪费无效时间)
作业:今天以自由探索的思路为主,尝试检索资料、视频、文档,用尽可能简短但是清晰的语言看是否能说清楚这三种算法每种算法的实现逻辑,帮助更深入的理解。
启发式算法(Heuristic Algorithm)
一、概述
1.启发式算法
一种基于经验或者实验算法的统称。通过对过去经验的归纳推理以及实验分析来解决问题的方法,即借助于某种直观判断或试探的方法,以求得问题的次优解或以一定的概率求得最优解
2.元启发式算法
从自然界的一些现象获得灵感、求解过程(模拟退火、遗传算法、粒子群算法),来解决实际问题。
总结:元启发式算法是构造启发式算法的基础方法,和实际问题无关即适应于不同问题。启发式算法需要利用元启发式算法,并结合求解问题的特征,设计出来面向特定问题的算法。故启发式算法是问题相关的算法。
启发式算法 = 元启发式算法 + 问题特征
3.启发式算法流程
step1 局部搜索
# 伪代码
1: genetate current solution X_c
2: While stopping criteria not met do
3: Select X_n ∈ N(X_c)(neighbor to current sol.)
4: if f(X_n)<f(X_c) then X_c=X_n
5: end While
step2 设计方法,跳出局部最优解。
这种方法能够把不是局部最优解的解,按一定概率保存下来,以这个不是局部最优解的解继续优化,
跳出局部的方法(从自然界现象中获得灵感),就是不同启发式算法命名方式
二、元启发式算法
1.模拟退火(Simulated Annealing)
(1)方法介绍
物理现象:退火现象指物体逐渐降温的物理现象,温度愈低,物体的能量状态会低;温度足够低后,液体开始冷凝与结晶,在结晶状态时,系统的能量状态最低。大自然在缓慢降温(即退火)时,可“找到”最低能量状态:结晶。但是,如果过程过急过快,快速降温(亦称淬炼)时,会导致不是最低能态的非晶形。
算法概述:
- 目标函数 f 在第 i+1 步比第 i 步更优,即移动后比移动前更优,则总是向该方向移动
- 目标函数 f 移动后比移动前要差,则以一定概率接受该移动,这个概率随着时间推移而降低(逐步降低则趋向稳定)
这个根据一定概率P是否选择差解的方法,叫做Metropolis准则(这个准则来源于模拟退火,故整个方法成为模拟退火)
其中,表示移动后和移动前两个解的目标值的差值
,k 为常数,t 为温度
由该式也可以得出:t 小时,保留概率P小;t 大时,保留概率P大
(2)代码实践(见项目)
2.遗传算法 (Genetic Algorithm)
(0)引例
一群扇贝在海边生活繁衍,但海边的渔民会捕捞扇贝,而这些渔民的家族图腾是 Firefox 的图标(或者其他任意一个图标都行),所以渔民总是选择那些贝壳花纹长得不像 Firefox 图标的扇贝,长此以往,扇贝的贝壳的花纹都会演化成很像Fircfox 图标。(假设贝壳图案用4x4图片表示,每个小小格子代表像素点)
123 | 56 | 79 | 102 |
17 | 213 | 212 | 197 |
19 | 107 | 223 | 97 |
165 | 97 | 73 | 65 |
图案每个像素按行排列,代表扇贝的染色体
123 | 56 | 79 | 102 | 17 | 213 | 212 | 197 | 19 | 107 | 223 | 97 | 165 | 97 | 73 | 65 |
在一代代演化的过程中,父母扇贝的基因组合产生新扇贝,所以遗传算法会选择两个原有的扇贝,然后对这两个扇贝的染色体进行随机交叉形成新的扇贝
迭代演化也会造成基因突变,遗传算法让新产生扇贝的基因以较小的概率发生变异。也就是说,染色体的某个像素值随机改变
对扇贝像素值和 Firefox 图标进行逐一比较,颜色相差得越大的显然表示越不像。 这个评价的函数叫做“适应度函数”,它负责评价扇贝和Firefox图案的相似程度
(1)方法介绍
定义:模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。
遗传算法首先依据某种方式(通常是随机)生成一组候选解,之后,候选解中的个体通过交叉和变异产生新的解群,再在这个解群中选取较优的个体产生新一代的候选解,重复此过程,直到满足某种收敛指标为止。
种群(population):就是组候选解的集合,遗传算法正是通过种群的迭代进化,实现了最优解或者近似最优解。
个体(individual):一个个体对应一个解,也就是构成种群的基本单元。在遗传算法中,需要把个解构造成染色体(chromosome)的形式,如同在扇贝例子中,通过图17.4.(b)的染色体来表示一个扇贝花纹图案,这个过程也被称为编码。而当算法结束时,需要把最优的染色体还原成最优解,这个过程称为解码。
基因(gene):染色体是由基因组成的,所以把组成遗传算法染色体(个体)的基本组成单位称为基因,基因的选择可以多种多样。比如在扇贝例子中,我们用像素作为基因,但实际上扇贝例子的原文是用不同的三角形块作为基因,通过不同三角形块的叠加形成Firefox 图案。在实际中,遗传算法广泛用到的一种基因是 0、1比特,0、1比特基因形成的染色体是一个二进制串。
交叉(crossover):交叉是将两个父代个体的部分基因进行交换,从而形成两个新的个体。最简单的交叉如同扇贝例子,在染色体上寻找一个点,然后进行相互交叉,这种交叉称为单点交叉。除了单点交叉,交叉操作还包括:
- 多点交叉(Multi-point Crossover)
- 均匀交叉(Uniform Crossover)
- 洗牌交叉(shute crossover)
变异(mutation):按照一定的概率将个体中的基因值用其它基因值来替换,从而形成一个新的个体。如同自然界中生物的变异概率较小,在遗传算法中基因的变异率也应该设置为较小。
选择(selection):在目前的种群中(通常是上一代的种群和新生产的种群的结合)选择一定数量的较优个体,形成新的种群。选择是通过适应度函数f(x)做出的,其中 x 为个体。
每个个体被选择的概率:
,适应度函数
其中, 代表第 i 个解,
代表第 i 个解的输出结果,
代表所有解的输出结果、
选择方法:
- 线性排序选择
- 指数排序选择
- 锦标赛选择
(2)代码实践(见项目)
3.粒子群算法 (Particle Swarm Optimization)
(1)方法介绍
生物行为:鸟群觅食,鸟群通过集体的信息共享使群体找到最优的目的地。鸟群在森林中随机搜索食物,找到食物量最多的位置。所有的鸟都不知道食物具体在哪个位置,只能感受到食物大概在哪个方向。每只鸟沿着自己判定的方向进行搜索,并在搜索的过程中记录自己曾经找到过食物且量最多的位置,同时所有的鸟都共享自己每一次发现食物的位置以及食物的量,这样鸟群就知道当前在哪个位置食物的量最多。在搜索的过程中,每只鸟都会根据自己记忆中食物量最多的位置和当前鸟群记录的食物量最多的位置调整自己接下来搜索的方向。鸟群经过一段时间的搜索后就可以找到森林中哪个位置的食物量最多(全局最优解)。
算法概述:
粒子群算法将优化问题的解看作是搜索空间中的粒子,每个粒子都有自己的位置和速度。粒子在搜索空间中根据自身的经验和群体的经验不断调整自己的位置,以寻找最优解。
每个粒子都记住自己曾经到达过的最优位置(个体极值),同时群体中的所有粒子共享当前群体所找到的最优位置(全局极值)。在每次迭代中,粒子根据自己的速度、个体极值和全局极值来更新自己的位置,向着个体极值和全局极值的方向移动,从而逐步逼近最优解。
(2)代码实践(见项目)