Количество выбранных лиц для алгоритма eaSimple из DEAP с выбором selBest - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь запустить алгоритм eaSimple из модуля DEAP . Я хотел бы указать количество людей, которые будут выбраны в каждом поколении. Однако, если я укажу параметр k для функции выбора , я получу ошибку.

from deap import base, tools, creator, algorithms
import random
import numpy as np

def fitness(individual):
    x = individual[0]
    y = individual[1]
    return np.exp(-9*x*y) * np.sin(3*np.pi*x)**2 * np.sin(3*np.pi*y)**2,

toolbox = base.Toolbox()

creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)
toolbox.register("individual", tools.initRepeat, creator.Individual, random.random, n=2)

toolbox.register("population", tools.initRepeat, list, toolbox.individual)

toolbox.register('evaluate', fitness)
toolbox.register('mutate', tools.mutPolynomialBounded, eta=.6, low=[0,0], up=[1,1], indpb=0.1)
toolbox.register('mate', tools.cxUniform, indpb=0.5)
toolbox.register('select', tools.selBest, k=50)

pop = toolbox.population(n=100)

pop, logbook = algorithms.eaSimple(pop, toolbox, cxpb=0.5, mutpb=0.1, ngen=100)

Последняя строка в этом примере вызывает ошибку

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-5ee0faee2c49> in <module>
----> 1 pop, logbook = algorithms.eaSimple(pop, toolbox, cxpb=0.5, mutpb=0.1, ngen=100)

/usr/local/lib64/python3.7/site-packages/deap/algorithms.py in eaSimple(population, toolbox, cxpb, mutpb, ngen, stats, halloffame, verbose)
    163     for gen in range(1, ngen + 1):
    164         # Select the next generation individuals
--> 165         offspring = toolbox.select(population, len(population))
    166 
    167         # Vary the pool of individuals

TypeError: selBest() got multiple values for argument 'k'

Обратите внимание, что замена строки toolbox.register('select', tools.selBest, k=50) на toolbox.register('select', tools.selBest) устраняет ошибку.


Какое значение по умолчанию k здесь и как мне указать собственное значение для k?

1 Ответ

0 голосов
/ 05 ноября 2019

В алгоритме eaSimple выбор фактически не выполняется. Из документации , псевдокод, описывающий то, что происходит под капотом, гласит:

population = select(population, len(population))

Это означает, что подмножество населения размером с первоначальную популяцию, т.е. выбран для мутации, спаривания и оценки.

Затем алгоритм выполняет

population = offspring

, поэтому все особи, возникающие в результате мутации и спаривания, заменяют всех родителей.


Это также (вроде) отвечает на вторую часть вопроса: с помощью eaSimple невозможно указать пользовательское значение для k в методе selBest.

...