当我在Python DEAP包

时间:2016-05-01 03:14:46

标签: python algorithm genetic-algorithm evolutionary-algorithm deap

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代的最大适应度下降:

enter image description here

1 个答案:

答案 0 :(得分:0)

统计信息中显示的适应度最大值是当前人口中的最大适应度 ,而不是曾经评估过的所有个体。在eaSimple算法中,没有保持最佳解决方案的机制,因此,适应度max有时会降低。

使用HallOfFame并不能保证最好的人会留在人口中。算法完成后,它只会复制您可以使用的最佳个人。