遗传算法与深度学习实战(14)——进化策略详解与实现

news2024/11/15 19:42:30

遗传算法与深度学习实战(14)——进化策略详解与实现

    • 0. 前言
    • 1. 进化策略
      • 1.1 进化策略原理
      • 1.2 将进化策略应用于函数逼近
    • 2. 实现进化策略
    • 小结
    • 系列链接

0. 前言

进化策略 (Evolutionary Strategies, ES) 是进化计算和遗传方法的扩展,增加了控制亚基因或表现型(称为策略)的内容。这些策略只是一个额外的向量,用于控制或影响突变算子。这为 ES 提供了更有效地解决各种复杂问题的能力,包括函数逼近。在本节中,我们将使用 ES 探索函数逼近问题。简单起见,首先尝试逼近已知连续多项式解的函数参数。然后,再转向更复杂的不连续解,观察 ES 的表现。

1. 进化策略

1.1 进化策略原理

进化策略 (Evolutionary Strategies, ES) 是一类基于生物进化原理的优化算法,主要用于解决复杂的优化问题。ES 与“纯粹”的遗传算法不同之处在于,个体携带额外的基因序列或向量,称为策略。在进化过程中,这个策略向量学习调整并应用更好、更精细的突变到个体进化中。我们已经知道,突变和突变率就像深度学习 ( Deep learning, DL) 中的学习率,突变控制了进化过程中种群的变异能力。突变率越高,种群的变异能力和多样性就越大。在迭代过程中控制和学习突变率,能够更有效地确定解决方案。

1.2 将进化策略应用于函数逼近

进化策略与其他进化算法(如遗传算法)的主要区别在于其更专注于实值优化问题,并且强调策略参数的自适应性,这使得它们在处理复杂的、多维的优化问题时表现出色。
接下来,实现一个 ES 算法来逼近已知解,还将讨论如何随着迭代的进行学习优化突变,使种群更好地收敛和逼近解。

2. 实现进化策略

(1) 首先导入所需库,并定义超参数,IND_SIZE 值控制解决多项式函数的维度,或者说基因大小;MAX_TIME 超参数用于控制运行进化的总时间,这是控制进化运行时间的有效方法,而并不依赖于世代数;最后,策略分配超参数 MIN_VALUE、MAX_VALUEMIN_STRATEGYMAX_STRATEGY 控制突变向量:

import array
import random
import time

import numpy as np

from deap import algorithms
from deap import base
from deap import benchmarks
from deap import creator
from deap import tools

import matplotlib.pyplot as plt
from IPython.display import clear_output
IND_SIZE = 6
NGEN = 1000
MIN_VALUE = 4
MAX_VALUE = 5
MIN_STRATEGY = 0.5
MAX_STRATEGY = 3

CXPB = .6
MUTPB = .3
GEN_OUTPUT = 25
MAX_TIME = 5

(2) 构建初始目标数据集。在本节中,使用三个方程进行评估:一个 5 次多项式连续函数和两个不连续函数( absstep)。使用范围参数处理数据以生成 XY 值,并将它们压缩到列表 data 中。最后,绘制折线图来可视化目标函数:

equation_form = "polynomial" #@param ["polynomial", "abs", "step"]

X_START = -5
X_END = 5
X_STEP = 0.5

def equation(x):
  if equation_form == "polynomial":
    return (2*x + 3*x**2 + 4*x**3 + 5*x**4 + 6*x**5 + 10) 
  elif equation_form == "abs":    
    return abs(x)
  else:    
    return np.where(x>1, 1, 0)     

X = np.array([x for x in np.arange(X_START, X_END, X_STEP)])
Y = equation(X)
data = list(zip(X, Y))

plt.plot(X,Y)

下图显示了 5 次多项式函数以及 stepabs 函数的折线图。首先针对连续多项式函数,观察 ES 如何高效地逼近解决方案。另外两个函数代表不连续函数,它们是不可微分的,因此通常无法通过深度学习 ( Deep learning, DL) 网络解决。

可视化

(3) 接下来,设定 creator,观察进化策略 (Evolutionary Strategies, ES) 与典型遗传算法 (Genetic Algorithms, GA) 的区别。注册 FitnessMinIndividual,不同之处在于,在注册 Individual 时,添加了一个额外的属性 Strategy,设置为 None,最后注册列表类型 (array.array) 为 double(d)Strategy

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")

