请先看一下遗传算法:
http://blog.csdn.net/v_JULY_v/article/details/6132775
遗传规划/遗传编程(Genetic Programming)是遗传算法的一个分支,与遗传算法中每个个体是一段染色体编码不同,它的个体是一个计算机程序。
维基上说它在70年代就已经有人实践,不过正式提出应该还是在John R. Koza教授于1990年发表的博士论文中。
遗传规划最早的应用是符号回归,比如为了拟合 z=f(x,y),它生成一个初始函数 g(x,y),然后以g(x,y)与z的相关系数为适应度,进行选择交叉变异,最终得到最优的一个函数g’,再做一次线性回归即可。
如下是GP表示的一个例子,自然,还有其他的表达方式:
线型:GEP(Gene Expression Programming),
图型:CGP(Cartesian Genetic Programming)。
以树型为例:
这棵树表示一个函数,就是上面所述的g(x,y),至于怎么用就见仁见智了,确定好用法之后设定一个计算适应度的方案,就可以跑遗传规划了。
在遗传规划中,选择算子与遗传算法的相同,交叉变异需要根据表达方式来。
树形的交叉实现是这样:
变异实现是这样:
遗传规划的目标是得到最优的计算机程序,其自由度是机器学习算法中最高的,几乎能处理任何问题。当然,能处理问题不代表能解决,解决问题还是需要精确度达到一定要求的。
Renascence架构使用遗传规划算法,去动态决定ADF的公式。但与上面所描述的GP算法来说,有很大的不一样:
1.Renascence架构中,每个函数有自己的输入输出类型,子节点的输出类型必须要匹配父节点的输入类型。
2.Renascence生成的计算机程序的实现依赖于下层的函数库,不是完整的计算机程序。
由于这些不同,生成和变异算法都需要先用回溯算法找出所有可能解,然后再随机挑选,这点比起传统的遗传规划算法来说复杂不少。
树形实现最容易实现,Renascence架构中目前采用的是树形的表达方案,又因为交叉算子实现起来比较麻烦且容易造成膨胀,舍弃了交叉算子,采用进化策略(Evolution Strategy)的算法做优化。当前架构所用的结构优化算法事实上还有很大的优化空间。
维普上的Genetic Programming的介绍:
https://en.wikipedia.org/wiki/Genetic_programming
遗传算法的介绍(这篇文章讲得较为基础,很多变种优化没有考虑,不过适合入门):
http://blog.csdn.net/v_JULY_v/article/details/6132775
这篇文章讲GEP比较详细,本文没有看懂可以看这篇:
http://blog.sciencenet.cn/blog-287179-537914.html