进化策略基础¶
进化策略是一种特殊的进化计算算法,其中变异强度在进化过程中被学习。第一种策略(内生性)直接将个体的每个属性的变异强度包含在个体内部。这种变异强度与经典遗传算法中的个体一样,受到进化的影响。更多详情,[Beyer2002] 提供了一个非常好的进化策略介绍。
为了实现这种进化,我们需要一种包含 策略 属性的个体。我们还将最小化目标函数,从而产生以下类的创建。
creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
creator.create("Individual", array.array, typecode="d", fitness=creator.FitnessMin, strategy=None)
creator.create("Strategy", array.array, typecode="d")
进化策略的初始化函数在DEAP中没有定义。以下生成函数以要实例化的个体类 icls 作为参数。它还以要使用的策略类 scls 作为策略。接下来的参数是个体和策略属性的最小值和最大值。策略被添加到返回个体的 strategy 成员中。
def generateES(icls, scls, size, imin, imax, smin, smax):
ind = icls(random.uniform(imin, imax) for _ in range(size))
ind.strategy = scls(random.uniform(smin, smax) for _ in range(size))
return ind
这个生成函数像其他初始化器一样在工具箱中注册。
toolbox.register("individual", generateES, creator.Individual, creator.Strategy,
IND_SIZE, MIN_VALUE, MAX_VALUE, MIN_STRATEGY, MAX_STRATEGY)
该策略控制变异的标准差。通常会有一个下限值,以防止算法仅陷入利用阶段。这个下限值通过以下装饰器添加到变异操作符中。
def checkStrategy(minstrategy):
def decorator(func):
def wrappper(*args, **kargs):
children = func(*args, **kargs)
for child in children:
for i, s in enumerate(child.strategy):
if s < minstrategy:
child.strategy[i] = minstrategy
return children
return wrappper
return decorator
变异操作符通过工具箱的 decorate() 方法进行装饰,评估函数取自 benchmarks 模块。
toolbox.register("mate", tools.cxESBlend, alpha=0.1)
toolbox.register("mutate", tools.mutESLogNormal, c=1.0, indpb=0.03)
toolbox.decorate("mate", checkStrategy(MIN_STRATEGY))
toolbox.decorate("mutate", checkStrategy(MIN_STRATEGY))
从这里开始,剩下的工作要么是编写算法,要么使用 algorithms 中提供的算法。这里我们将使用 eaMuCommaLambda() 算法。
def main():
MU, LAMBDA = 10, 100
pop = toolbox.population(n=MU)
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, logbook = algorithms.eaMuCommaLambda(pop, toolbox, mu=MU, lambda_=LAMBDA,
cxpb=0.6, mutpb=0.3, ngen=500, stats=stats, halloffame=hof)
return pop, logbook, hof
完整的 examples/es/fctmin。
[Beyer2002]
Beyer 和 Schwefel, 2002, 进化策略 - 全面介绍