Как определить индивидуальных пользователей Генетического алгоритма, которые следуют определенному порядку, используя 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/:
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'
4 ответа
У меня была такая же ошибка. Я понял, что ваши функции generate_individual возвращают список []. Поэтому, когда создается новый индивид, он сохраняется в списке, давая результат в виде списка внутри списка [[]]. Если вы попытаетесь напечатать одно лицо, чтобы получить желаемый список, вам нужно будет получить к нему доступ...
individual[0]
... чтобы иметь список, который вы создали.
На данный момент я не знаю, как это исправить (так как я новичок в DEAP).
РЕДАКТИРОВАТЬ: я нашел еще один вопрос Stackru, который решил эту проблему. Я думаю, что было бы хорошо, если бы вы проверили это. Посмотрите, как пользователь создает своего индивидуума:
Старая ветка, но я столкнулся с ней, так как хочу сделать что-то подобное.
Я делаю следующее, что, кажется, делает мою работу.
pop = toolbox.population(n=POPSIZE)
pop[0] = creator.Individual((1.0 for _ in range(INDSIZE))) # add default individual
Может кто укажет, если с этим что не так?
Вам необходимо определить функцию настраиваемого атрибута и зарегистрировать ее с помощью DEAP. ящик для инструментов
Например, приведенный ниже код создает людей с двумя отдельными атрибутами.
# 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)