从一元函数极值问题理解遗传算法

一、前言

  对于求取一元函数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 (90)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)2n1ab(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)217190(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 交叉率,即编码发生交叉互换的概率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值