(4) 定义 generateES()checkStrategy() 函数,generateES() 函数使用传入的参数创建个体,其中 icls 表示用于构建个体的类,scls 表示用于构建策略的类,checkStrategy() 函数使用装饰器模式检查策略,以确保向量保持在某个最小值以上。通过初始化个体设置,基因序列中的每个随机值都设置在最小值和最大值之间。同样,策略的初始化遵循相同的模式,但使用不同的最小/最大值。这样就生成了大小分别为 IND_SIZENDIM 的两个向量,其中一个用于定义主要基因序列,另一个用于在交叉和突变操作期间应用于每个基因的学习突变和交叉率:

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

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

(5) 设置 toolbox,使用 generatES() 函数初始化一个个体,其中输入参数包括 creator.Individualcreator.StrategyIND_SIZEMIN_VALUEMAX_VALUEMIN_STRATEGYMAX_STRATEGY。交叉操作使用一个特殊的 ES 混合操作符来组合父代,而不是常规交叉中的替换操作符。同样,突变操作使用 ES 对数正态操作来控制包含策略的突变,然后对交叉和突变操作应用一个装饰器 checkStrategy,装饰器为输入提供了一个过滤机制:

print(checkStrategy(MIN_STRATEGY))
toolbox = base.Toolbox()
toolbox.register("individual", generateES, creator.Individual, creator.Strategy,
    IND_SIZE, MIN_VALUE, MAX_VALUE, MIN_STRATEGY, MAX_STRATEGY)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
toolbox.register("mate", tools.cxESBlend, alpha=0.1)
toolbox.register("mutate", tools.mutESLogNormal, c=1.0, indpb=0.03)
toolbox.register("select", tools.selTournament, tournsize=3)

toolbox.decorate("mate", checkStrategy(MIN_STRATEGY))
toolbox.decorate("mutate", checkStrategy(MIN_STRATEGY))

(6)toolbox 中添加适应度评估函数。函数 pred() 用于通过循环遍历个体基因,并将它们与 xi 次方相乘来得出一个值;另一个函数 fitness() 循环遍历 data 中的 xy 值,使用 pred 函数来确定均方误差 (Mean-square Error, MSE),返回的最终值是平均 MSE,在本节中,我们通过将数据集作为参数传递给 register() 函数来将数据集传递给 evaluate()函数:

def pred(ind, x):    
    y_ = 0.0    
    for i in range(1,IND_SIZE):
        y_ += ind[i-1]*x**i    
    y_ += ind[IND_SIZE-1]       
    return y_

def fitness(ind, data):    
    mse = 0.0    
    for x, y in data:        
        y_ = pred(ind, x)
        mse += (y - y_)**2        
    return mse/len(data),

# fitness eval
toolbox.register("evaluate", fitness, data=data)

def plot_fitness(g, best, pop, logbook):
    Y_ = np.array([pred(best, x) for x in X])
    clear_output()
    best = [round(b,1) for b in best]
    print(f"Generation {g}, Best {best}")
    print(logbook.stream) 
    fits = [f.fitness.values[0] for f in pop]  
    plt.hist(fits)
    plt.show()
    plt.scatter(X,Y)
    plt.plot(X,Y_, 'r')
    plt.show()  

(7) 执行进化过程,首先定义超参数 MULAMBDA,它们表示父代的种群和派生后代的数量。这意味着在选择过程中,选择 MU 个父代,使用 DEAP 算法 eaMuCommaLambda() 生成 LAMBDA 个后代。在本节中,我们不仅限制总的代数,还限制了算法运行的时间。如果运行的时间(以秒为单位)超过了阈值 MAX_TIME,则进化停止,跟踪运行的时间使我们能够评估比较进化计算方法:

MU, LAMBDA = 250, 1000
pop = toolbox.population(n=MU)
hof = tools.HallOfFame(1)
stats = tools.Statistics(lambda ind: ind.fitness.values)
stats.register("avg", np.mean)
stats.register("std", np.std)
stats.register("min", np.min)
stats.register("max", np.max)

start = time.time()
for g in range(NGEN):
    pop, logbook = algorithms.eaMuCommaLambda(pop, toolbox, mu=MU, lambda_=LAMBDA, 
                cxpb=CXPB, mutpb=MUTPB, ngen=1, stats=stats, halloffame=hof, verbose=False)
    if (g+1) % GEN_OUTPUT == 0:
        plot_fitness(g, hof[0], pop, logbook) 
        end = time.time()
        if end-start > MAX_TIME:
            break

best = [round(i,1) for i in hof[0]]
print("Best individual is ", best, round(hof[0].fitness.values[0],2))

下图显示了将进化运行到最长时间( 5 秒)后的最终输出示例。可以返回并修改进化运行的时间,看看是否可以获得更好的结果,或者尝试其他函数如 abs()step()。我们可能会发现 ES 在不连续解中的效果不如预期,这主要是由于算法对函数的逼近方式有关。

