如何使用DEAP定义遵循特定订单模式的自定义遗传算法个体

时间:2018-05-31 11:56:40

标签: python genetic-algorithm deap

我的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 个答案:

答案 0 :(得分:0)

我有同样的错误。我意识到你的 generate_individual 函数会返回一个list []。因此,当创建新个体时,它将存储在列表中,从而在列表[[]]中为列表提供结果。如果您尝试打印一个人,为了获得所需的列表,您必须使用...

访问它
individual[0]

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

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

修改 我找到了另一个解决这个问题的StackOverflow问题。我认为如果你检查它会很好。看看用户如何创建他的个人:

Question that helped me

答案 1 :(得分:0)

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

我正在做以下似乎很有效的工作。

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

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

答案 2 :(得分:0)

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

答案 3 :(得分: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)