合作协同进化¶
本示例探讨了使用 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] 中描述的步骤来添加物种并移除停滞的无用物种。这些步骤在本示例中没有涉及,但在协同进化示例的完整源代码中有所体现。