Пользовательское представление населения с пакетом Python deap
Я использую пакет Python deap. Моя проблема состоит в том, чтобы получить мою популяцию из набора данных и генерировать ее из генов. Например: у меня есть [[1,2,0,0,...],[1,3,4,0,...],...] в качестве набора данных, и я хочу выбрать случайные n элементов из этот набор данных для моего населения. Вот код создания Населения случайных двоичных чисел 0 или 1 и вектора 100 в len:
import random
from deap import base
from deap import creator
from deap import tools
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)
toolbox = base.Toolbox()
toolbox.register("attr_bool", random.randint, 0, 1)
toolbox.register("individual", tools.initRepeat, creator.Individual,
toolbox.attr_bool, 100)
# define the population to be a list of individuals
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
Обратите внимание, что я мог бы просто использовать random.sample(Data_set, Num_of_ind), чтобы сделать свою популяцию, но это не будет работать с пакетом deap. Мне нужно решение, работающее с пакетом Deap.
1 ответ
На самом деле, вы можете использовать random.sample() внутри DEAP. Вам просто нужно зарегистрировать функцию, а затем передать ее человеку при регистрации:
# Example of dataset (300 permutations of [0,1,...,99]
data_set = [random.sample(range(100), 100) for i in range(300)]
toolbox = base.Toolbox()
# The sampling is used to select one individual from the dataset
toolbox.register("random_sampling", random.sample, data_set, 1)
# An individual is generated by calling the function registered in
# random_sampling, with the input paramters given
toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.random_sampling)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
Обратите внимание, что каждый человек будет составлен из списка, содержащего список значений (что-то вроде [[7, 40, 87, ...]]
, Если вы хотите удалить внешний список (чтобы иметь [7, 40, 87, ...]
вместо), вы должны заменить random_sampling
от:
toolbox.register("random_sampling", lambda x,y: random.sample(x,y)[0], data_set, 1)