我刚刚开始使用DEAP。以前,我使用基于Matlab的GA,在交叉和变异之后选择具有指定大小的更好的个体,然后更新群体。但是我很难理解为什么在DEAP中,在交叉和变异过程之后需要评估具有无效适应性的个体:
qdevicewatcher_p.h
我尝试删除这些代码,但似乎算法永远不会收敛。即使我没有看到那些可以更新人口/后代,所以这些用途是什么。在此先感谢!!!
答案 0 :(得分:1)
经过少量测试后,对有效适应性的个体进行评估是为了评估交叉和变异程序后个体的适应性。我们可以从这段代码中看到:
# 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))
中基于个人适合度值的选择操作做好准备。