微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

最小 DEAP 脚本在 max_ 参数大于 1 时引发令人困惑的异常并且无法生成程序

如何解决最小 DEAP 脚本在 max_ 参数大于 1 时引发令人困惑的异常并且无法生成程序

我想使用 DEAP's genetic programming functionality 随机生成一些简短的 Python 脚本(我稍后会对其进行变异和进化)。在学习如何使用它时,我遇到了一个我不明白的异常。

以下是重新创建异常的最小程序。它旨在要求 DEAP 生成随机程序,将一个小的随机正整数添加一个来自高斯分布的随机数。在这个最小的例子中,程序的输入被忽略了。

import numpy as np
from deap import base,creator,gp,tools
import operator

class POSINT() : pass    
class GAUSS() : pass
 
pset = gp.PrimitiveSetTyped('main',[str],float)
pset.addPrimitive(operator.add,[POSINT,GAUSS],float)
pset.addEphemeralConstant('POSINT',lambda: np.random.randint(10),POSINT)
pset.addEphemeralConstant('GAUSS',lambda: np.random.randn(),GAUSS)

creator.create("Individual",gp.PrimitiveTree)

toolBox = base.ToolBox()
toolBox.register("expr",gp.genHalfAndHalf,pset=pset,min_=1,max_=2)
toolBox.register("individual",tools.initIterate,creator.Individual,toolBox.expr)

expr = toolBox.individual()
print(expr)

代码解释:为了将输入限制在允许的范围内(正整数和高斯),我定义了两种类型(T_POSINTT_GAUSS)。然后我添加一个原始操作 (operator.add),它接受两个参数(每个允许的类型之一)并返回一个浮点数。

使用与上面链接的教程相同的代码,我尝试生成一个“个体”(即满足我指定的约束的程序实例。如果 min_ 和 {{1 }} 参数都设置为 1,但是如果我将 max 增加到 2,程序会引发以下异常。为什么?我没有强迫它制作大小为 2 的树,只是增加maximum 可接受的尺寸。

max_

当明显存在该类型的终端(POSINT 临时常量)时,为什么要说 Traceback (most recent call last): File "/home/user/.local/lib/python3.8/site-packages/deap/gp.py",line 624,in generate prim = random.choice(pset.primitives[type_]) File "/usr/lib/python3.8/random.py",line 290,in choice raise IndexError('Cannot choose from an empty sequence') from None IndexError: Cannot choose from an empty sequence During handling of the above exception,another exception occurred: Traceback (most recent call last): File "stack_overflow_deap.py",line 19,in <module> expr = toolBox.individual() File "/home/user/.local/lib/python3.8/site-packages/deap/tools/init.py",line 52,in initIterate return container(generator()) File "/home/user/.local/lib/python3.8/site-packages/deap/gp.py",line 574,in genHalfAndHalf return method(pset,min_,max_,type_) File "/home/user/.local/lib/python3.8/site-packages/deap/gp.py",line 557,in genGrow return generate(pset,condition,line 627,in generate raise IndexError("The gp.generate function tried to add " \ File "/home/user/.local/lib/python3.8/site-packages/deap/gp.py",in choice raise IndexError('Cannot choose from an empty sequence') from None IndexError: The gp.generate function tried to add a primitive of type '<class '__main__.POSINT'>',but there is none available. Compilation exited abnormally with code 1 at Wed May 26 12:35:38

更一般地说,我应该如何避免这种异常?在这种微不足道的情况下,设置 The gp.generate function tried to add a primitive of type <class '__main__.POSINT'>,but there is none available解决方案有效,但在更复杂的情况下,我希望能够生成不同大小的树。我应该重复 max_=1 命令直到它不返回异常吗?看起来有点老套——不是吗?感谢您的时间!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。