文章目录
一、前言
对于求取一元函数y = f(x)的极值问题,我们可以利用暴力的手段,通过细分自变量x的定义域区间,不断带入函数表达式中比较结果得到近似的最优解。这样的方法最大的好处就是简单,但是随之带来的问题就是收敛速度极大地受区间细分程度的影响。那么遗传算法是如何解决这个问题的呢?以下是从这个问题出发,我对遗传算法的一些理解。
二、遗传算法思想
在自然界中存在“物竞天择,优胜劣汰”的自然法则,各个物种总是倾向于留存自己优良的基因,而遗传算法正是借鉴这种思想,将一个最优解求取的问题抽象化为一个种群的演变过程,其中涉及到种群、个体、染色体和基因等概念,并针对不同问题将其实例化,完成对可行解的生成、比较、挑选和淘汰,从而得到最优解。
三、遗传算法组成
下表是我理解的生物遗传与遗传算法的概念对比:
生物遗传概念 | 遗传算法概念 |
---|---|
个体 | 可行解 |
染色体 | 可行解的编码 |
基因 | 可行解的编码各分量 |
种群 | 可行解的集合 |
最强个体 | 最优解 |
婚配 | 编码某些分量的交叉操作 |
变异 | 编码某些分量的偶发变化 |
适应性 | 对可行解的评价结果 |
3.1 编码与染色体
在上表的基础上,针对遗传算法在一元函数 y = x + 10 s i n ( 5 x ) + 7 c o s ( 4 x ) 在 区 间 x ∈ [ 0 , 9 ] y = x+10sin(5x)+7cos(4x)在区间x∈[0,9] y=x+10sin(5x)+7cos(4x)在区间x∈[0,9]上的极值及极值点求解问题,作如下阐述:
假设我们想要得到的极值点x坐标的精度为小数点后4位,对于定义域 x ∈ [ 0 , 9 ] x∈[0,9] x∈[0,9],我们需要将其细分为 ( 9 − 0 ) ∗ 1 0 4 = 90000 (9-0)*10^4 = 90000 (9−0)∗104=90000份,那么可行解就在这90000份中。我们知道 2 16 < 90000 < 2 17 2^{16} < 90000 < 2^{17} 216<90000<217,所以要想用二进制数表示所有的可行解,我们需要至少需要17bits。而这一个17bits的数,就是我们对可行解的编码,每1bit就是我们假设的单个基因,一个完整的编码就看作是由这17个基因构成的一条染色体(chromosome)。当然,编码的形式不仅限于二进制数,还可以直接采用格雷码、实数编码等方式。
如何将完成可行解与编码之间的相互转换呢?假设 y = f ( x ) , x ∈ [ a , b ] y = f(x),x ∈ [ a, b] y=f(x),x∈[a,b],chr_x为x对应的n位二进制数编码,对于chr_x与x之间,有如下一般化解码关系:
x = a + D E C ( c h r _ x ) ∗ a − b 2 n − 1 (1) x = a + DEC(chr\_x)* \frac{a-b}{2^n-1} \tag{1} x=a+DEC(chr_x)∗2n−1a−b(1)
其中 D E C ( ) DEC() DEC() 为将二进制数转为十进制数的函数
对于本问题而言,解码关系为:
x = 0 + D E C ( c h r _ x ) ∗ 9 − 0 2 17 − 1 (2) x = 0 + DEC(chr\_x)* \frac{9-0}{2^{17}-1} \tag{2} x=0+DEC(chr_x)∗217−19−0(2)
3.2 个体与种群
自然界中大多数生物具有多条染色体,而对于一元函数 f ( x ) f(x) f(x)的极值问题而言,单个个体(可行解)仅含有一条染色体( x x x的编码),进一步,若要求一个空间平面的极值,也就是二元函数 f ( x , y ) f(x,y) f(x,y)的极值问题,则单个个体包含两条染色体( x x x的编码和 y y y 的编码)。若干个体的集合组成了一个种群,其含义为解空间的一个子空间,对于一元函数极值问题而言,就是定义域中的某个点集。
3.3 适应性与适应性函数
在自然界中,一个物种是否能够繁荣却决于其对环境的适应能力。在遗传算法中,我们用适应性函数评价一个解的优劣,在函数极值问题中,适应性函数就是待求解函数表达式,解对应的函数值越大,则适应性越高,反映解的质量越好。一个问题的求解快慢和好坏,与适应性函数的选取有很大关系。
3.4 遗传与进化
生物繁衍的本质是基因的传递,也就是所谓的遗传过程。要想本物种能够长久地生存下去,生物不得不发生进化,而所谓的进化过程,就是在种群中淘汰掉适应性差的个体,筛选出优秀的个体,在这些优秀的个体之间进行婚配,使得彼此的优质基因进行重组,甚至利用偶发的变异来产生更加优秀的基因。在遗传算法中,我们通过下面的方法使得 解 能够“进化”:
- 【1】选择
通过对比当前代种群中各个体(可行解)按照适应性高低,利用适当的选取方式,比如轮盘赌、精英机制等,挑选出优胜的个体作为父母本体; - 【2】交叉
将【1】中得到的父母本的染色体(可行解的子变量)上的基因(编码的分量)进行按照一定概率发生部分交换,比如单点交换、多点交换等,从而产生新一代个体(新的可行解); - 【3】变异
在【2】的基础上,按照一定概率在某些新一代个体的染色体基因上发生突变,比如单点按位取反等方式,从而产生变异的新一代个体(新的可行解)。不过通常变异得到的个体出现适应性很高的可能性极小,因此设置变异的概率是远小于交叉的设定概率的,这一点与自然界中的生物进化是类似的。
3.5 遗传算法的一般步骤
四、MATLAB实现一元函数极值的遗传算法求解
参考程序 matlab_ga,求解
y = x + 10 s i n ( 5 x ) + 7 c o s ( 4 x ) (3) y = x+10sin(5x)+7cos(4x) \tag{3} y=x+10sin(5x)+7cos(4x)(3)
在区间 x ∈ [ 0 , 9 ] x∈[0,9] x∈[0,9]上的极值。
4.1 初始参数定义说明
一个问题的求解理解为一个种群不断进化的过程,开始进化前,各初始参数定义如下:
参数名 | 初始值 | 含义 |
---|---|---|
p o p u l a t i o n _ s i z e population\_size population_size | 100 | 种群中单代所含个体数,即一次迭代所含可行解个数 |
c h r o m o s o m e _ s i z e chromosome\_size chromosome_size | 17 | 一条染色体上所含基因数,即单个可行解的编码长度 |
g e n e r a t i o n _ s i z e generation\_size generation_size | 200 | 种群繁衍代数,即迭代代数 |
c r o s s _ r a t e cross\_rate cross_rate | 0.6 | 交叉率,即编码发生交叉互换的概率 |