遗传算法matlab_遗传算法和MATLAB (更新中)

2023-11-01

0. 文章目的

本人写这样一篇文章的目的在于提供一张学习遗传算法的地图。实现的主要工具是MATLAB和其自带的全局优化工具箱 Global Optimization Toolbox。无论读者是来自工程、科学或者其他任何领域,希望看完文章之后都能实现自己的遗传算法!欢迎留言交流。

如何通俗易懂地解释遗传算法?有什么例子?​www.zhihu.com

知乎上也有相关的问题,可以看下前两个高赞回答对于养成直觉上的理解很有帮助。


1. 遗传算法简介

遗传算法 (Genetic Algorithm) 是一种基于自然选择启发式的随机并行搜索优化方法。该算法特殊之处在于其借鉴了进化生物学中的很多概念,其中包括遗传、突变、自然选择和杂交等。抽象的来说,我们将会学到怎么模拟一个人工种群的进化过程。相比基于梯度的传统优化方法,遗传算法可以解决不连续、不可微的目标函数的优化问题。尤其擅长解决时间表安排 (例如为一个大学安排不冲突的课表), 在下一篇文章中我们将会看到一个具体的例子和代码。

1.1 遗传算法流水线 (pipeline)

0)预处理:编码优化问题。

1)随机初始化一定数量的初始种群,种群中每一个个体(提前编码成二进制形式)代表优化问题的一个候选解。从生物学意义上来说,我们可以认为个体代表染色体或者基因片段。

2)通过遗传算子(genetic operator)进化至下一代种群。算子的主要构成:

  • 通过适应度函数 (fitness),给当前种群中的每一个个体评分。该评分被称为原始适应成绩 (raw fitness score),用来表征个体对环境的适应度。同时也代表了候选解的优劣程度。
  • 针对具体问题,缩放原始适应成绩到一个更合理的区间。缩放后的成绩称为期望值(expectation)。
  • 基于期望值,通过选择函数(selection function)挑选具有优秀基因的父母 (parents)。对于某些适应度很高的个体,我们称之为精英 (elite)。他们将被直接保留到下一代种群。
  • 父母产生后代 (children)。生产方式主要有以下两种:父母中一方的染色体产生突变(mutation)、父母双方按照一定概率交换部分基因 (crossover)。
  • 完成后取代当前种群的所有个体。

3)满足终止条件(stopping criteria)后,选出迭代进化的种群中最优个体。

以上部分参考了MATLAB的GA官方文档:

How the Genetic Algorithm Works​ww2.mathworks.cn

1.2 可调节参数

  • 种群规模(population size):即种群中染色体个体的数目。
  • 字符串长度(string length):个体中染色体的长度。
  • 交配概率(probability of performing crossover):控制着交配算子的使用频率。交配操作可以加快收敛,使解达到最有希望的最佳解区域,因此一般取较大的交配概率,但交配概率太高也可能导致过早收敛,则称为早熟。
  • 突变概率(probability of mutation):控制着突变算子的使用频率。
  • 中止条件(termination criteria)

关于调参的细节请参见官方文档:

Genetic Algorithm​ww2.mathworks.cn

2. 例子与概念详解

接下来我们通过一个具体的优化例子,来进一步认识以上提及的概念:

求解函数

在区间
的最大值和最小值。

画出函数图像和:

*注释:在遗传算法优化中,我们默认求的是最大值问题

。而最小值问题则可以转化为
,其中
。这是因为我们一般规定
在定义域内恒正
。如不满足,也可以转化成
。常数
在我们的例子里可以取

*注释:我们这个例子中

虽然是一个单变量,但对多变量优化问题来说就需要改成向量
其中每个元素可以有自己的定义域

2.1 编码和解码 (code and decode)

遗传算法的第一步是对优化问题进行编码,映射到一个方便基因进化的码空间。主要存在实数编码和二进制编码两种方式。在这个例子中,我们采用传统上偏向的二进制编码。其具有稳定性高、种群多样性(diversity)等优点,但需要的存储空间较大而且解码过程不易理解。

假设我们求解的精度为小数点后四位,即

。我们需要将
的解空间划分成
等分。使
满足以下不等式
,其中
是使上式成立的最小整数,也表示
的基因串的长度。因为
,这里取
例如
就表示一个码空间中的基因串。对于多变量优化问题,编码后
的二进制串的总长度称为一个染色体(chromosome)或者个体(individual)的长度。

类似的,解码过程就是一个逆向的从码空间映射到解空间的过程。对于二进制编码,每个二进制基因串都可以翻译成一个十进制的实数值。这个我们都很熟悉,

