「深度学习之优化算法」(六)遗传算法

news2024/11/24 20:12:08

1. 遗传算法简介

遗传算法(Genetic Algorithms,GA)是一种模拟自然中生物的遗传、进化以适应环境的智能算法。由于其算法流程简单,参数较少优化速度较快,效果较好,在图像处理、函数优化、信号处理、模式识别等领域有着广泛的应用。
  在遗传算法(GA)中,每一个待求问题的候选解被抽象成为种群中一个个体的基因。种群中个体基因的好坏由表示个体基因的候选解在待求问题中的所的得值来评判。种群中的个体通过与其他个体交叉产生下一代,每一代中个体均只进行一次交叉。两个进行交叉的个体有一定几率交换一个或者多个对应位的基因来产生新的后代。每个后代都有一定的概率发生变异。发生变异的个体的某一位或某几位基因会变异成其他值。最终将以个体的适应度值为概率选取个体保留至下一代。

2. 算法流程

遗传算法启发于生物的繁殖与dna的重组,本次的主角选什么呢?还是根据大家熟悉的孟德尔遗传规律选豌豆吧,选动物的话又会有人疑车,还是植物比较好,本次的主角就是它了。

  遗传算法包含三个操作(算子):交叉,变异和选择操作。下面我们将详细介绍这三个操作。
  大多数生物的遗传信息都储存在DNA,一种双螺旋结构的复杂有机化合物。其含氮碱基为腺嘌呤、鸟嘌呤、胞嘧啶及胸腺嘧啶。


遗传算法的个体结构受DNA的分子结构启发,基于计算机的二进制,其编码内容如下:

编号12345678910
基因0110110100

表格中表示了一个有10个基因的个体,它们每一个基因的值为0或者1。

2.1交叉

生物的有性生殖一般伴随着基因的重组。遗传算法中父辈和母辈个体产生子代个体的过程称为交叉。

编号12345678910
A豌豆基因0110110100
B豌豆基因1100101000

表中给出了两个豌豆的基因,它们均有10个等位基因(即编号相同的基因)。
  遗传算法的交叉过程会在两个个体中随机选择1位或者n位基因进行交叉,即这两个个体交换等位基因。
  如,A豌豆和B豌豆在第6位基因上进行交叉,则其结果如下

编号12345678910
A豌豆基因0110100100
B豌豆基因1100111000

当两个个体交叉的等位基因相同时,交叉过程也有可能没有产生新的个体,如交叉A豌豆和B豌豆的第2位基因时,交叉操作并没有产生新的基因。

编号12345678910
A豌豆基因0110110100
B豌豆基因1100101000

一般的会给群体设定一个交叉率,crossRate,表示会在群体中选取一定比例的个体进行交叉,交叉率相对较大,一般取值为0.8。

2.2变异

基因的变异是生物进化的一个主要因素。
  遗传算法中变异操作相对简单,只需要将一个随机位基因的值修改就行了,因为其值只为0或1,那么当基因为0时,变异操作会将其值设为1,当基因值为1时,变异操作会将其值设为0。

编号12345678910
A豌豆基因0110110100
A变异后基因0100110100

上图表示了A豌豆第3位基因变异后的基因编码。
  与交叉率相似,变异操作也有变异率,alterRate,但是变异率会远低于交叉率,否则会产生大量的随机基因。一般变异率为0.05。

2.3选择

选择操作是遗传算法中的一个关键操作,它的主要作用就是根据一定的策略随机选择个体保留至下一代。适应度越优的个体被保留至下一代的概率越大。
  实现上,我们经常使用“轮盘赌”来随机选择保留下哪个个体。

 

假设有4个豌豆A、B、C、D,它们的适应度值如下:

个体适应度值
A1
B2
C3
D4

适应度值越大越好,则它们组成的轮盘如下图:

 

  但由于轮盘赌选择是一个随机选择过程,A、B、C、D进行轮盘赌选择后产生的下一代也有可能出现A、A、A、A的情况,即虽然有些个体的适应度值不好,但是运气不错,也被选择留到了下一代。
  遗产算法的三个主要操作介绍完了,下面我们来看看遗传算法的总体流程:

 

