Python DEAP mutFlipBit 的类型错误
TypeError with Python DEAP mutFlipBit
我正在用 DEAP 编写我的第一个进化算法。
一切正常,但 MultiFlipBit 突变运算符除外。
当我尝试改变一棵树(个体)时,出现以下错误:
File "Genetic_Programming.py", line 92, in main
halloffame=hof, verbose=True)
offspring = varOr(population, toolbox, lambda_, cxpb, mutpb)
File "/Users/anaconda/lib/python2.7/site-packages/deap/algorithms.py", line 235, in varOr
ind, = toolbox.mutate(ind)
File "/Users/anaconda/lib/python2.7/site-packages/deap/tools/mutation.py", line 132, in mutFlipBit
individual[i] = type(individual[i])(not individual[i])
TypeError: __init__() takes exactly 4 arguments (2 given)
代码如下:
pset = gp.PrimitiveSet("MAIN", 8)
pset.addPrimitive(operator.and_, 2)
pset.addPrimitive(operator.or_, 2)
pset.addPrimitive(operator.xor, 2)
pset.addPrimitive(operator.not_, 1)
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", gp.PrimitiveTree, fitness=creator.FitnessMax)
toolbox = base.Toolbox()
toolbox.register("expr", gp.genGrow, pset=pset, min_=1, max_=8)
toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.expr)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
toolbox.register("compile", gp.compile, pset=pset)
def evalSymbReg(individual):
# Transform the tree expression in a callable function
print individual
ind = toolbox.compile(expr=individual)
# Evaluate the mean squared error between the expression
# and the real function : x**4 + x**3 + x**2 + x
performance=Genetic_V0.genetic_backtest(ind)
return performance,
toolbox.register("evaluate", evalSymbReg)
toolbox.register("select", tools.selTournament, tournsize=50)
toolbox.register("mate", gp.cxOnePoint)
#toolbox.register("expr_mut", gp.genGrow, min_=1, max_=4)
#toolbox.register("mutate", tools.mutFlipBit, expr=toolbox.expr_mut, pset=pset)
toolbox.register("mutate", tools.mutFlipBit, indpb=0.95)
def main():
nu=50
pop = toolbox.population(n=nu)
hof = tools.HallOfFame(3)
stats_fit = tools.Statistics(lambda ind: ind.fitness.values)
stats_size = tools.Statistics(len)
mstats = tools.MultiStatistics(fitness=stats_fit, size=stats_size)
mstats.register("avg", numpy.mean)
mstats.register("std", numpy.std)
mstats.register("min", numpy.min)
mstats.register("max", numpy.max)
pop, log = algorithms.eaMuPlusLambda(pop, toolbox, nu/2, nu/2, 0.85, 0.15, 200,stats=mstats,
halloffame=hof, verbose=True)
# print log
return pop, log, hof
if __name__ == "__main__":
main()
在此先感谢您的帮助。
python版本:2.7
已编辑:
在提出如何解决问题的建议后,我向 DEAP 突变库添加了几个 "print" 以更好地理解正在发生的事情。根据原始问题,这是相同的错误,但有一些额外的信息:
individual is not_(ARG7)
individual[i] is <deap.gp.Primitive object at 0x10746c158>
(not individual[i]) is False
type(individual[i]) is <class 'deap.gp.Primitive'>
type(individual[i])(not individual[i]) is
Traceback (most recent call last):
File "Genetic_Programming.py", line 98, in <module>
main()
File "Genetic_Programming.py", line 92, in main
halloffame=hof, verbose=True)
File "/Users/giorgio/anaconda/lib/python2.7/site-packages/deap/algorithms.py", line 317, in eaMuPlusLambda
offspring = varOr(population, toolbox, lambda_, cxpb, mutpb)
File "/Users/giorgio/anaconda/lib/python2.7/site-packages/deap/algorithms.py", line 235, in varOr
ind, = toolbox.mutate(ind)
File "/Users/giorgio/anaconda/lib/python2.7/site-packages/deap/tools/mutation.py", line 136, in mutFlipBit
print "type(individual[i])(not individual[i]) is ", type(individual[i])(not individual[i])
TypeError: __init__() takes exactly 4 arguments (2 given)
再次感谢您的贡献
错误是抱怨您正试图将 deap.tools.mutFlipBit
函数用作作为 deap.gp.PrimitiveTree
实例的个体的增变器。来自 mutFlipBit 的文档:
The individual is expected to be a sequence and the values of the attributes shall stay valid after the not operator is called on them.
因此,如果代码决定改变 individual
的元素 i
,它会尝试计算 deap.dp.Primitive(not ind[i])
。并且错误抱怨 Primitive
的构造函数采用 4 个参数,self, name, args, ret
而不是传递的 self, (not ind[1])
.
错误的原因是双重的,
一个 mutBitFlip
突变体是一个 应用于由 "symbolic values" 和 "operators"[=64 的列表组成的个体=],而不是预期的布尔值列表。因此代码可以尝试否定运算符,例如翻转未定义的 和 。但是,代码将产生 False
因为对象在布尔上下文中被评估为 True
,并且最终会尝试从一个布尔值的单个参数创建一个新的 Primitive
.
即使 mutFlipBit
函数可以区分 Primitive
and a Terminal
,并且只会尝试否定 Terminal
,deap
将使用 symbolic 终端,因为 PrimitiveTree
的主要目标不是找到一个等价于值(即常量)的表达式,而是一个带参数的表达式,等价于一个函数.
您应该重新审视您尝试改进的内容,映射到布尔方程的表达式或布尔函数的一组参数。并在此基础上重新设计您的代码。
初始答案:
您的代码不完整,因为 offspring = varOr(population, toolbox, lambda_, cxpb, mutpb)
行没有显示。
但是,问题是由您的 population
变量中的一个个体的类型引起的。该代码假设您的个人是布尔值列表,因此代码 individual[i] = type(individual[i])(not individual[i])
可以工作:
x = True
print type(x)(not x) # Equivalent of bool(True) => False
错误说,type(individual[i])
得到了 class 的 init,它需要 3 个参数,例如self
+ 其他 3 个参数。
我正在用 DEAP 编写我的第一个进化算法。 一切正常,但 MultiFlipBit 突变运算符除外。 当我尝试改变一棵树(个体)时,出现以下错误:
File "Genetic_Programming.py", line 92, in main
halloffame=hof, verbose=True)
offspring = varOr(population, toolbox, lambda_, cxpb, mutpb)
File "/Users/anaconda/lib/python2.7/site-packages/deap/algorithms.py", line 235, in varOr
ind, = toolbox.mutate(ind)
File "/Users/anaconda/lib/python2.7/site-packages/deap/tools/mutation.py", line 132, in mutFlipBit
individual[i] = type(individual[i])(not individual[i])
TypeError: __init__() takes exactly 4 arguments (2 given)
代码如下:
pset = gp.PrimitiveSet("MAIN", 8)
pset.addPrimitive(operator.and_, 2)
pset.addPrimitive(operator.or_, 2)
pset.addPrimitive(operator.xor, 2)
pset.addPrimitive(operator.not_, 1)
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", gp.PrimitiveTree, fitness=creator.FitnessMax)
toolbox = base.Toolbox()
toolbox.register("expr", gp.genGrow, pset=pset, min_=1, max_=8)
toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.expr)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
toolbox.register("compile", gp.compile, pset=pset)
def evalSymbReg(individual):
# Transform the tree expression in a callable function
print individual
ind = toolbox.compile(expr=individual)
# Evaluate the mean squared error between the expression
# and the real function : x**4 + x**3 + x**2 + x
performance=Genetic_V0.genetic_backtest(ind)
return performance,
toolbox.register("evaluate", evalSymbReg)
toolbox.register("select", tools.selTournament, tournsize=50)
toolbox.register("mate", gp.cxOnePoint)
#toolbox.register("expr_mut", gp.genGrow, min_=1, max_=4)
#toolbox.register("mutate", tools.mutFlipBit, expr=toolbox.expr_mut, pset=pset)
toolbox.register("mutate", tools.mutFlipBit, indpb=0.95)
def main():
nu=50
pop = toolbox.population(n=nu)
hof = tools.HallOfFame(3)
stats_fit = tools.Statistics(lambda ind: ind.fitness.values)
stats_size = tools.Statistics(len)
mstats = tools.MultiStatistics(fitness=stats_fit, size=stats_size)
mstats.register("avg", numpy.mean)
mstats.register("std", numpy.std)
mstats.register("min", numpy.min)
mstats.register("max", numpy.max)
pop, log = algorithms.eaMuPlusLambda(pop, toolbox, nu/2, nu/2, 0.85, 0.15, 200,stats=mstats,
halloffame=hof, verbose=True)
# print log
return pop, log, hof
if __name__ == "__main__":
main()
在此先感谢您的帮助。
python版本:2.7
已编辑: 在提出如何解决问题的建议后,我向 DEAP 突变库添加了几个 "print" 以更好地理解正在发生的事情。根据原始问题,这是相同的错误,但有一些额外的信息:
individual is not_(ARG7)
individual[i] is <deap.gp.Primitive object at 0x10746c158>
(not individual[i]) is False
type(individual[i]) is <class 'deap.gp.Primitive'>
type(individual[i])(not individual[i]) is
Traceback (most recent call last):
File "Genetic_Programming.py", line 98, in <module>
main()
File "Genetic_Programming.py", line 92, in main
halloffame=hof, verbose=True)
File "/Users/giorgio/anaconda/lib/python2.7/site-packages/deap/algorithms.py", line 317, in eaMuPlusLambda
offspring = varOr(population, toolbox, lambda_, cxpb, mutpb)
File "/Users/giorgio/anaconda/lib/python2.7/site-packages/deap/algorithms.py", line 235, in varOr
ind, = toolbox.mutate(ind)
File "/Users/giorgio/anaconda/lib/python2.7/site-packages/deap/tools/mutation.py", line 136, in mutFlipBit
print "type(individual[i])(not individual[i]) is ", type(individual[i])(not individual[i])
TypeError: __init__() takes exactly 4 arguments (2 given)
再次感谢您的贡献
错误是抱怨您正试图将 deap.tools.mutFlipBit
函数用作作为 deap.gp.PrimitiveTree
实例的个体的增变器。来自 mutFlipBit 的文档:
The individual is expected to be a sequence and the values of the attributes shall stay valid after the not operator is called on them.
因此,如果代码决定改变 individual
的元素 i
,它会尝试计算 deap.dp.Primitive(not ind[i])
。并且错误抱怨 Primitive
的构造函数采用 4 个参数,self, name, args, ret
而不是传递的 self, (not ind[1])
.
错误的原因是双重的,
一个
mutBitFlip
突变体是一个 应用于由 "symbolic values" 和 "operators"[=64 的列表组成的个体=],而不是预期的布尔值列表。因此代码可以尝试否定运算符,例如翻转未定义的 和 。但是,代码将产生False
因为对象在布尔上下文中被评估为True
,并且最终会尝试从一个布尔值的单个参数创建一个新的Primitive
.即使
mutFlipBit
函数可以区分Primitive
and aTerminal
,并且只会尝试否定Terminal
,deap
将使用 symbolic 终端,因为PrimitiveTree
的主要目标不是找到一个等价于值(即常量)的表达式,而是一个带参数的表达式,等价于一个函数.
您应该重新审视您尝试改进的内容,映射到布尔方程的表达式或布尔函数的一组参数。并在此基础上重新设计您的代码。
初始答案:
您的代码不完整,因为 offspring = varOr(population, toolbox, lambda_, cxpb, mutpb)
行没有显示。
但是,问题是由您的 population
变量中的一个个体的类型引起的。该代码假设您的个人是布尔值列表,因此代码 individual[i] = type(individual[i])(not individual[i])
可以工作:
x = True
print type(x)(not x) # Equivalent of bool(True) => False
错误说,type(individual[i])
得到了 class 的 init,它需要 3 个参数,例如self
+ 其他 3 个参数。