用遗传算法(GA)做最优化:找一元及多元函数的最大值

2023-11-03

一元函数

对于如下图所示的一元函数求解其在区间[0,7]内的最大值有多种方式。在本文中分享的是用一种启发式算法——遗传算法来完成这项工作。
在这里插入图片描述大家对遗传算法不了解的话可以戳这里看简介。
首先介绍我们的主角,也就是目标函数的形式。其定义如下:

def F(x): return np.sin(5*x)+ np.cos(4*x)  

由于我们在这里要找的是函数的最大值点,那么只需直接使用其函数值的大小作为适应度函数的主体即可。同时不要忘记处理边界问题:减去输入的种群个体适应度序列中的最小值以保证最终结果为非负数,再加上一个很小的值保证适应度为正值。

def Get_Fitness(val): return val - np.min(val) + 1e-6

当然,在遗传算法运行过程中,染色体以二进制序列的形式存在。为了能将他们代入到目标函数中计算对应的函数值以及进行适应度的计算,我们还要做DNA的解码:

def Translate_DNA(pop): return pop.dot(2 ** np.arange(DNA_SIZE)[::-1]) / (2**DNA_SIZE-1) * X_BOUND[1]

根据目标DNA序列的长度(长度越长,其能表示的真实值的颗粒度也就越精细,结果越精确),将二进制的DNA序列映射到对应的函数自变量上(注意取值范围)。上面代码的基本操作就是二步:
1.将二进制转换为十进制下区间[0,1]间的数。
2.将对应十进制序列的数比照相应的取值范围来缩小或放大。

下面就是遗传算法的主体部分了,首先是自然选择、优胜劣汰的过程:

def Select(pop, fitness):    
    index = np.random.choice(np.arange(POP_SIZE), size=POP_SIZE, replace=True,p=fitness/fitness.sum())
    return pop[index]

这一步可以使用numpy库中的choice函数完成,他会根据一个概率分布来随机返回序列中的值。
适应度高的个体有更高的被选中作为下一代的父辈的可能。

其次是配对,出色的个体们在这一步进行基因重组(染色体交叉联会),在保留亲代一定特性的基础上引入了新的可能性:

def Mating (parent, pop):     
    if np.random.rand() < MATING_RATE:
        index = np.random.randint(0, POP_SIZE, size=1)                            
        cross_points = np.random.randint(0, 2, size=DNA_SIZE)                    
        parent[cross_points] = pop[index, cross_points]                            
    return parent

子代会分别得到来自父母的部分基因,最终成长为一个全新的个体。

在基因重组的过程中,子代基因也有几率发生突变

def Mutation(child):
    for point in range(DNA_SIZE):
        if np.random.rand() < MUTATION_RATE:
            child[point] = 1 if child[point] == 0 else 0
    return child

这一步只需随机地对子代基因上的某些碱基对进行改变即可(0变1或1变0)。

效果

在这里插入图片描述经过若干次的迭代,我们可以看到多数个体集中在了函数的最大值点附近。说明遗传算法确实能够帮助我们解决一元函数的优化问题。不过在测试的时候也会偶尔发生以下这种状况:
在这里插入图片描述可以看到,我们算法生成的个体有往局部最大值收敛的趋势,而这并不是我们想要看到的结果。对于这类在遗传算法中,求解结果很快陷入函数的局部最优解的现象,我们把它叫做早熟现象(prematurity)。由于理论上考虑的遗传算法的选择、变异、交叉等操作过程是绝对精确的,而在实际代码实现过程中会不可避免地产生精度损失。这部分误差最终导致搜索过程逐步偏离期望路径,种群中个体的多样性过早地丧失,算法迭代陷入了局部最优值。有很多相关的文献针对早熟收敛做了研究:[1]提出了可以使部分种群个体的再初始化来防止早熟的方法;[2]使用马尔可夫链来提高GA算法的收敛质量;[3]则对染色体交叉的过程做了改进。

在这里插入图片描述
当我们遇到如上图形式的多元函数并需要对其求最大或最小值时(比如替代梯度下降来对神经网络中的权值进行更新优化),GA算法也同样可以派上用场。只需在上述优化一元函数的代码基础上做一些修改即可得到下图的结果:
在这里插入图片描述
可以看到多次迭代后的种群个体基本集中在了函数图像的最高峰。