3.基因编码及操作细节

前面我们说了遗传算法的流程及各个操作,那么对于实际的问题我们应该如何将其编码为基因呢?

3.1二进制编码

对于计算机来所所有的数据都使用二进制数据进行存放,如float类型和double类型的数据。
  float类型的数据将保存为32位的二进制数据:1bit(符号位) 8bits(指数位) 23bits(尾数位)
如-1.234567f,表示为二进制位10111111100111100000011001001011

类型符号位1指数位8小数位23
10111111100111100000011001001011

Double类型的数据将保存为64位的二进制数据:1bit(符号位) 11bits(指数位) 53bits(尾数位)
  如-1.234567d,表示为二进制为1011111111110011110000001100100101010011100110111000100010000111

类型符号位1指数位11小数位52
101111111111001111000000110010010101001100110111000100010000111

可以看出同样的数值不同的精度在计算机中存储的内容也不相同。之前的适应度函数,由于有两个double类型的参数,故其进行遗传算法基因编码时,将有128位基因。
  虽然基因数较多,但好在每个基因都是0或者1,交叉及变异操作非常简单。

 

3.2十进制编码

相比二进制编码,十进制编码的基因长度更短,适应度函数有两个输入参数,那么一个个体就有2个基因,但其交叉、变异操作相对复杂。
交叉操作
方案1:将一个基因作为一个整体,交换两个个体的等位基因。
交换前 

编号12
A豌豆基因1020
B豌豆基因3040

交换第1位基因后

编号12
A豌豆基因3020
B豌豆基因1040

方案2:将两个个体的等位基因作为一个整体,使其和不变,但是值随机
交换前

编号12
A豌豆基因1020
B豌豆基因3040

交换第1位基因后

编号12
A豌豆基因2120
B豌豆基因1940

假设A、B豌豆的第一位基因的和为40,即,第一位基因的取值范围为0-30,那么A、B豌豆的第一位基因的取值范围为[10,30],即为[0,30]的随机数,。
  变异操作,将随机的一位基因设置为该基因取值范围内的随机数即可。

 

3.3轮盘赌

这个过程说起来简单但其实现并不容易。

个体适应度值
A1
B2
C3
D4

我们要将它们的值映射到一个轴上才能进行随机选择,毕竟我们无法去绘制一个轮盘来模拟这个过程

 

  如图,将ABCD根据其值按顺序排列,取[0,10]内的随机数r,若r在[0,1]内则选择A,在(1,3]内则选择B,在(3,6]内则选择C,在(6,10]则选择D。
  当然这仍然会有问题,即当D>>A、B、C时,假如它们的值分布如下

个体适应度值
A1
B2
C3
D100

那么显然,选D的概率明显大于其他,根据轮盘赌的选择,下一代极有可能全是D的后代有没有办法均衡一下呢?
  首先我想到了一个函数,

 

  不要问我为什么我不知道什么是神经什么网络的,什么softmax、cnn统统没听说过。



取值为sigmod((fitness-mean)/(max-min)),现在再来计算一下ABCD的值,

个体适应度值
A0.435
B0.438
C0.441
D0.677

这样一来,它们之间的差距没有之前那么大了,只要个体适应度值在均值以上那么它被保留至下一代的概率会相对较大,当然这样缩小了个体之间的差距,对真正优秀的个体来说不太公平,相对应,我们可以在每次选择过程中保留当前的最优个体到下一代,不用参与轮盘赌这个残酷的淘汰过程。

4.实验

由于遗传算法的收敛速度实在是太慢,区区50代,几乎得不到好的结果,so我们把它的最大迭代次数放宽到200代。

方案1.

使用二进制编码来进行求解
参数如下:

参数
问题维度(维度)2
豌豆的数量(种群数)20
繁殖次数(最大迭代次数)200
crossRate(交叉率)0.8
alterRate(变异率)0.05
取值范围(-100,100)
编码方式二进制
实验次数10

 

  求解过程如上图,可以看出基因收敛的很快,在接近20代时就图中就只剩一个点了,之后的点大概是根据变异操作产生。看一下最后的结果。

