DEAP 中无效适应度的重要性是什么?

What's the importance of invalid fitness in DEAP?

我刚开始使用 DEAP。之前我用的是基于Matlab的GA,经过交叉变异后就是select指定大小的更好的个体,然后更新种群。但是我很难理解为什么在DEAP中需要在交叉和变异过程之后评估具有无效适应度的个体:

invalid_ind = [ind for ind in offspring if not ind.fitness.valid]
fitnesses = map(toolbox.evaluate, invalid_ind)
for ind, fit in zip(invalid_ind, fitnesses):
    ind.fitness.values = fit

我试过删除那些代码,但算法似乎永远不会收敛。甚至我也没有看到那些可以更新 population/offspring,所以那些有什么用。提前致谢!!!

经过几次测试后,对无效适应度的个体的评价是为了评价经过交叉和变异程序后的个体的适应度。从这段代码我们可以看出:

# Apply crossover and mutation on the offspring
for child1, child2 in zip(offspring[::2], offspring[1::2]):
    if random.random() < CXPB:
        toolbox.mate(child1, child2)
        del child1.fitness.values
        del child2.fitness.values

for mutant in offspring:
    if random.random() < MUTPB:
        toolbox.mutate(mutant)
        del mutant.fitness.values

使用del删除交叉变异个体的适应度值。所以用invalid_ind = [ind for ind in offspring if not ind.fitness.valid]对select那些个体进行重新评估,这样可以大大减少计算量。此外,我们还可以使用以下方法重新评估整个后代:

fitnesses = map(toolbox.evaluate, offspring)
for ind, fit in zip(offspring, fitnesses):
    ind.fitness.values = fit

如前所述,这会增加计算负担。总而言之,需要重新评估以将适应度分配给每个个体,并准备根据个体的适应度值在 offspring = toolbox.select(pop, len(pop)) 中进行 selection 操作。