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

遗传算法与深度学习实战(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 timeimport numpy as npfrom deap import algorithms
from deap import base
from deap import benchmarks
from deap import creator
from deap import toolsimport 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 = 3CXPB = .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.5def 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 inddef 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] = minstrategyreturn childrenreturn 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:breakbest = [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.xdnf.cn/news/148404.html

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

相关文章

SSM整合步骤

目录 一、Mybatis整合Spring 1、整合后的maven坐标 2、核心配置文件 3、pojo、mapper、service配置 4、单测 二、整合SpringMVC 1、引入springMVC的坐标并配置tomcat 2、核心配置文件 3、controller配置 4、启动项目并测试 SSM SpringMVC Spring Mybatis 整合顺序&#xff1…

动态线程池(六)

动态线程池 AlarmManager报警管理器 AlarmManager的doAlarmAsync AlarmLimiter警报限流器 AlarmCounter警报计数器 checkThreadhole报警阈值检查 NotifyHelper alarm_keys 向notifyItems填充platformIds 初始化通知 刷新通知 NotifyFilterBuilder 同步 拒绝 RejectedAware 三…

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

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

【题解】—— LeetCode一周小结38

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结37 16.公交站间的距离 题目链接&#xff1a;1184. 公交站间的距…

vscode调试配置文件,微软官方

vscode调试配置文件&#xff0c;微软官方 选择对应的文件夹 在readme中找到配置 在vscode中&#xff0c;点击创建launch.json文件 这时在文件夹中会多一个文件 可以愉快的使用调试功能了

《〈妈妈朋友的儿子〉:一场别样的浪漫与成长之旅》

《〈妈妈朋友的儿子〉&#xff1a;一场别样的浪漫与成长之旅》 最近&#xff0c;一部名为《妈妈朋友的儿子》的韩剧&#xff0c;如同一颗闪耀的新星&#xff0c;在影视的天空中绽放出独特的光芒&#xff0c;吸引了众多观众的目光。今天&#xff0c;就让我们一同走进这个充满温情…

多模态论文串讲-学习笔记(上)

入门参考&#xff1a;跟着chatgpt一起学|多模态入门-CSDN博客 学习参考&#xff1a;多模态论文串讲上【论文精读46】_哔哩哔哩_bilibili&#xff0c;强烈推荐这个博主啊&#xff0c;感觉比沐神讲的还要清楚&#xff0c;非常喜欢。 本文介绍只使用transformer encoder的方法&a…

【软件工程】系统流程图

一、定义 二、常用符号 例题 选择题

空栈压数 - 华为OD统一考试(E卷)

2024华为OD机试&#xff08;E卷D卷C卷&#xff09;最新题库【超值优惠】Java/Python/C合集 题目描述 向一个空栈压入正整数&#xff0c;每当压入一个整数时&#xff0c;执行以下规则&#xff08;设&#xff1a;栈顶至栈底整数依次编号为 $n_1, n_2, \dots, n_x $&#xff0c;其…

Tile View Kanban Board平铺视图和看板

Goto 数据网格和视图入门 平铺视图&#xff08;TileView 类&#xff09;将数据记录显示为平铺。此视图类型可以以任何自定义方式排列多个元素&#xff08;bound 和 unbound&#xff09;。用户可以按如下方式编辑瓦片&#xff1a; 使用模态 Edit Form。利用 HTML-CSS 平铺模板…

MySQL(七)——事务

文章目录 事务事务的概念事务的ACID特性事务的语法查看存储引擎查看自动提交参数和设置手动事务操作保存点 隔离级别与并发事务问题隔离级别并发事务问题 事务 事务的概念 事务&#xff08;Transaction&#xff09;是数据库管理系统中执行过程中的一个逻辑单位&#xff0c;由…

高效打造知识图谱,使用LlamaIndex Relik实现实体关联和关系抽取

大家好&#xff0c;文本信息转化为知识图谱的技术&#xff0c;自问世以来一直是研究界的宠儿。大型语言模型&#xff08;LLMs&#xff09;的兴起让这个领域受到更多关注&#xff0c;但LLMs的成本之高令人却步。然而通过对小型模型微调优化&#xff0c;可以找到一种更经济高效的…

Linux中的环境变量及main函数参数详解

目录 Linux中的环境变量 常见环境变量 PATH : 和环境变量相关的命令 通过系统调用获取或设置环境变量 getenv putenv 新增环境变量 进程切换&#xff1a; main函数参数 命令行参数 Linux中的环境变量 环境变量(environment variables)一般是指在操作系统中用来指定操…

面试速通宝典——1

1. 内存有哪几种类型&#xff1f; ‌‌‌‌  内存分为五个区&#xff0c;堆&#xff08;malloc&#xff09;、栈&#xff08;如局部变量、函数参数&#xff09;、程序代码区&#xff08;存放二进制代码&#xff09;、全局/静态存储区&#xff08;全局变量、static变量&#…

GNU链接器(LD):什么是符号?符号定义及实例解析

0 参考资料 GNU-LD-v2.30-中文手册.pdf GNU linker.pdf1 前言 一个完整的编译工具链应该包含以下4个部分&#xff1a; &#xff08;1&#xff09;编译器 &#xff08;2&#xff09;汇编器 &#xff08;3&#xff09;链接器 &#xff08;4&#xff09;lib库 在GNU工具链中&…

手动实现逻辑回归算法(LogisticRegression)

目录 1. 前言 2. 示例 3. 原理介绍 4. 实验代码 1. 前言 逻辑回归是一种解决分类问题的算法 值得注意的是&#xff0c;在机器学习中&#xff0c;回归指的是连续型数据的预测问题。而这里的逻辑回归特指分类任务&#xff0c;比如判断一个人是否患病、是否健康等等 逻辑回归…

nodejs基于vue+express度假村旅游管理系统设计与实现7t82p

目录 功能介绍数据库设计具体实现截图技术栈技术论证解决的思路论文目录核心代码风格详细视频演示源码获取 功能介绍 实现了一个完整的农家乐系统&#xff0c;其中主要有用户表模块、关于我们模块、收藏表模块、公告信息模块、酒店预订模块、酒店信息模块、景区信息模块、景区…

ARM(Day 2)

一、作业 &#xff08;1&#xff09;汇编代码 .text.globl _start_start:mov r0, #0x5mov r1, #0x10比较r0,r1 是否相等 相等执行stop 不相等执行下一步比较&#xff08; r0 > r1 ?&#xff09;cmp r0, r1 比较实际在做减法 (YES NO )subhi r0, r0, r1 r0 > r1 …

VLDB 2024 圆桌会议回顾:展望物联网与 AI 时代的时序数据库

回顾我们在 VLDB 2024 8 月 26 日至 8 月 30 日&#xff0c;数据库领域的顶级国际会议 VLDB 2024 在广州举行。IoTDB 最新研发成果的三篇论文被本次大会录用&#xff08;详见&#xff1a;IoTDB 在顶级会议 VLDB 2024&#xff1a;四篇最新论文入选&#xff0c;特邀做 TPC 报告与…

MySQL篇(存储过程 触发器 存储函数)(持续更新迭代)

目录 一、存储过程 1. 简介 2. 特点 3. 语法 3.1. 创建 3.2. 调用 3.3. 查看 3.4. 删除 4. 示例 二、变量 1. 简介 2. 系统变量 2.1. 查看系统变量 2.2. 设置系统变量 2.3. 演示示例 3. 用户定义变量 3.1. 赋值 方式一 方式二 3.2. 使用 3.3. 演示示例 4.…