2016-11-09 11 views
1

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

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), но я не могу включить это в код без ошибок.

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

ответ

0

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

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], которое кажется довольно избыточным.

0

Вы можете использовать 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) 
+0

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

+0

набор не может содержать списки, потому что они изменяемы и, следовательно, не являются хешируемыми. 'set ([[1,2,3], 3]) ТипError: unhashable type: 'list'' –

+0

О, правильно! Я изменил базу Individual в список. Даже до сих пор список в списке выглядит излишним. – meraxes

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

  • Нет связанных вопросов^_^