遗传编程(Genetic Programming)学习笔记(三):利用DEAP框架创建一个GP表达式

DEAP框架

  Python 的 DEAP库是一个进化算法框架,可以帮助我们快速实现各种进化算法,例如遗传算法(GA)、粒子群算法(PSO)、遗传编程(GP)、分布估计算法(EDA)、多目标优化算法等。
  利用DEAP库实现进化算法的基本流程如下:
  - 创建优化问题
  - 定义个体、种群
  - 定义算子(以GP为例,包括选择、交叉、变异)
  - 定义评价函数(评价函数必须要自己定义)
  - 种群迭代

利用DEAP库创建一个GP表达式

  (1)首先创建 primitive set

import operator
from deap import gp

# 创建一个 primitive set: primitiveset(名称,变量个数)  
pset = gp.PrimitiveSet('main111',2)
# 变量默认叫ARG0,ARG1...可以自己改名字,这里的输入参数可以作为terminal
pset.renameArguments(ARG0 = 'x')
pset.renameArguments(ARG1 = 'y')

# 定义function set:addPrimitive(函数名,参数个数)  不同的函数需要的参数个数不一样
# 函数可以是已有的
pset.addPrimitive(operator.add,2)
pset.addPrimitive(operator.mul,2)
pset.addPrimitive(operator.neg,1)  # 取负值
pset.addPrimitive(math.sin,1)
# 函数也可以自己定义
def if_then_else(constraint, output1,output2):
    if constraint:
        return output1
    else:
        return output2
pset.addPrimitive(if_then_else,3)

# 定义terminal set
pset.addTerminal(3)  # 常数
pset.addEphemeralConstant('num',lambda:random.randint(-5,5))  # 随机数:(name,随机数函数)

  (2)根据上述 primitive set 创建表达式

# 三种生成方法,full,grow,half(primitive set,min_depth,max_depth)
# python中树的最大深度是91,最小深度是0(只有一个叶子节点)
expr1 = gp.genFull(pset,0,2)    # list
expr2 = gp.genGrow(pset,1,3)
expr3 = gp.genHalfAndHalf(pset,1,3)
tree = gp.PrimitiveTree(expr1)  # 将表达式形式转换成树形结构

# 编译表达式:必须经过编译才能进行运算
function1 = gp.compile(tree,pset)  
# function2 = gp.compile(expr2,pset)  
result = function1(1,2)   # 输入变量值能够得到该表达式的结果
print('result:',result)

注意:步骤(2)只是创建一个gp表达式、编译表达式的示例,实际使用deap库时,直接进行步骤(3)即可。

  (3)创建个体(individual)

from deap import creator,tools,base

# create(类名,继承的类,参数)
creator.create('FitnessMin',base.Fitness,weights=(-1.0,))
creator.create('Individual',gp.PrimitiveTree,fitness = creator.FitnessMin,pset = pset) 
# Individual继承的类是"gp.PrimitiveTree",生成tree-based individual

# 向toolbox注册函数
toolbox = base.Toolbox()   # 实例
# register(函数别名,函数,函数需要的参数)
toolbox.register('expr',gp.genHalfAndHalf,pset = pset,min_ = 3,max_ = 3)  
# 也可以根据需要用genFull、genGrow
toolbox.register('individual',tools.initIterate,creator.Individual,toolbox.expr)

# 生成一个个体
one_individual = toolbox.individual()
# print('individual:',one_individual)
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值