放假回家了,啊啊啊啊
0 前言
这次讲的是启发式算法中的遗传算法,先讲讲启发式算法:
启发式算法(heuristic algorithm)是相对于最优化算法提出的。一个问题的最优算法求得该问题每个实例的最优解。启发式算法可以这样定义:一个基于直观或经验构造的算法,在可接受的花费(指计算时间和空间)下给出待解决组合优化问题每一个实例的一个可行解,该可行解与最优解的偏离程度一般不能被预计。现阶段,启发式算法以仿自然体算法为主,主要有遗传/基因/免疫/蚁群/粒子群/蜂群/鱼群/细菌群/退火/模糊/神经网络等。这些算法广泛用于组合优化、智能控制、模式识别、规划设计、网络安全等领域。
通俗来讲,启发式算法就是利用类似仿生学的原理,将自然、动物中的一些现象抽象成为算法来处理相应问题。而启发式算法作用是:当一个问题是NP难问题时,是无法求解到最优解的,因此,用一种相对好的求解算法,也就是启发式算法,去尽可能逼近最优解,得到一个相对优解,这样对于解决该问题也是可以接受的。
同时启发式算法,也分为进化智能和群体智能,分别对应时间维度和空间维度。时间维度上模拟种群通过代际繁衍、不断进化以适应环境;空间维度上模拟种群内的大量简单个体在限定条件下通过交互协作,使整体种群具有某种适应环境的能力。(为什么是群智能:个体行为简单,不具备独立的复杂的智能能力;群体行为复杂,具有智能特征, 可解决许多复杂问题 。比如:蜜蜂、蚂蚁、鱼、微生物等)
我们这次讲的遗传算法,也就是进化智能的典型。
遗传算法
1 简介
遗传算法(Genetic Algorithm,GA)最早是由美国的 John holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律而设计提出的。是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。该算法通过数学的方式,利用计算机仿真运算,将问题的求解过程转换成类似生物进化中的染色体基因的交叉、变异等过程。在求解较为复杂的组合优化问题时,相对一些常规的优化算法,通常能够较快地获得较好的优化结果。遗传算法已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。(选自百度百科)
看完这些介绍,也许你不是很懂,我们通俗来讲:
遗传算法是基于达尔文进化论、孟德尔遗传学说发展出来的。核心就是:物竞天择,适者生存。它是通过生物遗传和进化过程中选择、交叉、变异机理的模仿,来完成对问题求解的自适应搜索过程。
1.2 基本术语
先了解下基本术语:
- 染色体:生物的遗传物质的主要载体
- 基因:扩展生物性状的遗传物质的功能单元和结构单位
- 基因重组/交叉:在有性繁殖过程中,控制不同性状的染色体基因重新组合
- 基因突变(又称变异):染色体的某些基因位的组成或数目发生改变
- 基因型:性状染色体的内部表现,即基因内部结构表现
- 表现型:染色体决定的性状的外部表现,即根据基因型形成的个体的外部表现
- 个体:指染色体带有特征的实体
- 种群:个体的集合,该集合内个体数称为种群大小
1.3 模型抽象
1.3.1 过程抽象
我们将种群抽象成一个个基因的集合。因为:染色体是基因的载体,个体是一个或者多个基因的集合也就是一个基因链的载体,种群是多个个体的集合。所以种群是多个基因链的集合。
然后整个过程就可以抽象为下图:
解释:
- 首先存在一个种群,它会进行进化操作
- 右侧框中存在三个算子,分别是选择、交叉、变异,该三个算子就是整个进化的全过程
- 进化过程:根据个体基因链,可以通过一个适应函数计算得出适应值(这是一个衡量个体在该环境下生存能力的值);通过适应值我们可以对适应值小的个体进行筛除,这一步就是选择;选择之后去除了一些个体,这个时候,个体之间出现交配,也就出现基因交叉,在该过程也会出现突变(突变的对象是子代还是所有个体可以自行确定),这时种群会出现新的基因链形成新种群;然后往复操作。总结起来就是:种群-》选择-》突变与重组-》新种群,往复循环,循环数为进化代数。
- 当进化代数足够高时,种群的所有个体都会收敛到一个或者几个最优状态不再改变,于是我们就获得了一个或几个最优解。这里的解也就是当前最优状态的基因链集合。
1.3.2 抽象对照表
2 实现步骤
2.1 编码与解码(encoding and decoding)
将问题结构变换为位串形式编码表示的过程叫编码(Encoding)
将位串形式编码表示变换为原问题结构的过程叫解码或译码(Decoding)
该算法中常见的编码方式有:二进制编码、浮点数编码、格雷码编码、符号编码等。其中最简单的就是二进制编码,也就如下图:
这里主要讲的也就是二进制编码步骤,也容易理解:
2.1.1 二进制编码
含义
二进制编码的实质就是用多个二进制数表示为一个个体,将原问题的解空间映射为一个由0或1组成的编码串。
实现
- 假设解范围为: [ X m i n , X m a x ] [X_{min},X_{max}] [Xmin,Xmax]
- 而某个体编码为: b L , b L − 1 , b L − 2 , . . . b 2 , b 1 b_L,b_{L-1},b_{L-2},...b_2,b_1 bL,bL−1,bL−2,...b2,b1(为什么 L 从前到后,因为这是编码串,想想二进制的第一第二位)
- 则解码公式为: x = x m i n + σ ∑ i = 1 L b i 2 i − 1 x=x_{min} + \sigma\sum_{i=1}^{L}b_i2^{i-1} x=xmin+σ∑i=1Lbi2i−1
- 串长度取决于你所需要的求解精度: σ = ( x m a x − x m i n ) 2 L − 1 \sigma=\frac{(x_{max}-x_{min})}{2^L-1} σ=2L−1(xmax−xmin)
举例:
如上图所示,是我们使用二进制编码后的一组三维数据,可以表示一个三维空间的一个点。
所以也就是一个个体有12个基因,那么开始解码:
X
1
=
1
×
2
0
+
1
×
2
1
+
0
×
2
2
+
1
×
2
3
=
11
X_1=1\times2^0+1\times2^1+0\times2^2+1\times2^3=11
X1=1×20+1×21+0×22+1×23=11
X
2
=
.
.
.
.
.
.
=
6
X_2=......=6
X2=......=6
X
3
=
.
.
.
.
.
.
=
12
X_3=......=12
X3=......=12
而如果我们的三维数据的分量范围是[-1,1],则根据已知数据可以知道串长为4,那么:
σ
=
1
−
(
−
1
)
2
4
−
1
=
2
15
\sigma=\frac{1-(-1)}{2^4-1}=\frac{2}{15}
σ=24−11−(−1)=152
开始解码:
X
1
=
−
1
+
2
15
∑
i
=
1
4
b
i
2
i
−
1
=
7
15
X_1=-1 + \frac{2}{15}\sum_{i=1}^{4}b_i2^{i-1}=\frac{7}{15}
X1=−1+152∑i=14bi2i−1=157
同理:
X
2
=
−
3
15
X_2=\frac{-3}{15}
X2=15−3
X
3
=
9
15
X_3=\frac{9}{15}
X3=159
那么串数据实际代表的就是点:
(
7
15
,
−
3
15
,
9
15
)
(\frac{7}{15},\frac{-3}{15},\frac{9}{15})
(157,15−3,159)
2.2 群体设定
2.2.1 种群初始化
为了算法效果达到最优,我们可以根据对当前问题的了解,可以在最优解所在的一个分布范围内初始化种群。然后随机产生一定数目的个体,从中挑选最好的个体加到初始群体中。这种过程不断迭代,直到初始群体中个体数目达到了预先确定的规模。
2.2.2 设定种群规模
规模太小:遗传算法的优化性能不太好,易陷入局部最优解
规模太大:计算复杂
2.2.3设定适应度函数
定义
适应度函数:可以表示个体的优劣并作为遗传操作、自然选择的依据(在选择过程中,个体适应度高的被选择的概率大;反之就小)
该算法得到的最优解,其实就是符合适应度函数的最优解,所以我们需要从待解决问题中的目标映射为适应度函数:
求最大化问题:
F
i
t
(
f
(
x
)
)
=
f
(
x
)
Fit(f(x))=f(x)
Fit(f(x))=f(x) 求最小化问题:
F
i
t
(
f
(
x
)
)
=
1
f
(
x
)
Fit(f(x))=\frac{1}{f(x)}
Fit(f(x))=f(x)1
尺度变换
在遗传算法中,将所有妨碍适应度值高的个体产生、从而影响算法正常工作的问题统称为欺骗问题(Deceptive Problem)
过早收敛:缩小这些个体的适应度,以降低这些超级个体的竞争力
停滞现象:改变原始适应值的比例关系,以提高个体之间的竞争力
适应度函数的尺度变换(Fitness Scaling)或者定标:对适应度函数值域的某种映射变换
这些尺度变换是为了优化算法而作,涉及线性变换,这里就不作介绍。
2.3 选择
物竞天择,适者生存。环境的作用便是选择,淘汰适应度小的个体。
所以我们需要使用适当的方法来实现这个算子:(这里只详细介绍轮盘赌)
轮盘赌不只是用于选择,它是使用随机数进行概率模拟的一个方法,还可以用于后续的交叉变异等需要概率模拟的操作。
2.3.1 轮盘赌
轮盘赌,顾名思义,定义一个区间,将区间分为若干份分别对应某个体,随机产生一个在该区间的数字,数字出现在哪个区间,则该个体存活,进入下一步骤。如下图我们定义了一个种群:(适应度越高,选择概率越高,而累计概率为所在端点值用于定义区间段)
比如,我们产生了一个随机数:0.32,那么就是二号被选中
2.3.2 最佳个体保存法(简略)
每次都将适应度最高的保存到下一个种群,最后的结果一定是历代中适应度最高的个体。
2.3.3 锦标赛法(简略)
从群体中随机选择个个体,将其中适应度最高的个体保存到下一代。这一过程反复执行,直到保存到下一代的个体数达到预先设定的数量为止。(也有其他实现锦标赛法,都是通过一定方法选择最优,然后反复执行,进行筛选)
2.5 交叉与变异
2.5.1 交叉
交叉分为单点交叉,二点交叉,多点交叉。这里只需要介绍一下如单点交叉,其他同理:
每个交叉点都有一定概率在父代之间交换。
2.5.2 变异
变异分为位点变异、逆转变异、插入变异、互换变异、移动变异等。这里只图解一下位点变异。
位点变异:群体中的个体码串,随机挑选一个或多个基因座,并对这些基因座的基因值以变异概率作变动。
逆转变异:在个体码串中随机选择两点(逆转点),然后将两点之间的基因值以逆向排序插入到原位置中。
插入变异:在个体码串中随机选择一个码,然后将此码插入随机选择的插入点中间。
互换变异:随机选取染色体的两个基因进行简单互换。
移动变异:随机选取一个基因,向左或者向右移动一个随机位数。
3 一般步骤
4 例子:
例子没怎么写,有点草草了事。简略看看即可。
4.1 目标
实现目标,求以下函数最大值,精度8位小数:
4.2 编码解码
保证精度要求,至少把两个区间[0,10)分为10*10^8份。又:
所以编码二进制串至少27位。又因为是两个变量,于是会有两个染色体(这里指的染色体其实只有一根基因串)。
同时解码:
然后再变换为实数:
4.3 适应度函数:fitness function
海拔高度作为适应评分(即函数值):
4.4 选择函数:selection
越适应的个体越容易繁殖后代,但是不一定适应度越高肯定后代越多,只能从概率上说越多。(有些低海拔的小峰会让你产生错觉)所以这里选择轮盘赌(Roulette Wheel Selection)选择法:
求和所有袋鼠的适应度:
每个袋鼠被选择为存活的概率:
也就是说,适应度大,生存概率更大。
(另外还有精英选择机制)
4.5 遗传变异:
这里二进制编码相比浮点数编码更加类似于自然界的基因重组变异。通过该操作,才会出现子代不同于父代,通过物竞天择,促使子代优于父代。