请注意这里是从左至右进行转码的。然后再把这个十进制实数映射到相应的区间,我们知道

对应区间下限的转码
对应区间上限的转码。

通过对区间编码过程的观察,我们构造以下映射并验证其合理性:

接着完成我们前面选定个体的解码过程,

2.2 初始化种群

接着我们随机生成一定数量的个体。如果知道种群的实际分布,当然可以按照此分布提高初始种群的质量。初始种群的数量很重要,如果初始种群数量过多,算法会占用大量系统资源;如果初始种群数量过少,算法很可能忽略掉最优解。

function

假设初始种群大小 n = 5,染色体长度 m = 16。得到以下码空间内部的初始种群矩阵:

2.3 适应度函数

接下来我们解码到解空间中,并评分得到每个个体的原始适应成绩 (raw fitness score)。

function

如果我们给前面初始的种群

打分,会得到

其中第4个染色体的表现似乎最好,不如直接选为精英个体(elite)保留到下一代,就不给他脱单的机会了:)。。。接着我们可视化一下这些初始个体:

*注释:遗传算法在适应度函数选择不当的情况下有可能收敛于局部最优,而不能达到全局最优。如果一个优化问题没有确切的适应度函数表征个体好坏的问题,算法会失去进化导向。

2.4 (可选) 原始适应成绩的缩放(scaling)和排序(rank)

缩放的目的在于让选择机制更好的运行。如果缩放后的期望值范围太大,表现最好的个体可能繁衍过快,与很多其他个体交换基因从而导致种群的基因库里充斥着这个单一个体的基因,损失多样性。这种现象被称之为早熟,算法会快速收敛到局部最优解而非全局最优解。在相反的情况下,如果缩放后的期望值变化范围很小,每个个体能繁衍后代的几率都差不多。这会导致算法收敛的很慢。。。排序是将种群中的个体按照适应度从小到大进行排列。

