1

DEAP 是一个很棒的 Python 包,用于支持进化算法。

现在,我从简单的示例OneMax Problem中学习它

启用 HallofFame “它将跟踪出现在进化中的最佳个体(即使在它消失的情况下也会保留它)”

但是当我使用它时,种群在进化过程中的最大适应度有时会降低一点。

我认为当最好的父母离开时,fitness.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 代的最大适应度下降:

在此处输入图像描述

4

1 回答 1

1

统计数据中出现的适应度最大值是当前群体中的最大适应度,而不是曾经评估过的所有个体的适应度最大值。在该eaSimple算法中,没有保持最佳解的机制,因此适应度最大值有时会降低并不罕见。

使用HallOfFame并不能保证最好的个体会留在群体中。它只是复制算法运行完成后可以使用的最佳个体。

于 2019-11-06T12:42:30.263 回答