2015-12-03 2 views
0

Я пишу свой первый эволюционный алгоритм с помощью DEAP. Все работает, но оператор мутации MultiFlipBit. При попытке мутировать дерево (Individual), я получаю следующее сообщение об ошибке:TypeError с Python DEAP mutFlipBit

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

Редакции: После предложения о том, как решить эту проблему, я добавил к ОЭАП библиотеке мутаций пару «печать», чтобы лучше понять, что происходит. Вот та же ошибка, как и на оригинальный вопрос, но с некоторой дополнительной информацией:

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) 

Еще раз спасибо за любые СПОСОБСТВУЕТ

ответ

0

Ошибки жалующаяся, что вы пытаетесь использовать deap.tools.mutFlipBit функцию как мутатор на indivual, который является экземпляром 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.

Таким образом, если код решил мутировать элемент i из individual, он пытается оценить deap.dp.Primitive(not ind[i]). И ошибка жалуется, что конструктор Primitive принимает 4 аргумента, self, name, args, ret вместо пройденного self, (not ind[1]).

Причиной ошибки является двойной,

  1. mutBitFlip мутатором является будучи применяется к человеку, который состоит из списка обоих «символических значений» и «операторов», вместо список логических элементов, как ожидалось. Таким образом, код может попытаться свести на нет оператора, например. fliping и, который не определен. Однако код будет генерировать False, потому что объект оценивается в True в булевом контексте и в конечном итоге пытается создать новый Primitive из одного аргумента, который является логическим значением.

  2. Даже если mutFlipBit функции может различать между Primitive и Terminal, и только попытаться бы свести на нет Terminal с, deap будет использовать символических терминалов, так как основная мишень PrimitiveTree не найти ни одного выражение, эквивалентного к значению (то есть константе), а скорее к выражениям с аргументами, эквивалентными функции.

Вы должны пересмотреть то, что вы пытаетесь развиваться, выражение, которое отображает в логическое уравнение или множество аргументов в булевой функции. И основывается на том, что редизайн вашего кода.

ПЕРВИЧНЫЙ ОТВЕТ:

Ваш код не является полным, так как линия offspring = varOr(population, toolbox, lambda_, cxpb, mutpb) не показана.

Однако проблема связана с типом одного из ваших invidivuals в вашей переменной population. Код при условии, что ваши индивиды списка булевых, поэтому код individual[i] = type(individual[i])(not individual[i]) будет работать:

x = True 
print type(x)(not x) # Equivalent of bool(True) => False 

ошибка говорит, что type(individual[i]) получил Init класса, который ожидает 3 аргумента, например, self + другие 3 аргумента.

+0

Привет memoselyk, спасибо за ответ. varOr является частью одного из стандартных алгоритмов DEAP: eaMuPlusLambda. – InterceptK

+0

Мне не удалось разобраться с проблемой, но я не уверен, что понял ваше предложение. Я отредактировал свой вопрос, чтобы включить дальнейшие результаты и дать некоторые подсказки по этой проблеме. Пожалуйста, взгляните на это. Еще раз спасибо и извини, если я не понял ваше предложение правильно. – InterceptK

+0

@InterceptK, спасибо, источник «varOr» отсутствовал в первой трассировке, но теперь все стало яснее ... – memoselyk

Смежные вопросы