[

2.5 选择机制

接着我们来看一下常用的轮盘赌博(Roulette Wheel Selection)选择法。根据上面5个染色体的例子,他们作为一个种群的原始总评分为:

每个染色体被选择的概率是:

比方说个体一被选中的概率就是

那么算法上,具体要怎么做才能让第一个个体被选中的概率正好等于

呢?考虑一下操作,在每次转动转盘时,生成一个随机数
然后把区间划分成种群大小=5份。即
占比分别对应选取概率
。这样的话,只要判断转盘落在哪个区间内,我们随即选择相应区间对应的个体即可!
function

*注释:这里只选了一个精英个体,读者不妨试试选择多个精英个体会产生怎么样的影响

在上面这个轮盘赌博算法中,我默认了精英选择机制。也就是说,把这一代的最优解自动保留到下一代。然后在剩下的基因库里选择父代和母代,接着我们前面的例子:

细心的读者会发现,我们没有让每代的精英在他所在的时代繁衍的机会。但这不意味着在下一代,他没机会脱单。也就是说只要你足够优秀老牛吃嫩草是完全可能的。。。我们接着来看看这一个初始种群是怎么通过遗传算子进化到下一代的。

2.6 变异(mutation)和交叉操作(crossover)

选定好父代和母代之后,进入交配过程。一般的遗传算法都有一个交配概率

(又称为交叉概率),范围一般是0.6~1,这个交配概率反映两个被选中的个体进行交配的概率。例如,交配概率为0.8,则80%的“夫妻”会生育后代。
这里考虑到算法的收敛速度,我们考虑“优生优育”政策。限制每两个个体通过交配只能产生一个新个体,而不交配的个体则保持不变。交配父母的染色体相互交换,从而产生两个新的染色体, 新个体前半段是父亲的染色体,后半段是母亲的。不过这里的半段并不是真正的一半,这个位置叫做交配点
,也是随机产生的,可以是染色体的任意位置。直观上你可以这么理解:

然后交配点在4个基因位,产生的孩子便会是

function

还是回到我们前面的例子,设定

,我们得到繁衍后的种群

再下一步是突变,通过突变产生新的“子”个体。一般遗传算法都有一个固定的突变常数

(又称为变异概率),通常是0.1或者更小,这代表变异发生的概率。根据这个概率,新个体的染色体随机的突变,通常就是改变染色体的一个字节(0变到1,或者1变到0)。在编码过的遗传算法中,每次变异的编码长度也影响到遗传算法的效率。如果变异代码长度过短,变异的多样性会受到限制;如果变异代码过长,变异的效率会非常低下,选择适当的变异长度是提高效率的关键。此外,存在着一些方法增加基因的多样性从而防止过早的收敛。其中一种是所谓
触发式超级变异,就是当染色体群体的质量下降(彼此的区别减少)时增加变异概率;另一种叫 随机外来染色体,是偶尔加入一些全新的随机生成的染色体个体,从而增加染色体多样性。
function

*注释:这里我们每次只允许一个基因点变异其实是限制了遗传多样性的。

设定突变概率

,我们得到突变后的种群

接着我们可视化一下第二代种群的适应程度:

可以看出,种群的累计适应度是按照我们给出的进化方向上升了的。但是由于我们初始种群数量太小,基因库同化趋势比较明显(3个个体都集中在同一处)。我们可以大胆预测,就算进化迭代20次以后依然很难达到全局最大值。不妨验证一下:

不出所料。这是个典型的例子:由于种群多样性的不足,使得我们无法跳出局部最大值。可以尝试的解决方案就是增大初始种群数量。

2.7 遗传算法主体程序

在搭建完以上的所有轮子之后,我们来看看算法的主体部分

function

调参过后,运行多次遗传算法取结果最大值如下:


3. 例子:使用MATLAB全局优化工具箱寻找全局最小值

那么在搭建完我们自己的遗传算法(破铜烂铁轮子)之后,我们来看看官方的工具箱(军火库)该怎么使用。先从同样的例子开始讲解:

3.1 工具箱入门

求解函数

在区间
的最大值和最小值。
optimtool

我们先打开优化工具箱,来到以下界面。选项是真的多。。不愧是MATLAB军火库。

*注释:默认GA工具箱找的全局最小值,所以我们最大值问题得通过取负号变换取得。

填写适应度函数 (Fitness function)以及上下限

后点击开始。在经过65次迭代后,得到全局最大值为
以及
。不得不说,官方优化过的运行速度是真的快。。。

3.2 可视化选项

我们选择可视化最优适应度

3.3 算子选项


4. 拓展:约束条件问题

往往现实当中遇到的实际问题不会像我们的例子这么简单,经常是带有约束条件的。那我们接下来具体看看第二个例子:


5. 编程挑战

读者若有多余的时间不妨尝试挑战以下问题:

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

遗传算法matlab_遗传算法和MATLAB (更新中) 的相关文章

  • 如何快速实现Modbus RTU和Modbus TCP协议转换?

    Modbus协议是工业现场串口设备之间常用的连接方式 其中最常见的就是Modbus RTU和Modbus TCP两种 许多工厂需要将现场各种不同型号设备的数据都能够通过一个上位机软件或者设备触摸屏整合起来监控管理 目前上位机大部分用的Mod
  • element table表格滚动条

    项目场景 table表头过长需要添加滚动条 问题描述 原因 一般情况表头过长 会自动出现滚动条 但是在大型项目开发过程中 有的情况会在总的母版文件中设置禁用滚动条 所以当需要滚动条时 找不到 解决方案 添加css样式 display blo
  • VS中写QT的软件如何输出安装包exe文件

    1 选择Release 和对应的平台 我这里是X64的 2 点击本地Windows调试器 在项目文件当中找到release中找到自己的exe文件 3 复制exe文件到新的文件夹 然后打开对应平台的命令行 我这里是64位的所以要选VS 201
  • 奖励模型Reward Model如何训练?

    image png 如上图所示 ChatGPT 并不是直接让人工去标注每一句话的真实得分是多少 尽管模型最终要预测的就是每句话的得分 而是让人去对 4 句话按照好坏程度进行 排序 通过这个 排序序列 模型将会学习如何为每一个句子进行打分 用
  • Fabric模块功能介绍(一)

    主要有5个模块 分别是peer orderer cryptogen configtxgen configtxlator 模块 功能 peer 主节点模块 负责存储区块链数据 运行维护链码 orderer 交易打包 排序模块 cryptoge
  • python爬虫+数据分析(MySQL)+可视化(echarts,词云)bootstrap前端界面展示

    以下需要一些html css mysql python bootstrap基础 python爬虫 数据分析 准备 在pycharm python的开发环境 需下载 该项目下下载相应需要的包 代码有 import re from bs4 im
  • 在网页中嵌入天气信息

    方式1 在后台通过webservice天气接口信息 比较好自定义和灵活设置但是代码量和复杂度都比较大 方式2 使用js库调用 原始漂亮 但是局限性比较大 方式3 使用一些平台开放的代码 可以直接使用 样式多样 分享 http weather
  • 数据库驱动mysql-connector-java-5.1.46-bin.jar下载及在idea中导入该jar包

    数据库驱动mysql connector java 5 1 46 bin jar下载及在idea中导入该jar包 参考资料 https www cnblogs com bj171104 p 12705567 html https blog
  • Object.setPrototypeOf 与 Object.create() 的区别

    在讲之前 我们先回顾下创建对象的几种方式 并且Object new Object 和 Object create 的区别 字面量方式创建对象 let person name nick 构造函数式创建对象 let person new Obj
  • 【yarn】yarn LocalizedResource 状态机正常执行流程

    1 概述 上一篇文章 Yarn Yarn Service端如何处理客户端提交的任务 在上一篇文章中 我们知道服务器接收到客户端提交的任务之后 会启动多个状态机进行联合操作 最终来解决任务提交之后的全流程 多个状态机合作完成任务 然后我们看了
  • 移植Opencv 1.10到WINCE/WM

    本文来自http blog csdn net hellogv 引用必须注明出处 如何把opencv1 10移植到wince WM 因为如果懂得裁剪opencv 那么就可以在更多设备 PC 手机 开发板 上玩更多更好玩的算法 因此 移植和裁剪
  • Unity小技巧之发射弓箭,弓箭朝向问题

    很多初学的小伙伴 遇到一个问题就是在实例化弓箭或其他物体时 弓箭的朝向会随着人物的转向而改变 例如这样 错误演示 那如何解决呢 只需要将箭的正前方作为添加力的方向代码如下所示 GameObject game Instantiate Reso
  • Java代码一键生成神器,支持Jpa/Mybatis/plus多种ORM框架,亲测好用

    2023年08月11日重磅升级 点击访问 Java代码生成神器 自动化生成Java实体类 代码 增删改查功能 今天给大家介绍一款绝对让你惊艳的Java代码生成器 这款神器可以支持输入json sql和Java实体类 自动识别语言类型 并生成
  • 关于对象能不能直接访问私有成员的问题

    对象能不能直接访问私有成员 分两种情况 如果是在类 包括友元类 内定义的对象 可以 在类外 不行 举个简单的例子 include
  • 使用maven的插件(tomcat)启动web工程方法

    前言 现在很多公司的web项目都是使用SpringBoot来搭建的 但是有一个国产开源框架JFinal 快速开发框架 使用的人数慢慢也变多了 对于集中式开发的小项目 使用JFinal框架很快捷 真的 基于JFinal框架 有一个EOVA系统
  • 旋转彩色三叶草

  • Android面试汇总-Android内存和性能优化面试

    一 app优化 app优化 工具 Hierarchy Viewer 分析布局 工具 TraceView 测试分析耗时的 App启动优化 布局优化 响应优化 内存优化 电池使用优化 网络优化 App启动优化 针对冷启动 App启动的方式有三种
  • 数据结构与算法:去除重复字母

    给你一个仅包含小写字母的字符串 请你去除字符串中重复的字母 使得每个字母只出现一次 需保证返回结果的字典序最小 要求不能打乱其他字符的相对位置 示例 1 输入 bcabc 输出 abc 示例 2 输入 cbacdcbc 输出 acdb 解题
  • IPC(Inter-Process Communication, 进程间通信)

    之前在面试的时候经常问道Android的进程间通信方式有几种 当时在百度上搜索的答案不尽相同 后来在看源码分析的时候才发现了答案 现在记下来 Android是是使用了Linux内核 Linux现有管道 消息队列 共享内存 套接字 信号量 信

随机推荐

  • Python 为什么要 if __name__ == “__main__“:

    各位读者 你们知道以下两个Python文件有什么区别吗 main1 py def main output Hello print output if name main main main2 py output Hello print ou
  • chown 修改文件或文件夹的所有者、群组权限

    简单粗暴 具体操作 如修改宝塔面板下的 www wwwroot 里所有文件的所有者为www 所属群组也为www 1 转到要修改的目录 root centos cd www wwwroot 2 输入以下命令 root centos wwwro
  • 最优化建模、算法与理论(三)—— 优化建模

    参考书籍 最优化 建模 算法与理论 文章目录 1 建模设计 1 1 目标函数的设计 1 2 约束设计 2 建模技巧 2 1 监督学习 2 1 1 回归 2 1 2 分类 2 2 概率图模型 2 3 相位恢复 2 4 主成分分析 2 5 矩阵
  • property_get使用注意事项

    之前虽然一直使用property get函数 但是没有真正了解过 所以写出了这样一个bug char buf PROPERTY VALUE MAX 0 if property get debug property test buf 0 AL
  • Git 常用命令速查 大全

    一 Git 常用命令速查 git branch 查看本地所有分支 git status 查看当前状态 git commit 提交 git branch a 查看所有的分支 git branch r 查看远程所有分支 git commit a
  • WEB自动化(JAVA版)——第一个Web自动化测试脚本

    目录 第一个web自动化测试脚本 自动化环境问题 第一个web自动化测试脚本 step1 创建maven项目 step2 引入selenium框架
  • Python3 文件f.seek() 方法

    seek 方法用于移动文件读取指针到指定位置 例如 从文件xx开始读取xx位做md5校验判断 语法 fileObject seek offset whence 参数解析 offset 开始的偏移量 也就是代表需要移动偏移的字节数 如果是负数
  • 【应急响应】战中溯源反制&对抗上线CS&Goby&蚁剑&Sqlmap等安全工具

    文章目录 溯源反制 Webshell工具 Antsword 正常情况下 PHP后门上线 发现PHP后门 修改webshell进行反制 溯源反制 SQL注入工具 SQLMAP 溯源反制 漏洞扫描工具 Goby Awvs 溯源反制 远程控制工具
  • 手把手教线性回归分析(附R语言实例)

    本文长度为8619字 建议阅读15分钟 本文为你介绍线性回归分析 通常在现实应用中 我们需要去理解一个变量是如何被一些其他变量所决定的 回答这样的问题 需要我们去建立一个模型 一个模型就是一个公式之中 一个因变量 dependent var
  • layui提示信息弹窗

    1 layer msg 只想弱弱提示 2 layer msg 有表情地提示 icon 6 3 layer msg 关闭后想做些什么 function do something 4 layer msg 同上 icon 1 time 2000
  • 模型常用评估指标详解- 混淆矩阵/Recall/ROC/AUC/F1/MAPE/RMSE

    简介 模型评估通常作为建模的最后一步 用于评估模型效果 判别该模型是否达到预期 但实际模型评估指标需要在建模的第一步确定 即确定目标函数 凡事都得有个目标 才知道努力的 拟合 方向 否则枉然 连续值或者分类型的预测最常用的说法就是模型精度
  • Hadoop报错处理方法汇总

    1 报错信息 org apache hadoop hdfs server common InconsistentFSStateException Directory home maclaren data hadoopTempDir dfs
  • day 6

    用c语言实现对sqlite3数据库的插入删除修改和查找 头文件 ifndef HEAD define HEAD include
  • #Microsoft Edge功能测评!# 关于Edge浏览器以及插件推荐

    关于Edge浏览器以及插件推荐 1 关于Microsoft Edge 1 1 什么是Microsoft Edge 1 2Microsoft Edge的优势 2 Microsoft Edge的分屏功能 2 1 如何分屏 2 2分屏的优势 3
  • 华为OD机试真题-最多获得的短信条数【2023.Q1】

    题目内容 某云短信厂商 为庆祝国庆 推出充值优惠活动 现在给出客户预算 和优惠售价序列 求最多可获得的短信总条数 输入描述 第一行客户预算M 其中 0 M 10 6 第二行给出售价表 P1 P2 Pn 其中 1 n 100 Pi为充值 i
  • 栈的顺序存储结构及其基本运算的实现(第三章:栈和队列)

    栈的定义 栈是一种只能在一端进行插入或删除操作的线性表 原则 后进先出 小女孩想要数字为 2 的小球 男孩只能先把数字为 3 和 1 的小球拿出来 才能拿到小女孩想要的小球 栈的特有操作 允许进行插入 删除操作的一端称为栈顶 也就是最高点
  • 时间复杂度分析 理解

    时间复杂度分析 理解 https blog csdn net weixin 40533111 article details 83027707 utm medium distribute pc relevant none task blog
  • linux怎么编译fortran,linux下Fortran编译Lapack库及使用的方法

    一 获取lapack源代码 wget http www netlib org lapack lapack 3 6 1 tgz 二 解压后编译 cd mybk lapack 3 6 1 cp make inc example make inc
  • Vue-Router 介绍及路由原理分析

    文章目录 Vue Router 路由模式 单页面与传统页面跳转的区别 Hash 模式 History 模式 abstract 模式 原理解析 Hash 模式原理 History 模式原理 路由使用 引入 Vue Router 获取全局路由跳
  • 遗传算法matlab_遗传算法和MATLAB (更新中)

    0 文章目的 本人写这样一篇文章的目的在于提供一张学习遗传算法的地图 实现的主要工具是MATLAB和其自带的全局优化工具箱 Global Optimization Toolbox 无论读者是来自工程 科学或者其他任何领域 希望看完文章之后都