最优值0.0
最差值1374.1828414659183
平均值214.78194828105424

可以看出最好的结果已经得到了最优解,但是10次实验的最差值和平均值都差的令人发指。为什么会这样呢?

 

  问题出在二进制编码上,由于double类型的编码有11位指数位和52位小数位,这会导致交叉、变异操作选到指数位和小数位的概率不均衡,在小数位上的修改对结果的影响太小而对指数为的修改对结果的影响太大,
  如-1.234567d,表示为二进制为1011111111110011110000001100100101010011100110111000100010000111

类型符号位1指数位11小数位52
1011111111110011110000001100100101010011100110111000100010000111

对指数为第5位进行变异操作后的结果为-2.8744502924382686E-10,而对小数位第5为进行变异操作后的结果为-1.218942。可以看出这两部分对数值结果的影响太不均衡,得出较好的结果时大概率是指数位与解非常相近,否则很难得出好的结果,就像上面的最差值和均值一样。
  所以使用上面的二进制编码不是一个好的基因编码方式,因此在下面的实验中,将使用十进制来进行试验。

方案2:

使用:十进制编码来进行求解
参数如下:

参数
问题维度(维度)2
豌豆的数量(种群数)20
繁殖次数(最大迭代次数)200
crossRate(交叉率)0.8
alterRate(变异率)0.05
取值范围(-100,100)
编码方式十进制
交叉方式交换基因
实验次数10

 

我们可以看到直到40代时,所有的个体才收束到一点,但随后仍不断的新的个体出现。我们发现再后面的新粒子总是在同一水平线或者竖直线上,因为交叉操作直接交换了两个个体的基因,那么他们会相互交换x坐标或者y坐标,导致新个体看起来像在一条直线上。
我们来看看这次的结果。

最优值0.4998897017064181
最差值101.50731384880558
平均值26.879257652054093

这次最优值没有得到最优解,但是最差值没有二进制那么差,虽然也不容乐观。使用交换基因的方式来进行交叉操作的搜索能力不足,加之轮盘赌的选择会有很大概率选择最优个体,个体总出现在矩形的边上。
  下面我们先改变轮盘赌的选择策略,使用上面的sigmod函数方案,并且保留最优个体至下一代。

方案3:

使用:十进制编码来进行求解
参数如下:

参数
问题维度(维度)2
豌豆的数量(种群数)20
繁殖次数(最大迭代次数)200
crossRate(交叉率)0.8
alterRate(变异率)0.05
取值范围(-100,100)
编码方式十进制
交叉方式交换基因
轮盘赌方式sigmod函数方案,保留最优至下一代
实验次数10

 

  看图好像跟之前的没什么区别,让我们们看看最终的结果:

最优值0.4504701892811481
最差值18.879980044723276
平均值6.865234201226049

可以看出,最优值没有什么变化,但是最差值和平均值有了较大的提升,说明该轮盘赌方案使算法的鲁棒性有了较大的提升。在每次保留最优个体的情况下,对于其他的个体的选择概率相对平均,sigmod函数使得即使适应度函数值相差不太大的个体被选到的概率相近,增加了基因的多样性。

方案4:

使用:十进制编码来进行求解,改变交叉方案,保持两个个体等位基因和不变的情况下随机赋值。
参数如下:

参数
问题维度(维度)2
豌豆的数量(种群数)20
繁殖次数(最大迭代次数)200
crossRate(交叉率)0.8
alterRate(变异率)0.05
取值范围(-100,100)
编码方式十进制
交叉方式修改基因使其和不变
轮盘赌方式sigmod函数方案,保留最优至下一代
实验次数10

 

  上图可以看出该方案与之前有明显的不同,在整个过程中,个体始终遍布整个搜索空间,虽然新产生的个体大多还是集中在一个十字架型的位置上,但其他位置的个体比之前的方案要多。
看看结果,

最优值0.011758796459006677
最差值2.2756330462780725
平均值0.8849388632252244

这次的结果明显好于之前的所有方案,但仍可以看出,十进制的遗传算法的精度不高,只能找到最优解的附近,也有可能是算法的收敛速度实在太慢,还没有收敛到最优解。

