1

我正在用 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()

在此先感谢您的帮助。

蟒蛇版本:2.7

编辑:在就如何解决问题提出建议后,我在 DEAP 突变库中添加了几个“打印”,以更好地了解正在发生的事情。根据原始问题,这是相同的错误,但有一些额外的信息:

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)

再次感谢您的任何贡献

4

1 回答 1

1

该错误是抱怨您试图将deap.tools.mutFlipBit函数用作deap.gp.PrimitiveTree. 来自mutFlipBit的文档:

个体应该是一个序列,并且属性的值在调用not运算符后应保持有效。

因此,如果代码决定改变 的元素iindividual它会尝试评估deap.dp.Primitive(not ind[i])。并且错误抱怨构造函数Primitive接受 4 个参数,self, name, args, ret而不是传递的self, (not ind[1]).

错误的原因是双重的,

  1. 一个mutBitFlipmutator 被应用于一个由 "symbolic values" 和 "operators" 列表组成的个体,而不是预期的布尔值列表。所以代码可以尝试否定一个运算符,例如翻转一个未定义的and。但是,代码会产生False,因为对象是True在布尔上下文中评估的,并且最终会尝试Primitive从一个布尔值的单个参数创建一个新的。

  2. 即使mutFlipBit函数可以区分 aPrimitive和 aTerminal并且只会尝试否定Terminals,deap也会使用符号终结符,因为 a 的主要目标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])得到了一个需要 3 个参数的类的初始化self,例如+ 其他 3 个参数。

于 2015-12-04T05:09:33.440 回答