7

我刚开始使用 DEAP。之前,我使用基于Matlab的遗传算法,经过交叉和变异后,选择指定大小的更好个体,然后更新种群。但是我很难理解为什么在 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

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

4

1 回答 1

6

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

# 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]用于选择那些个体进行重新评估,这样可以显着减少计算量。此外,我们还可以使用以下方法重新评估整个后代:

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

如前所述,这会增加计算负担。总而言之,需要重新评估以将适应度分配给每个个体,并为offspring = toolbox.select(pop, len(pop))基于个体适应度值的选择操作做好准备。

于 2017-06-23T13:23:36.743 回答