2

我的 GA 个体是一个随机序列int(例如:)[4, 5, 10, 11, 8, 12, 9, 13, 2, 6, 3, 7, 0, 14, 15, 1],它遵循在另一个自定义函数中处理的特定顺序约束。

如何将我的订单约束函数合并到DEAP个人初始化中?

我在https://groups.google.com/forum/#!msg/deap-users/KZYYHCGrFyY/x1nXcXpCyscJ的启发下实现了这种方式:

class MyContainer(list):
    def __init__(self, attributes):
        # Some initialisation with received values
        # self.attr1 = attributes[0]
        pass


def generate_individual(ind_class, size):
    # ind_class will receive a class inheriting from MyContainer
    # individual = ind_class(random.random() for _ in range(size))
    individual = ind_class(random.sample(range(IND_SIZE), k=size))
    individual = make_individual_valid(individual, other_parameters)
    # make_individual_valid is the self-defined order constraint function
    return individual

creator.create('FitnessMin', base.Fitness, weights=(-1.0,))
creator.create('Individual', MyContainer, fitness=creator.FitnessMin)

toolbox = base.Toolbox()
toolbox.register('individual', generate_individual, creator.Individual, size=IND_SIZE)
toolbox.register('population', tools.initRepeat, list, toolbox.individual)

但我得到以下错误:

AttributeError: 'list' object has no attribute 'fitness'
4

4 回答 4

2

我有同样的错误。我意识到您的generate_individual函数返回一个列表 []。因此,当创建一个新个体时,它会存储在一个列表中,并在列表 [[]] 中给出一个列表。如果您尝试打印一个人,为了获得您想要的列表,您必须使用...

individual[0]

...拥有您创建的列表。

目前我不知道如何解决这个问题(因为我是 DEAP 的新手)。

编辑: 我发现了另一个解决此问题的 StackOverflow 问题。我想如果你检查一下就好了。看看用户如何创建他的个人:

对我有帮助的问题

于 2018-06-13T22:53:51.373 回答
0

您需要定义一个自定义属性函数并使用 DEAP 注册它。工具箱

于 2021-05-01T22:49:20.403 回答
0

一个旧线程,但我遇到了它,因为我想做类似的事情。

我正在做以下似乎可以完成工作的事情。

pop = toolbox.population(n=POPSIZE)
pop[0] = creator.Individual((1.0 for _ in range(INDSIZE))) # add default individual

也许有人可以指出这是否有问题?

于 2020-08-17T11:49:45.867 回答
0

例如,下面的代码创建具有 2 个单独属性的个人。

# Structure initializers
toolbox.register("attr_r", random.uniform, R_MIN, R_MAX)
toolbox.register("attr_l", random.uniform, L_MIN, L_MAX)
toolbox.register("individual", tools.initCycle, creator.Individual,(toolbox.attr_l,
    toolbox.attr_r,toolbox.attr_l,toolbox.attr_l,toolbox.attr_r,toolbox.attr_l,toolbox.attr_l,toolbox.attr_r,toolbox.attr_l), n=N_CYCLES)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
于 2021-05-03T03:49:33.420 回答