基于DEAP进化算法库的Genetic Programming实践学习

因为可能之后会采用GP的方式来解决ATFM相关的问题,所以我就去学习了一下GP的使用方法,DEAP库的教程还是很清晰明了的,在此附上链接 DEAP_documentation

我主要跟着简称完成了符号回归、偶校验、垃圾邮件检测三个例子,前两个是Loosely Typed GP,最后一个是Strongly Typed GP,差别在于STGP在向PrimitiveSet添加functions和terminals时必须指定类型,如下所示:

pset = PrimitiveSetTyped("main", [bool, float], float)
pset.addPrimitive(operator.xor, [bool, bool], bool)
pset.addTerminal(3.0, float)

而LTGP:
pset = PrimitiveSet("main", 2)
pset.addPrimitive(max, 2)
pset.addPrimitive(operator.add, 2)
pset.addPrimitive(operator.mul, 2)
pset.addTerminal(3)

1.符号回归问题

整体我认为可以分为三部分,向pset中添加元素->利用creator创建需要的类->toolbox注册相关EA算法的操作函数

 第一行表示这个set名字叫MAIN,接受一个输入参数;添加的除法需要自己设定为除零保护的形式;添加变量时,第一个参数是变量名称,第二参数必须是可调用的函数,如果不加lambda,那么返回的是一个常数,无法调用

 这里实际是创建了两个类,翻译一下就是下面的代码,这是为了方便后面toolbox注册函数时使用

 然后是利用base中的Toolbox注册EA算法的算子

同样的,字符串是函数名(在这里名字必须设定为individual,population,因为我们用的是DEAP库中的完整的算法,名称必须与设定的相符),第二个参数是调用的函数,后面的参数是该函数需要的参数。

例如,对于tools.initIterate,其需要的两个输入参数是container和generator,而我们前面设定的creator.Individual是一个类容器,expr是generate的方法

在这里,评估函数evalSymbReg需要根据解决问题具体设定,本问题设定如下:

 完成后就可以开心的用DEAP中自带的算法库开始进化了!!!

 这里的hof是一个类似精英保留的策略,1表示保留每一代最好的个体,这里的统计信息的展示需要mark一下,还是比较模板的

2.偶校验问题

偶校验问题我主要想记录两点

首先是输入输出的产生。比如我们针对的是6位的偶校验,那么总共会有2**6种01码和相应结果,怎么搞呢?

 太精彩了!!!

第二个应该算是python里的一个语法问题,之前没遇到过,感觉还挺有意思

 通过我们pset的设定,这个func最后会通过compile翻译成一个接收PARITY_FANIN_M个参数的函数,而inputs是一个二维数组,通过*in_的方式可以将一个含PARITY_FANIN_M个参数的list解开,很神奇。

3.垃圾邮件检测问题

这个问题和上述两个除了强制type限定外没有其他差别,不过这里在pset中添加了一个新的函数

 关于如何设定GP的primitive set是一个大学问,我要解决的ATFM问题应该也需要专门的去设计相关的terminal,例如job shop中的各种time等等。目前我正在学习思考这点,如果有头绪会继续更新这方面内容!

posted @ 2023-06-27 11:15  孙bob  阅读(358)  评论(0)    收藏  举报