问题描述
我想使用 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_POSINT
和 T_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 (将#修改为@)