使用 Python 包 deap 的自定义人口表示

Custom representation of population with Python package deap

我正在使用 Python 软件包 deap。 我的问题是从数据集中获取人口而不是从基因中生成人口。 例如: 我有 [[1,2,0,0,...],[1,3,4,0,...],...] 作为数据集 我想从这个数据集中 select 随机 n 个元素作为我的人口。 这是使随机二进制数的数量为 0 或 1 的代码,向量为 100 in 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 包的解决方案。

实际上,您可以在 DEAP 中使用 random.sample()。只需要注册函数,然后在注册的时候传给个人即可:

# 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)