智能算法之Genetic Algorithm遗传算法

前言:本文主要围绕 Matlab 的实现展开,Java版本以及Python版本参考文章最后的源码地址,MatLab和python实现大致相同,Java较为不同。

1、什么是遗传算法

我们了解过深度学习的都知道,我们在进行网络优化的过程都是通过反向传播求导进行参数的不断优化,而这种类型的优化参数采用前向传播的方式继续优化网络,不断找出最优解,或者最优的参数。很多的优化算法都来自于大自然的启发,来一种算法叫做蚁群算法,灵感就是来自于蚂蚁,所以观察大自然有时也是灵感的来源。

遗传算法,也叫Genetic Algorithm,简称 GA 算法他既然叫遗传算法,那么遗传之中必然有基因,那么基因染色体(Chromosome)就是它的需要调节的参数。我们在生物中了解到,大自然的法则是“物竞天择,适者生存”,我觉得遗传算法更适用于“优胜劣汰”。 + 优:最优解, + 劣:非最优解。

2、遗传算法名词解释

下面主要通过疑问提问题的方式进行解释遗传算法当中的适应度函数、选择、交叉、变异这几个名词。

1. 都知道优胜劣汰,那怎么实现优胜劣汰呢?

很重要的一个环节就是选择,也称之为“大自然的选择”,大自然怎么选择呢,大自然会抛弃掉一些适应能力差的,在程序当中就是离最优解较远的解,会被抛弃掉。

2. 如何实现大自然的选择呢?

这里我们会引入轮盘赌法,进行大自然的选择。选择一些离最优解较近的个体。还有一些其他的经典的选择办法,例如锦标赛法进行选择。

3. 只靠选择就可以实现吗?那样会不会陷入局部最优解?

如果只靠选择进行调优,那么最终的结果会受到初始种群的影响,只是在初始种群的群体中进行选择,得出的最优解也是在初始群体中的最优解。所以就需要引入大自然当中的“啪啪啪”,也叫交叉。正所谓“龙生龙,凤生风,老鼠生下来就会打洞”,所以说两个优秀的基因进行交叉可以将两者优秀的基因遗传给一代,也增加了群体的基因多样性,但这种不一定就是最好的,也可能发生“夭折”。

4. 大自然的选择好像不仅如此,还有变异吧?

为了更好的模拟大自然的选择规律,来需要进入变异,变异发生的概率很低,但也是增加群体多样性的条件,和交叉相同,变异求解出来的不一定是最好的解,也会出现“夭折”。

5. 上面只是大自然的规则,那么大自然的环境又是什么呢?

优秀的基因并不是独立的,就像北极熊不会存活在热带雨林一样。只有适合环境的基因才是优秀的,所以说基因具有相对性,环境是挑选基因的先决条件,这里的环境就是适应度函数。个体用过适应度函数后得到的结果越大,表明更加适合这里的环境,那么保留下来的概率越大。反之则越小。

3、遗传算法的程序实现

正所谓 “不结合代码的解释都是** ” 。下面结合代码来梳理遗传算法的实现。

涉及到还是适应度函数、选择、交叉、变异这几个模块。下面就这几个模块展开说明。具体的流程图解释如下: 1. 需要先对初始种群进行一次适应度函数进行计算,这样方便我们对个体进行选择,适应度值越大的越容易被保留; 2. 对群体进行选择,选择出适应度值较大的一部分优势群体; 3. 对优势种群进行 “交配”,更容易产生优秀的个体; 4. 模拟大自然变异操作,对染色体个体进行变异操作;

下面以计算函数最大值

3.1、种群初始化

种群的初始化相对简单,只需要随机生成一个二维矩阵,矩阵的size=(种群大小,染色体编码长度)。染色体编码采用二进制编码的方式。染色体编码并不是直接采用将[0, 10]直接转换为二进制,原因如下:

  • 并非均匀分布,10的二进制表示为1010,会导致出现空余位置,例如11、12等没有意义的数字出现
  • 精度低,如果直接编码最小增量单位变成了 1 ,没有了浮点数的表示,最优解很多情况都会出现在浮点数的表示范围。n:代表染色体编码的长度

此时x的范围为[0, 1],我们可以根据待测得x轴的范围进行偏移计算。例如:x得范围为[2, 10],则设计:

种群初始化基本结构如下,实数范围还需要进一步计算得到真正得x轴的浮点值。

% popsize: 种群个数

3.2、适应度函数设计

适应度函数得出的值越大表明个体越优秀,所以一般情况下,在求解函数最大值的时候,适应度函数就是求解函数本身,求解最小值的时候适应度函数就是函数的倒数。在本例中求取最大值,所以适应度函数就是函数本身。

function

3.3、选择

我们在前面已经说明了选择的原因(挑选优秀个体),挑选的算法有很多,我们这里选择“轮盘赌法”。轮盘赌法就是类似于我们玩的转盘,圆心角度越大的我们越容易选中。 注: 选择后后的个体数目和原种群个数相同。

大自然就像那个指针,适应度值越大,表明这个体约适应这个环境,那么被选择的概率越大,与此同时,适应度值小的个体并不代表不会被选中,只是选中的概率小,一方面也保证了正负样本的一个均衡。

% pop: 遗传算法的种群

3.4、交叉

交叉相对来说,比较简单,就是将两个染色体进行基因片段的交叉。交叉的方式有很多,可以单个点进行交叉,随机基因片段交叉,随机长度的交叉方式,在这里仅实现随机长度的交叉方式。 随机长度交叉:

