DEAP是支持进化算法的一个很棒的Python包。
现在,我从简单的例子OneMax Problem
中学习使用 HallofFame ,“它将跟踪在演变中出现的最佳个体(即使在它消失的情况下也能保持这种状态)”
但是当我使用它时,通过进化过程的人口最大适应度有时会略微降低。
我认为当最好的父母离开时,健身.Max应该永远不会减少,但保持不变或增加。
这是我直接在DEAP网站上复制的代码。
import array
import random
import numpy
from deap import algorithms
from deap import base
from deap import creator
from deap import tools
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", array.array, typecode='b', fitness=creator.FitnessMax)
toolbox = base.Toolbox()
# Attribute generator
toolbox.register("attr_bool", random.randint, 0, 1)
# Structure initializers
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_bool, 100)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
def evalOneMax(individual):
return sum(individual),
toolbox.register("evaluate", evalOneMax)
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)
toolbox.register("select", tools.selTournament, tournsize=3)
def main():
random.seed(64)
pop = toolbox.population(n=300)
hof = tools.HallOfFame(1)
stats = tools.Statistics(lambda ind: ind.fitness.values)
stats.register("avg", numpy.mean)
stats.register("std", numpy.std)
stats.register("min", numpy.min)
stats.register("max", numpy.max)
pop, log = algorithms.eaSimple(pop, toolbox, cxpb=0.5, mutpb=0.2, ngen=40,
stats=stats, halloffame=hof, verbose=True)
return pop, log, hof
if __name__ == "__main__":
main()
如果需要,我可以尝试详细说明。欢呼声。
第3代的最大适应度下降:
答案 0 :(得分:0)
统计信息中显示的适应度最大值是当前人口中的最大适应度 ,而不是曾经评估过的所有个体。在eaSimple
算法中,没有保持最佳解决方案的机制,因此,适应度max有时会降低。
使用HallOfFame
并不能保证最好的人会留在人口中。算法完成后,它只会复制您可以使用的最佳个人。