5.总结

遗传算法的探究到此也告一段落,在研究遗传算法时总有一种力不从心的感觉,问题可能在于遗传算法只提出了一个大致的核心思想,其他的实现细节都需要自己去思考,而每个人的思维都不一样,一万个人能写出一万种遗传算法,其实不仅是遗传算法,后面的很多算法都是如此。
  为什么没有对遗传算法的参数进行调优,因为遗传算法的参数过于简单,对结果的影响的可解释性较强,意义明显,实验的意义不大。

  遗传算法由于是模仿了生物的进化过程,因此我感觉它的求解速度非常的慢,而且进化出来的结果不一定是最适应环境的,就像人的阑尾、视网膜结构等,虽然不是最佳的选择但是也被保留到了今天。生物的进化的随机性较大,要不是恐龙的灭绝,也不会有人类的统治,要不是人类有两只手,每只手有5根手指,也不会产生10进制。
以下指标纯属个人yy,仅供参考

指标星数
复杂度★★★☆☆☆☆☆☆☆
收敛速度★☆☆☆☆☆☆☆☆☆
全局搜索★★★★★★★☆☆☆
局部搜索★☆☆☆☆☆☆☆☆☆
优化性能★★★★☆☆☆☆☆☆
跳出局部最优★★★★★★☆☆☆☆
改进点★★★★★★★☆☆☆

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

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

相关文章

电气火灾探测器在智慧城市消防安全的应用 安科瑞 许敏

【摘要】智慧消防应用是重要的建设内容之一。根据固定资产投资额和消防经费测算,2017年消防市场容量合计约2761.65亿元,2020年消防市场规模可达5200亿元。通过梳理各地政府招标项目,预计全国政府智慧消防项目的投入总额可达92.8亿元。 【关键…

基于Java校园美食交流系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

crontab执行时间与系统时间不一致

crontab执行时间与系统时间不一致 一:问题查找: 问题描述:今天新发现一个问题,定时任务写了之后一直不执行,查看日志才发现,执行的时间给我定时的时间相差了12个小时。 1、查看定时任务的相关日志&#…

Nik Color Efex 滤镜详解(1/5)

双色滤镜 Bi-Color Filter 混合两种颜色然后将混合结果添加到图像,以此模拟传统的双色玻璃滤镜效果。 颜色组合 Color Set 提供棕色、冷/暖、绿色/棕色、青苔色、紫色/粉红色等多种颜色组合,每个颜色组合又有 4 种版本可供选择。 不透明度 Opacity 调整…

Stuart Russell对话姚期智:为全人类设计AI系统,可以借鉴墨子「兼爱」思想丨2023智源大会AI安全与对齐论坛...

导读 在2023智源大会「AI安全与对齐论坛」的对话环节,加州大学伯克利分校教授Stuart Russell与图灵奖得主、中国科学院院士姚期智针对「如何设计对人类有益的AI」、「如何管控AI技术」,以及「LLM内在目标与意识」等话题进行了深度探讨,其中St…

一键式 RLHF 训练 DeepSpeed Chat(二):实践篇

一键式 RLHF 训练 DeepSpeed Chat(二):实践篇 之前给大家分享了一键式 RLHF 训练 DeepSpeed Chat(一):理论篇,本文给大家分享如何使用DeepSpeed Chat进行RLHF训练。 DeepSpeed Chat 的 RLHF 训…

每日算法(第二十三期)

先来回顾一下上期的问题及答案: 2023年6月14日 「最接近的三数之和」(3Sum Closest)。以下是题目的描述: 给定一个包括 n 个整数的数组 nums 和一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接…

活动预告 | Hugging Face 音频 AI 派对直播

嘿嘿嘿,🤗 宝子们!我们正在准备一个超级激动人心的音频 AI 派对,千万别错过!为了庆祝 Hugging Face 新开设的免费开源 Audio Transformers 课程的启动,我们组织了一场不容错过的网络直播活动! &…

Docker 容器入侵排查

