基于DEAP库的python进化算法-3.简单遗传算法的实现

前言

在上一篇中,我们已经介绍了如何在DEAP中实现进化算法的基本操作,这一篇中我们试图将各个操作组装起来,用进化算法解决一个简单的一元函数寻优问题

一.问题描述与分析

给定一个函数,求解其最大值
在这里插入图片描述
该函数的图像为:
在这里插入图片描述
该函数的最大值应该出现在28.309042309042308处,值为1657.4235763265594。

可以看到该函数有很多局部极值作为干扰项,如果进化算法过早收敛,很容易陷入某个局部最优。

二.问题的编码与解码

对于该问题,可以选取很多不同的编码方式。本文计划采用二进制编码,精确度要求到6位,那么首先应当确定编码的长度与解码方式。由于有:
在这里插入图片描述
所以我们需要的二进制编码长度为26

三.利用DEAP自带算法求解

1.DEAP自带的进化算法介绍

DEAP自带的算法都比较基础,通常可以用来测试问题描述、编码方式和交叉突变操作组合的有效性。需要比较复杂的进化算法时,可以通过在已有的算子上进行扩充
在这里插入图片描述
简单进化算法

deap.algorithms.eaSimple

DEAP中预置的简单进化算法流程描述如下:

1.根据工具箱中注册的toolbox.evaluate评价族群
2.根据工具箱中注册的toolbox.select选择与父代相同个数的育种个体
3.在族群中进行第一次循环,用工具箱中注册的toolbox.mate进行配种,并用生成的两个子代替换对应父代
4.在族群中进行第二次循环,用工具箱中注册的toolbox.mutate进行变异,用变异后的子代替换对应父代
5.从1开始重复循环,直到达到设定的迭代次数

需要注意的是在这个过程中,生成子代有四种情况:受到配种影响;受到变异影响;既受到配种也受到变异影响;既不受配种影响也不受变异影响
对应的伪代码可以表述为:

evaluate(population)
for g in range(ngen):
    population = select(population, len(population))
    offspring = varAnd(population, toolbox, cxpb, mutpb)
    evaluate(offspring)
    population = offspring

(μ + λ)进化算法

deap.algorithms.eaMuPlusLambda

该算法的流程如下:

1.根据工具箱中注册的toolbox.evaluate评价族群
2.在族群中进行循环,在每次循环中,随机选择crossover,mutation和reproduction三者之一:
如果选择到crossover,那么随机选择2个个体,用工具箱中注册的toolbox.mate进行配种,<将生成的第一个子代加入到后代列表中,第二个子代丢弃;
如果选择到mutation,用工具箱中注册的toolbox.mutate进行变异,将变异后的子代加入到后代列表中;
如果选择到reproduction,随机选择一个个体,将其复制加入到后代列表中
3.根据工具箱中注册的toolbox.select,在父代+子代中选择给定数量的个体作为子代
4.从1开始重复循环,直到达到设定的迭代次数

注意在这个子代生成的过程中,子代不会同时受到变异和配种影响。

对应的伪代码可以表述为:

evaluate(population)
for g in range(ngen):
    offspring = varOr(population, toolbox, lambda_, cxpb, mutpb)
    evaluate(offspring)
    population = select(population + offspring, mu)

(μ,λ)进化算法

deap.algorithms.eaMuCommaLambda

与(μ + λ)进化算法基本相同,唯一的区别在于生成子代族群时,只在产生的子代中选择,而丢弃所有父代。
对应伪代码可以表述为

evaluate(population)
for g in range(ngen):
    offspring = varOr(population, toolbox, lambda_, cxpb, mutpb)
    evaluate(offspring)
    population = select(offspring, mu)
2.调用DEAP自带的进化算法

在调用DEAP自带的算法时需要注意的是,由于内置算法调用的alias已经提前给定,因此我们在register的时候,需要按照给定名称注册。

例如toolbox.register('crossover', tools.cxUniform)就不能被内置算法识别,而应当按照
要求,命名为mate,并且显示给出交叉概率: 
toolbox.register('mate', tools.cxUniform, indpb = 0.5)

按照要求,使用预置的算法需要注册的工具有:
toolbox.evaluate:评价函数

toolbox.select:育种选择

toolbox.mate:交叉操作

toolbox.mutate:突变操作
from deap import algorithms, creator, tools, base
from scipy.stats import bernoulli
import numpy as np
import random

random.seed(42)  # 保证结果可以复现
# 定义问题
creator.create('FitnessMax', base.Fitness, weights=(1.0,))  # 单目标优化,最大值问题
creator.create('Individual', list, fitness=creator.FitnessMax)

# 生成个体
gene_size = 26  # 26位编码
toolbox = base.Toolbox()
toolbox.register('Binary', bernoulli.rvs, 0.5)
toolbox.register('Individual', tools.initRepeat, creator.Individual, toolbox.Binary, n=gene_size)


# 解码 - 二进制转换为十进制
def decode(individual):
    # 解码到10进制
    num = int(''.join([str(_) for _ in individual]), 2)
    # 映射到-30到30区间
    x = -30 + num * 60 / (2 ** 26 - 1)
    return x

# 评价函数-适应度
def eval(individual):
    # 转化到区间内实数
    x = decode(individual)
    return ((np.square(x) + x) * np.cos(
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值