本节代码可见这里:github

参考文献
[1] E. S. Nicoară “Mechanisms to Avoid the Premature Convergence of Genetic Algorithms." Petroleum-Gas University of Ploiesti Bulletin, Mathematics-Informatics-Physics Series 61.1 (2009).
[2] L. Ming, Y. Wang, and Y. M. Cheung, “On convergence rate of aclass of genetic algorithms”. In Automation Congress, 2006.WAC’06. World (pp. 1-6). IEEE.
[3] Aldallal A S . Avoiding Premature Convergence of Genetic Algorithm in Informational Retrieval Systems[J]. international journal of intelligent systems & applications in engineering, 2015, 2(4).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用遗传算法(GA)做最优化:找一元及多元函数的最大值 的相关文章

  • Python 打造最强表白程序(源码)

    此程序结合数据抓取 微信自动发消息 定时任务 实现一个能每天自动定时给你心爱的 ta 发送 你们相识相恋天数 情话 我爱你的图片 具体的消息如下 每天发送的消息格式如下 message 亲爱的 早上好 今天是你和 Koc 相恋的第 天 今天
  • C++性能测试工具——gperftools的安装

    一 软件安装说明 gperftools的安装有两种方式 一种是源码方式 一种是直接安装模式 这里使用源码安装模式 原因是使用直接安装模式比较简单 安装此软件需要先安装libunwind这个软件 所以这里需要通过源码方式安装libunwind