运行结果

然而,将 ES 与经典遗传算法进行比较,我们会发现它在连续问题上收敛更快。这是因为 ES 通过学习的突变和交叉策略来管理种群的多样性。可以通过完成以下问题进一步理解进化策略的基本概念:

  • 修改目标函数,然后重新运行,观察效果
  • 修改代码中的超参数,观察每种变化对结果演化的影响

虽然 ES 是对经典遗传算法的一个很好的改进,但它仍然缺乏快速高效地收敛不连续解的能力。

小结

进化策略与遗传算法的主要区别在于其专注于实值优化问题和策略参数的自适应性,适用于复杂的目标函数和高维空间中的优化问题。在工程设计、机器人、经济学等领域,进化策略已被广泛应用,为在复杂环境中搜索最优解决方案提供了有效的工具。在本节中,我们使用 DEAP 实现了进化策略探索函数逼近问题。

系列链接

遗传算法与深度学习实战(1)——进化深度学习
遗传算法与深度学习实战(2)——生命模拟及其应用
遗传算法与深度学习实战(3)——生命模拟与进化论
遗传算法与深度学习实战(4)——遗传算法详解与实现
遗传算法与深度学习实战(5)——遗传算法中常用遗传算子
遗传算法与深度学习实战(6)——遗传算法框架DEAP
遗传算法与深度学习实战(7)——DEAP框架初体验
遗传算法与深度学习实战(8)——使用遗传算法解决N皇后问题
遗传算法与深度学习实战(9)——使用遗传算法解决旅行商问题
遗传算法与深度学习实战(10)——使用遗传算法重建图像
遗传算法与深度学习实战(11)——遗传编程详解与实现
遗传算法与深度学习实战(12)——粒子群优化详解与实现
遗传算法与深度学习实战(13)——协同进化详解与实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2157149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python学习手册(第四版)】学习笔记24-高级模块话题

个人总结难免疏漏&#xff0c;请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 本来计划中秋发布几篇文章&#xff0c;结果阳了&#xff0c;发烧、头疼、咽疼&#xff0c;修养了近一周&#xff0c;还没好完。希望大家都能有个好身体&#xff0…

proteus仿真软件简体中文版网盘资源下载(附教程)

对于电子通信专业的小伙伴来说&#xff0c;今天文章的标题应该不会陌生。Proteus是一款具有广泛应用的仿真软件&#xff0c;它的功能非常强大&#xff0c;适用于所有单片机的仿真工作&#xff0c;能够从原理图、调试、到与电路的协同仿真一条龙全部搞定&#xff0c;受到所有用户…

自己开发了一个电脑上滚动背单词的软件

在这个快节奏的时代&#xff0c;我们每天都在忙碌中度过&#xff0c;手机虽然方便&#xff0c;但往往难以找到一整块时间来专心背单词。然而&#xff0c;你是否意识到&#xff0c;每天坐在电脑前的时间远比使用手机的时间要长&#xff1f;现在我们来介绍一个新型的学习软件灵思…

Fyne ( go跨平台GUI )中文文档-容器和布局 (四)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章&#xff1a; Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

XSS—xss-labs靶场通关

level 1 JS弹窗函数alert() <script>alert()</script> level 2 闭合绕过 "> <script>alert()</script> <" level 3 onfocus事件在元素获得焦点时触发&#xff0c;最常与 <input>、<select> 和 <a> 标签一起使用…

科研绘图系列:R语言多个AUC曲线图(multiple AUC curves)

文章目录 介绍加载R包导入数据数据预处理画图输出结果组图系统信息介绍 多个ROC曲线在同一张图上可以直观地展示和比较不同模型或方法的性能。这种图通常被称为ROC曲线图,它通过比较不同模型的ROC曲线下的面积(AUC)大小来比较模型的优劣。AUC值越大,模型的诊断或预测效果越…

生成自签名证书和私钥

可以使用 OpenSSL 来生成自签名证书&#xff08;linux上执行&#xff09;&#xff1a; openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes生成 key.pem&#xff08;私钥&#xff09;和 cert.pem&#xff08;证书&#xff09; 当执行这个 …

某集群管理系统存在任意文件读取漏洞

你为什么要拼命努力&#xff1f;父母的白发&#xff0c;想去的地方很远&#xff0c;想要的东西很贵&#xff0c;喜欢的人很优秀&#xff0c;周围人的嘲笑&#xff0c;以及&#xff0c;天生傲骨。 漏洞描述 利用漏洞&#xff0c;攻击者可以读取 Windows 或 Linux 服务器上的任…

ER论文阅读-Decoupled Multimodal Distilling for Emotion Recognition