随机距离交叉(本例实现):

程序实现:

% pop:总种群

3.5、变异

变异就变得更加简单,对于二进制编码,只需要将随机一个基因位置进行取反操作。

程序实现:

% pop: 总种群

3.6、主函数

主函数主要是围绕下面的流程图进行计算。

程序实现:

clear

4、运行结果展示

总结

遗传算法同样会陷入局部最优解的情况,例如下面的情况:

解决局部最优解的方法有很多,小伙伴可以自行百度,我这里提供一种方法叫做非线性寻优,利用matlab自带函数fmincon进行非线性寻优。

最后

更多精彩内容,大家可以转到我的主页:

首页 | 曲怪曲怪​quguai.cn

源码地址

LiYangSir/Smart-Algorithm​github.com

遗传算法matlab_智能算法之Genetic Algorithm遗传算法相关推荐

  1. Genetic Algorithm遗传算法整理

    文章目录 一.简介 二.算法流程 三.参数 四.代码 五.参考资料 一.简介 遗传算法(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型 ...

  2. Genetic Algorithm遗传算法,两个代码实现例子

    通过了解遗传算法的概念,应用和代码实现,来充分理解和学习遗传算法.本文文末包含两个不同的通俗易懂的例子,分别使用java和python实现. 什么是遗传算法? 可参考这篇文章:link 应用:List ...

  3. 【AI】Genetic Algorithm 遗传算法

    GA遗传算法 遗传算法概述 基因互换 基因突变 基因突变机率 遗传算法宏观步骤 适应度 fitness 遗传算法简单案例 复杂遗传算法python求解 遗传算法是一种基于自然选择的搜索算法,可用于解决 ...

  4. Pymoo学习 (11):有偏随机密匙遗传算法 (BRKGA: Biased Random Key Genetic Algorithm) 的使用

    文章目录 1 引入 2 BRKGA的调用 参考文献 1 引入   BRKGA是非常著名的用于处理组合问题的遗传算法,其流程如下: 2 BRKGA的调用 import numpy as np from ...

  5. 智能算法浅介----模拟退火,遗传算法,禁忌搜索,神经网络等

    本文讲的过于笼统,如果想真正理解,请参考: 1模拟退火 2遗传算法 3禁忌搜索 智能算法浅介----By cooler 一个比方 在工程实践中,经常会接触到一些比较"新颖的算法"如 ...

  6. 遗传算法与爬山算法简介_遗传算法简介

    遗传算法与爬山算法简介 Genetic Algorithms (GAs) are a part of Evolutionary Computing (EC), which is a rapidly g ...

  7. [ML] Genetic Algorithm 理论概述

    Genetic Algorithm 遗传算法: 遗传算法受到达尔文自然选择理论的启发,以遗传/变异/择优的策略进行机器学习进程. 核心算法逻辑: # Copyright:CMPUT 296, Univ ...

  8. 算法高级(4)-遗传算法(Genetic Algorithm)简介

    01 什么是遗传算法? 1.1 遗传算法的科学定义 遗传算法(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过 ...

  9. 优化算法之遗传算法(Genetic Algorithm, GA)

    目录 概述 相关术语 遗传算法的实现过程 遗传算法的一般步骤 代码描述 解码 相关问题 适应度函数 选择函数 小问题: 交叉.变异 相关问题 完整代码 疑惑点(感谢大佬解答) 个人修改代码(类形式) ...

最新文章

  1. 《JavaScript语言精髓与编程实践》读书笔记二
  2. [题解] 2038: [2009国家集训队]小Z的袜子(hose)
  3. 如何用Python打造你的第一个Slack Bot
  4. 给IBM的黑科技跪了:量子计算机强势来袭!
  5. 注册Gmail邮箱需要手机验证
  6. function里面的两个参数是什么意思?
  7. GEE:基于GEE的单个湖泊的实时水体提取(以武汉东湖为例)
  8. 深度学习--------图片的位深度含义
  9. 微信小程序怎么上架和发布商品?
  10. 第9章 虚拟专用网 技术原理与应用
  11. Vim 格式化 xml文件, 进行快捷键映射。
  12. python汉诺塔问题输入层数输出整个移动流程_python 实现汉诺塔游戏
  13. 用PS快速简单抠出火焰
  14. bzoj3028 食物 (普通型生成函数)
  15. java 爬取网页版的酷狗音乐,下载到本地
  16. COBOL语言总结(一)
  17. gorm的Raw与scan
  18. 野指针的产生及其危害
  19. myeclipse下载解压后.exe文件消失
  20. html超过高度隐藏,CSS隐藏超过固定宽度和高度的文字

热门文章

  1. trans在c语言的用法,求大神翻译这个东西啊,完全看不懂,新手
  2. androidstudio之debug模式用法
  3. 病毒防护,详解计算机病毒发展趋势(转)
  4. win10控制面板快捷键_知乎高赞:Win10发布5年,这些鲜为人知的技巧,你用过几个呢?...
  5. 螯合放射性核素127985-74-4,p-SCN-Bn-DOTA连接单克隆抗体的一种双功能螯合剂
  6. 8皇后问题-递归-回溯(Java)
  7. 基于Java语言的面向对象基础算法的练习
  8. 2021年塔式起重机司机最新解析及塔式起重机司机新版试题
  9. 基于php电影点播平台/电影网站
  10. 流媒体分析之webrtc之metartc 实现。