如何使个人成为DEAP中可变长度的列表

时间:2019-11-08 10:29:52

标签: python deap

我正在看Knapsack example,我想将其转置为用列表而不是集合表示个人的情况。

如果我运行此代码段

from deap import creator, base, tools
import random

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

toolbox = base.Toolbox()
toolbox.register("attr_item", random.randrange, 5)
toolbox.register("individual", tools.initRepeat, creator.Individual, 
    toolbox.attr_item, 3)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)

toolbox.population(n=5)

然后我得到以下输出:

Out: [{0, 1}, {0, 1, 4}, {0}, {0, 1, 2}, {0, 2}]

长度为1、2或3的个人。

但是,如果我运行下一个代码段,则仅在第四行中将set更改为list

from deap import creator, base, tools
import random

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

toolbox = base.Toolbox()
toolbox.register("attr_item", random.randrange, 5)
toolbox.register("individual", tools.initRepeat, creator.Individual, 
    toolbox.attr_item, 3)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)

toolbox.population(n=5)

然后所有个体都具有相同的长度。

Out: [[2, 2, 4], [0, 1, 0], [2, 2, 4], [1, 4, 1], [2, 2, 0]]

是否可以建立一个由各种长度的列表组成的个人群体?

1 个答案:

答案 0 :(得分:0)

这并不能真正回答问题,但是我认为可能发生的事情与setlist之间的区别有关。由于集合是不同元素的有序结构,因此,例如,如果将5个随机数1, 3, 1, 5, 4放入集合中,则结果将是{1, 3, 4, 5},即长度为4的集合。但是,如果5个随机数放入列表中,结果将始终是长度为5的列表。

这就是为什么第一个带集合的示例导致长度不同的个人,而第二个带列表的示例导致长度相同的个人的原因。