基本介绍&#xff1a;CVPR, 2023, CCF-A 原文链接&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/papers/Li_Decoupled_Multimodal_Distilling_for_Emotion_Recognition_CVPR_2023_paper.pdf Abstract 多模态情感识别&#xff08;MER&#xff09;旨在通过语言、…

基于STM32残疾人辅助行走系统

要么是家人陪伴&#xff0c;要么是类似导盲犬的动物辅助&#xff0c;家人还有事要做&#xff0c;不一定实时在场&#xff0c;而动物辅助也可能会出现新的问题&#xff0c;威胁残疾人身体安全。因此利用现代计算机技术、传感器检测设备和物联网技术设计这一款辅助残疾人行走的智…

.NET常见的5种项目架构模式

前言 项目架构模式在软件开发中扮演着至关重要的角色&#xff0c;它们为开发者提供了一套组织和管理代码的指导原则&#xff0c;以提高软件的可维护性、可扩展性、可重用性和可测试性。 假如你有其他的项目架构模式推荐&#xff0c;欢迎在文末留言&#x1f91e;&#xff01;&a…

基于微信小程序的家教信息管理系统的设计与实现(论文+源码)_kaic

摘 要 随着互联网时代的来临&#xff0c;使得传统的家教模式已不复存在&#xff0c;亟需一种方便、快捷的在线教学平台。因此&#xff0c;利用Java语言作为支撑和MySQL数据库存储数据&#xff0c;结合微信小程序的便利性&#xff0c;为用户开发出了一个更加人性化、方便的家庭…

Centos 9 Steam扩容硬盘

要将 sda 的剩余空间扩展给 cs-root&#xff0c;可以按照以下步骤进行操作。假设你已经有剩余的未分配空间在 sda 上。 步骤 1&#xff1a;查看当前磁盘分区情况 首先&#xff0c;确保你有未分配的空间在 sda 上。 lsblk步骤 2&#xff1a;创建新的分区 使用 fdisk 或 par…

Apache Arrow IPC 消息格式

Apache Arrow 的 IPC&#xff08;Inter-Process Communication&#xff0c;进程间通信&#xff09;消息格式是一种用于在不同进程间高效传输数据的序列化格式&#xff0c;它允许不同系统或语言环境中的应用程序以统一的方式交换数据&#xff0c;而无需关心数据的具体存储细节。…

【网络安全】身份认证+wan优化+终端控制

用户身份认证 在允许用户访问你的网络时对其进行验证是至关重要的。不幸的是很多情况下&#xff0c;简单的用户名与密码验证并不可靠。公司通常需要更强大的针对访问信息价值较高系统(例如网络管理员系统与财务系统)的用户群体的验证。 双因子身份验证是根据“你知道的”和“你…

faiss安装 (CPU版本)

faiss版本 faiss-v1.7.4 cd faiss-v1.7.4cmake -B build . -DBUILD_TESTINGOFF -DFAISS_ENABLE_GPUOFF -DFAISS_ENABLE_PYTHONOFFmake -C build -j faiss&#xff1b; 默认安装路径如下 -- Installing: /usr/local/lib64/libfaiss.a -- Installing: /usr/local/include/faiss…

VMware vCenter Server 7.0U3s 发布下载,新增功能概览

VMware vCenter Server 7.0U3s 下载 - 集中管理 vSphere 环境 Server Management Software | vCenter | 集中管理 vSphere 环境 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vcenter-7-u3/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者…

WebGL颜色与纹理

WEBGL中的着色器变量包括以下种类&#xff1a; 属性变量&#xff08;Attribute Variables&#xff09;&#xff1a;这些变量用于接收从应用程序中传递的顶点数据&#xff0c;比如顶点位置和颜色&#xff0c;是只读的不可修改。统一变量&#xff08;Uniform Variables&#xff…

通过docker启动ElasticSearch后为ElasticSearch设置用户和密码

文章目录 0. 前言1. 没有设置用户名和密码的情况2. 为ElasticSearch设置用户名和密码2.1 进入 ElasticSearch 容器内部2.2 修改 ElasticSearch 的配置文件2.3 设置用户名和密码 3. 在 kibana 容器中指定访问 ElasticSearch 的用户名和密码4. 设置用户名和密码后的情况4.1 访问 …

QT For Android开发-打开PPT文件

一、前言 需求&#xff1a; Qt开发Android程序过程中&#xff0c;点击按钮就打开一个PPT文件。 Qt在Windows上要打开PPT文件或者其他文件很容易。可以使用QDesktopServices打开文件&#xff0c;非常方便。QDesktopServices提供了静态接口调用系统级别的功能。 这里用的QDesk…