随着越来越多的应用程序运行在容器里,各种容器安全事件也随之发生,例如攻击者可以通过容器应用获取容器控制权,利用失陷容器进行内网横向,并进一步逃逸到宿主机甚至攻击K8s集群。 容器的运行环境是相对独立而纯粹,当容…

redis客户端连接不上redis

总结 我先说一下,我觉得最有效就是把Linux防火墙tm的关了, 当我成功后,第二次连接时,防火墙开着,但是我能连接。 systemctl stop firewalled # 关闭防火墙 systemctl start firewalled # 开启防火墙 systemctl status …

利用DPU/IPU 卸载容器镜像以及文件系统的相关操作

1、背景和动机 随着云原生(Cloud Native)被工业界广泛接受,容器(container)在数据中心被广泛部署,其地位正在逐步取代传统的虚拟机(Virtual Machine)。当然目前依然存在用轻量虚拟机来运行和部署容器,比如使用Kata Containers。简单来讲&…

FPGA实现USB3.0 UVC 相机OV5640摄像头输出 基于FT602驱动 提供工程源码和QT上位机源码

目录 1、前言2、UVC简介3、FT602芯片解读4、我这儿的 FT601 USB3.0通信方案5、详细设计方案基于FT602的UVC模块详解 6、vivado工程详解7、上板调试验证8、福利:工程代码的获取 1、前言 目前USB3.0的实现方案很多,但就简单好用的角度而言,FT6…

2023 年 8 个最佳 React UI 组件库和框架

将展示八个最好的 React UI 组件库和框架,如下表所示:(星标加关注,开车不迷路) 「React Bootstrap:」一个与 Bootstrap 框架集成的实用的 React UI 库。「Grommet:」如果您想在设计中实现可访问…

基于Servlet+mysql+jsp学生宿舍信息管理系统

基于Servletmysqljsp学生宿舍信息管理系统 一、系统介绍二、功能展示1.用户登陆2.学生-主页面3.学生-缺勤记录4.学生-修改密码5.宿舍管理员-主页面6.宿舍管理员-学生查看7.宿舍管理员-缺勤记录8.系统管理员-宿舍管理员管理9.系统管理员-学生管理10.系统管理员-宿舍楼管理11.系统…

中高级前端面试秘籍,为你保驾护航金三银四

引言 各位大佬在评论中指出的种种问题小弟万分感谢。由于这一年来,出了不少变动,所以才一直耽搁,现已修复各位大佬指出的问题和建议。请大家放心食用!感恩~🥳 当下,正面临着近几年来的最严重的互联网寒冬&a…

《文渊》期刊简介及投稿邮箱

《文渊》期刊简介及投稿邮箱 《文渊》是正规国家级连续型电子期刊,新闻出版广电总局可查,国家级教育核心刊物、中国核心期刊数据库收录期刊。 主管单位:中国出版传媒股份有限公司 主办单位:中国出版传媒股份有限公司 文渊&…

变量的线程安全分析

目录 变量的线程安全 常见线程安全类 变量的线程安全 成员变量和静态变量是否线程安全? 如果它们没有共享,则线程安全 如果它们被共享了,根据它们的状态是否能够改变,又分两种情况 如果只有读操作,则线程安全如果…

【30天熟悉Go语言】7 Go流程控制之分支结构if、switch

文章目录 一、前言二、if1、单分支Go语法规范: 2、双分支Go语法规范 3、多分支 三、switch1、基本语法2、语法规范1)switch2)case3)default 四、总结 一、前言 Go系列文章: GO开篇:手握Java走进Golang的世界…

手机APP大用户并发测试

一、背景 随着智能手机近年来的快速增长,从游戏娱乐到移动办公的各式各样的手机APP软件渗透到我们的生活中,对于大型的手机APP测试不仅要关注它的功能性、易用性还要关注它的性能,最近发现LoadRunner12可以对手机APP做性能测试,但…

寻味一座城,从吃吃吃开始

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 小黑 运营 / SandLiu 卷圈 监制 / 姝琦 文案 / 小黑 产品统筹 / bobo 场地支持 / 声湃轩天津站 为了再也不用在节目里喊“我们真的不是美食节目”,2023年7月起,原汤话原食将更名为“记者下班”…