由于笔者最近在研究有关于基因表达式编程的课题,对进化算法方面有了更为全面的理解,希望能给大家指点迷津。本文主要基于张克俊博士的毕业论文《基因表达式编程理论及其监督机器学习模型研究》,结合笔者的思考进行描述。
本篇为该入门系列的第二篇,前述基础以及后续补充博客传送门:
基因表达式编程
基因表达式编程,又称GEP(Genetic Expression Prgramming),是当前数据驱动模型炙手可热的优秀进化类算法,可用在例如函数识别、模式识别等等前沿科研领域。
关于基因表达式编程,其基本概念一定要搞清楚,不然用到实际问题中时会有许多调整无处下手。下面先将其基本流程图展示出来:
组织结构
在GEP中,种群是最高实体,且由多个等长的个体组成,(个体即为染色体)个体包含一个及以上的等长基因,单个基因包含多个基因元素,基本GEP的组织结构如图所示:
其中每个染色体含有三个基因,基因间由虚线隔开,基因间的连接符为“⊕”,基因头部长度为3,尾部长度为4(斜体表示基因尾部)。
基因
-
对于基因编码,如上图所示,GEP的基因包含头部和尾部两部分,采用线性符号串编码,这些符号串即为基因的基因型。
基因中包含多个基因元素位(编码位),基因元素位的值取自函数符号集F和终点符号集T,其中函数符号集F通常根据欲求解的问题来定义,可以直接取用标准函数,也可以使用自定义的函数。
例如对于一个简单代数问题,可假设F={+,-,×,÷},若是一个逻辑推理问题,可假设F={∩,∪,¬},终点符号集T则由数值常量、变量以及无参函数构成,具体可参考下表:
在GEP规则中,基因头部元素位可以在F与T中选取,而基因尾部元素位只能从T中选取。对于一个基因来说,其基因头部的长度h通常根据问题的复杂度来定义,其尾部的长度t需和h保持下式的关系:
其中n为所有函数中最大目数,基因头部与尾部长度保持这样的关系,可以保证产生的基因都是合法的。其中目数指的是函数所需的元素数。
-
对于基因解码,经过解码的基因型即为表现型。
GEP的解码方法为:采用宽度优先的原则,依次从基因中各个基因元素读取字符来构建语法关系树,此语法关系树即为基因的表现型,称为表达式树。对表达式树进行中序遍历即可得到对应的数学表达式。(中序遍历指的是先访问左子树,然后访问根节点,再访问右子树)。
表现型转化为基因型:将表达式树按照从左到右、自上而下遍历(宽度优先)即可得到基因型。(符合Karva语法,符合这一规则的基因型为Karva表达式),可得Karva语法是一种“双语”解释系统。
并非所有的元素在构建表达式树时都会用到,被用到的基因元素称为ORF(Open Reading Frame),由ORF中基因元素构成的表达式称为ORF表达式,ORF表达式与表达式树是一一对应的,是基因编码的有效成分。而不属于ORF的部分被称为基因的非编码基因元素。
基因编码与解码过程可由下图表示:
由于非编码基因元素的存在,通常ORF表达式长度要比基因长度短。但值得一提,这些非编码基因元素会在遗传算子例如交叉的作用下被激活,并表现出卓越的性能。
对于染色体:
基本GEP中染色体由一个及以上的基因组成,基因之间用连接符⊕链接,连接符根据具体问题复杂度而定,一般可取“+ - × ÷”。
对于种群:
基本GEP的种群为多个个体的集合,种群的不断进化(通过个体间的遗传操作)可以得到最优个体,最优个体即为种群的最优解。基本GEP中,初始种群染色体由函数集与终点集符号随机产生,初始种群中一般不会出现最优解个体。但随着种群的不断进化,在遗传算子的作用下,优秀个体将会不断涌现,进而获取最优解。
遗传算子
基本GEP的遗传算子,主要包括选择、复制、变异、转座和重组,通常顺次执行,但变异、转座、重组之间的操作顺序、对最终结果影响不大。此外,除了变异操作,任何一个遗传算子都不能够对一个染色体进行一次以上的操作。
选择与复制算子
基本GEP的选择算子为轮盘赌选择法。在轮盘赌选择中,每个个体适应值在群体中所占比例对应圆形赌盘的面积块,轮盘按种群大小进行相应次数的旋转(使得群体的大小不变),每次旋转只选择一个个体,个体的适应值越优,它被复制到下一代的可能性越大。
复制算子将被选中的个体原样复制到下一代种群,不对个体产生任何修饰性操作,因此不会产生新个体。但此算子与其他算子一起作用,使得种群具有了适应与进化的特性。
变异算子
变异算子是GEP中所有具有“修饰”能力的算子中最高效的算子,是遗传多样化中最重要的功能。基本GEP中的变异可以发生在染色体中的任何位置,对变异种类和变异次数不做限制。
但为了使染色体的组织结构保持完整,避免非法的个体产生,对变异方式进行了一定的限制,如基因头部的基因元素值可以变异为任何基因元素,而尾部的基因元素值仅可变异为终点符号集元素,因此GEP变异操作产生的新个体均为合法个体,这与遗传编程的变异操作会产生非法个体有明显的不同。
下图展示了变异算子的作用过程与效果:
表达式树的变化如下图:
假如函数符号集元素变异成了终点符号集元素或者带一个参数的函数符号集元素变异成了带两个参数的函数符号集元素,表达式树将会被彻底修改;
值得说明的是变异若发生在非编码基因元素上,变异将对表达式树或ORF表达式不产生任何改变,这种变异称为中性变异,中性变异的积累在进化中会起到非常重要的作用。因为在其他遗传算子的作用下,这些非编码基因元素将会被激活成为基因有效成分。
后续
在遗传算子方面还有转座算子、重组算子等等,同时基因表达式编程中适应值函数也是极为重要的一环,但现在篇幅过多,后续内容放到下一篇博客进行详细讲解。