随机推荐

  • 【机器学习】支持向量机【上】硬间隔

    有任何的书写错误 排版错误 概念错误等 希望大家包含指正 在阅读本篇之前建议先学习 机器学习 拉格朗日对偶性 机器学习 核函数 由于字数限制 分成两篇博客 机器学习 支持向量机 上 硬间隔 机器学习 支持向量机 下 软间隔与核函数 支持向量
  • CSS布局flex布局 对齐 等分 均分 详解

    一切都始于这样一个问题 怎样通过 CSS 简单而优雅的实现水平 垂直同时居中 记得刚开始学习 CSS 的时候 看到float属性不由得感觉眼前一亮 顺理成章的联想到 Word 文档排版中用到的的左对齐 右对齐和居中对齐 然而很快就失望的发现
  • 【leetcode】1143.最长公共子序列

    leetcode 1143 最长公共子序列 题目 思路 代码 复杂度 题目 leetcode原题链接 给定两个字符串 text1 和 text2 返回这两个字符串的最长 公共子序列 的长度 如果不存在 公共子序列 返回 0 一个字符串的 子
  • 如何快速查看并定位网页元素代码

    如何快速查看并定位网页元素代码 目的 可以迅速得找出一个网页中对应元素的html代码 1 首先我们打开一个网页 比如 百度首页 2 打开后我们会看到很多的文字链接以及按钮链接 那么我们找到我们想要查看的元素的文字或者按钮 3 我们这里以 百
  • @Cacheable注解属性介绍

    本文目录 1 value cacheNames 属性 2 key属性 3 keyGenerator 属性 4 cacheManager 属性 5 cacheResolver 属性 6 condition 属性 7 unless 属性 8 s
  • C++导出EXCEL开源库xlslib库使用心得

    使用教程 第一步 下载xlslib库 本文建立在xlslib2 5 0版本基础上 下载地址xlsLib download SourceForge net 第二步 切换到解压文件目录xlslib build msvc2008 打开项目xlsl
  • linux查询jvm运行内存使用情况,在Linux下获取正在运行的JVM的总使用内存

    您可以运行 ps aux grep java 这将显示包含在其推出的字符串java的每个应用程序的内存使用情况 这应该是大多数 如果不是所有的Java应用程序 从我的服务器的输出如下 servername servername ps aux
  • 超过飞飞系列-ZYNQ之FPGA学习2.1Verilog语法

    一 VHDL Verilog C语言区别 VHDL 硬件描述语言 美军开发 相对难 不直观 需要专业培训 欧洲发展较好 Verilog 硬件描述语言 设计群体广泛 资源成熟 中国多采用 并行处理运行 C 软件语言 经过C的单片机程序需取码
  • 简单工厂(Simple Factory)

    文章目录 1 代码示例 2 简单工厂模式的定义 实现意图 工厂模式 通过把创建对象的代码包装起来 做到创建对象的代码与具体的业务逻辑代码相隔离的目的 工厂模式可以细分为 简单工厂模式 工厂方法模式 抽象工厂模式 1 代码示例 include
  • servlet实现图片的上传

    servlet实现图片的上传 我们通常说的上传图片 是将图片上传到服务器上面 本篇以tomcat为例 实现简单的本地图片上传服务器 一 图片的上传需要引入两个jar包 commons fileupload 1 4 jar 下载地址 http
  • 深度详解 View.post() 为何能够获取到 View 的宽高值?

    文章目录 1 简介 1 1 问题描述 1 2 结果展示 2 源码分析 2 1 View post 方法添加任务 2 2 HandlerActionQueue post 方法添加任务 2 3 探究 AttachInfo 的由来 2 3 1 A
  • 爬取在线论坛帖子:使用 Python 获取帖子及评论

    在这篇博客中 我们将学习如何使用 Python 编写一个网络爬虫 从一个在线论坛 例如 Reddit 中获取帖子及其评论 我们将使用 requests 和 BeautifulSoup 库来实现这个功能 文章将包括以下内容 目录 1 爬虫的基
  • 重写、覆盖、重载、隐藏、多态几个概念的区别分析

    override gt 重写 覆盖 overload gt 重载 polymorphism gt 多态 override是重写 覆盖 了一个方法 以实现不同的功能 一般是用于子类在继承父类时 重写 重新实现 父类中的方法 成员函数的重载 o
  • 论文阅读:CLIP2Video: Mastering Video-Text Retrieval via Image CLIP

    动机 之前的大多都是试图从大规模的视频文本数据集中提取视频的时空特征以及视频和语言之间的多模式交互 作者将在图像语言中预训练的模型迁移到视频文本检索任务中 而之前这种使用这种方式的工作大多都是基于证明这种迁移学习是有效的 以验证CLIP模型
  • [BABEL] Note: The code generator has deoptimised the styling of "unknown" as it exceeds the max of "

    BABEL Note The code generator has deoptimised the styling of unknown as it exceeds the max of 500KB babelrc文件添加 compact
  • 构建Python pandas基于SSH远程MySQL和PostgreSQL的数据分析

    如果您无法从外部环境直接访问数据库 则可能需要SSH隧道来查询它 在这篇文章中 我将向您展示如何通过SSH连接并查询MySQL数据库到Pandas数据框 可以将相同的代码应用于连接到其他数据库 例如PostgreSQL 假设您的数据库托管在
  • Spring 基础教程之一:Spring简介

    明天就要讲传说中的spring了 不知道它是否像老师说的那样简单且神奇 spring的英文翻译是春天 泉水 弹簧 活跃的意思 不知道像我们这样的距找工作还有50天左右的人来说 我们的春天是否到了 在这个春天我们是否能够喝上甘甜的泉水 然后像
  • aps是什么意思_全画幅大还是中画幅大? 为什么说底大一级压死人

    经典摄影教程 总第十期 书接上文 是什么造成了画面的 空间感 其中我们谈到了当我们使用不同焦距的时候 我们的拍摄距离往往也会改变 但是这个焦距说的就是等效焦距 在什么是等效焦距 一文中 也说了等效焦距是因为传感器大小不同产生的讨厌的东西 那
  • Redis零基础小白篇

    一 Redis概述 1 是什么 是存在内存中的数据库 是Key Value数据库 MySQL是关系数据库 2 能干什么 一个程序中大部分操作都是查询 少部分操作是写入 所以用MySQL作存储 Redis作查询 所有查询先查询Redis 没有
  • 用遗传算法(GA)做最优化:找一元及多元函数的最大值

    一元函数 对于如下图所示的一元函数求解其在区间 0 7 内的最大值有多种方式 在本文中分享的是用一种启发式算法 遗传算法来完成这项工作 大家对遗传算法不了解的话可以戳这里看简介 首先介绍我们的主角 也就是目标函数的形式 其定义如下 def