Как определить пользовательских генетических алгоритмов, которые следуют определенному шаблону порядка, используя DEAP

Мой индивидуум GA представляет собой случайную последовательность int (например: [4, 5, 10, 11, 8, 12, 9, 13, 2, 6, 3, 7, 0, 14, 15, 1]), которая следует определенному ограничению порядка, которое обрабатывается в другой самоопределяемой функции.

Как я могу включить функцию ограничения заказа в индивидуальную инициализацию DEAP?

Я реализовал этот способ, вдохновленный https://groups.google.com/forum/#!msg/deap-users/KZYYHCGrFyY/x1nXcXpCyscJ:

class MyContainer(list):
    def __init__(self, attributes):
        # Some initialisation with received values
        # self.attr1 = attributes[0]
        pass


def generate_individual(ind_class, size):
    # ind_class will receive a class inheriting from MyContainer
    # individual = ind_class(random.random() for _ in range(size))
    individual = ind_class(random.sample(range(IND_SIZE), k=size))
    individual = make_individual_valid(individual, other_parameters)
    # make_individual_valid is the self-defined order constraint function
    return individual

creator.create('FitnessMin', base.Fitness, weights=(-1.0,))
creator.create('Individual', MyContainer, fitness=creator.FitnessMin)

toolbox = base.Toolbox()
toolbox.register('individual', generate_individual, creator.Individual, size=IND_SIZE)
toolbox.register('population', tools.initRepeat, list, toolbox.individual)

Но я получил ошибку ниже:

AttributeError: 'list' object has no attribute 'fitness'

person Stephanie    schedule 31.05.2018    source источник
comment
Какая часть кода генерирует эту ошибку?   -  person usernumber    schedule 06.11.2019


Ответы (4)


У меня была такая же ошибка. Я понял, что ваши функции generate_individual возвращают список []. Поэтому, когда создается новый человек, он сохраняется в списке, в результате чего получается список внутри списка [[]]. Если вы попытаетесь распечатать одного человека, чтобы получить желаемый список, вам нужно будет получить к нему доступ с помощью...

individual[0]

... чтобы иметь список, который вы создали.

На данный момент я не знаю, как это исправить (так как я новичок в DEAP).

EDIT: я нашел еще один вопрос StackOverflow, который решил эту проблему. Я думаю, было бы неплохо, если бы вы это проверили. Посмотрите, как пользователь создает свою личность:

Вопрос, который мне помог

person Belberus    schedule 13.06.2018

Старая тема, но я столкнулся с ней, так как хочу сделать что-то подобное.

Я делаю следующее, которое, кажется, выполняет эту работу.

pop = toolbox.population(n=POPSIZE)
pop[0] = creator.Individual((1.0 for _ in range(INDSIZE))) # add default individual

Может быть, кто-то может указать, если что-то не так с этим?

person Krrr    schedule 17.08.2020

Вам необходимо определить пользовательскую функцию атрибута и зарегистрировать ее с помощью DEAP. ящик для инструментов

person Vinh Bui    schedule 01.05.2021
comment
подскажите пожалуйста как это сделать - person DanielM; 02.05.2021

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

# Structure initializers
toolbox.register("attr_r", random.uniform, R_MIN, R_MAX)
toolbox.register("attr_l", random.uniform, L_MIN, L_MAX)
toolbox.register("individual", tools.initCycle, creator.Individual,(toolbox.attr_l,
    toolbox.attr_r,toolbox.attr_l,toolbox.attr_l,toolbox.attr_r,toolbox.attr_l,toolbox.attr_l,toolbox.attr_r,toolbox.attr_l), n=N_CYCLES)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
person Vinh Bui    schedule 03.05.2021