Генетический алгоритм DEAP

В настоящее время я использую DEAP для генетического алгоритма в Python. Я хочу создать начальную популяцию особей длиной no_sensors. Моя проблема заключается в том, что из-за функции random.choice(nodes) некоторые узлы оказываются одинаковыми, а начальная длина оказывается меньше no_sensors. Мне было интересно, есть ли способ исправить это:

creator.create("FitnessMax", base.Fitness, weights=(2.0, -1.0))
creator.create("Individual", set, fitness=creator.FitnessMax)

toolbox = base.Toolbox()
toolbox.register("attr_item", random.choice, nodes)
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_item, n=no_sensors)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)

По сути, мне нужна фиксированная длина уникальных элементов из списка nodes. Я думал об использовании random.sample(nodes, no_sensors), но не могу включить это в код без ошибок.

Вы можете посмотреть другой пример здесь.


person meraxes    schedule 09.11.2016    source источник
comment
Установлен ли no_sensors заранее или его значение может быть разным для каждого человека?   -  person usernumber    schedule 05.11.2019


Ответы (2)


Вы можете использовать functools.partial и random.sample:

from functools import partial
import random
no_sensors = 5
mysample = partial(random.sample,k=no_sensors)
toolbox.register("attr_item", mysample, nodes)
person Sebastian Wozny    schedule 09.11.2016
comment
Однако проблема заключается в том, что если random.choice дважды выбирает одно и то же значение, я хочу, чтобы оно считалось одним. По сути, мне нужна фиксированная длина уникальных элементов из списка: узлы. Я думал об использовании random.sample(nodes, no_sensors), но я не могу включить это в код без ошибок. - person meraxes; 09.11.2016
comment
набор не может содержать списки, потому что они изменяемы и, следовательно, не могут быть хешированы.set([[1,2,3],3]) TypeError: unhashable type: 'list' - person Sebastian Wozny; 09.11.2016
comment
О верно! Я изменил базу Individual в список. Тем не менее, список в списке может показаться излишним. - person meraxes; 09.11.2016

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

creator.create("FitnessMax", base.Fitness, weights=(2.0, -1.0))
creator.create("Individual", list, fitness=creator.FitnessMax)

toolbox = base.Toolbox()
toolbox.register("attr_item", random.sample, nodes, no_sensors)
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_item, n=1)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)

Однако это немного некрасиво, поскольку каждый раз, когда вы хотите получить доступ к содержимому списка individual типа Individual, вам придется вызывать individual[0]и перебирать содержимое individual[0], что кажется довольно избыточным.

person meraxes    schedule 13.11.2016