合作协同进化

本示例探讨了使用 DEAP 进行合作协同进化。本教程在类型创建和其他基础内容方面不如之前的示例完整。相反,我们涵盖了在 DEAP 中应用的协同进化概念。假设如果使用了工具箱中的一个函数,它已被正确注册。本示例为实现您自己的协同进化算法提供了一个很好的模板,它基于 [Potter2001] 对合作协同进化的描述。

共进化实际上只是deap中算法工作方式的扩展。多个种群依次(或在多个处理器上同时)进化,就像在传统的遗传算法中一样。因此,共进化的实现非常直接。第一个循环用于迭代种群,第二个循环迭代这些种群中的个体。

第一步是创建一群将在我们种群中进化的物种。

    species = [toolbox.species() for _ in range(NUM_SPECIES)]

合作共进化通过将每个物种的最佳个体(称为代表)发送来帮助评估其他物种的个体。由于个体尚未评估,我们随机选择将成为代表集合中的个体。

    representatives = [random.choice(species[i]) for i in range(NUM_SPECIES)]

评估函数接受一个待评估的个体列表,包括其他物种的代表,以及可能的其他参数。由于篇幅原因,这里不详细展示,其结构通常如下所示

def evaluate(individuals):
    # Compute the collaboration fitness
    return fitness,

进化现在可以开始了。

    while g < ngen:
        # Initialize a container for the next generation representatives
        next_repr = [None] * len(species)
        for (i, s), j in zip(enumerate(species), species_index):
            # Vary the species individuals
            s = algorithms.varAnd(s, toolbox, 0.6, 1.0)

            # Get the representatives excluding the current species
            r = representatives[:i] + representatives[i+1:]
            for ind in s:
                # Evaluate and set the individual fitness
                ind.fitness.values = toolbox.evaluate([ind] + r, target_set)

            # Select the individuals
            species[i] = toolbox.select(s, len(s))  # Tournament selection
            next_repr[i] = toolbox.get_best(s)[0]   # Best selection

        representatives = next_repr

最后几行在共享它们的代表之前,每个物种进化一次。进化算法中的共同部分都存在,变异、评估和选择发生在每个物种中。物种索引只是一个唯一编号,用于标识每个物种,它可以用来为每个新增物种保持独立的统计数据。

在进化每个物种之后,按照 [Potter2001] 中描述的步骤来添加物种并移除停滞的无用物种。这些步骤在本示例中没有涉及,但在协同进化示例的完整源代码中有所体现。

[Potter2001] (1,2)

Potter, M. 和 De Jong, K., 2001, 合作共进化:一种为进化协同适应子组件的架构。