Word害我重写=_=顺便重新整理下思路

背景:写论文时用到遗传算法,花了近一周时间,还算理解了算法以及能够进行基础的编程实现(保持谦虚)。

说明:具体的实现没敢细讲,主要是原理的方法上的介绍(讲解都算不上)。

先说说算法学习,个人觉得首先需要了解这个算法是拿来干嘛的,然后学习它的理论原理,多看懂几遍总是好的;结合实际例子,接着把算法的每一块儿研究清楚,通篇理解后,自己试着编程实现,这样学起来感觉也还不错。

关于遗传算法原理:模拟自然界优胜劣汰的进化现象,把搜索空间(问题解的组成空间)映射为遗传空间,把可能的解编码成一个向量——染色体,向量的每个元素称为基因。通过不断计算各染色体的适应值,选择最好的染色体,获得最优解。

简单说,就是给你一堆人儿(解和种群),让你选择一部分基因优良(解的适应度更高,比如值更大)的人出来,让他们生小孩组成后代(选择交叉和变异),把这些后代和之前选出来的父代,再比较基因优良,再选择,再遗传,这样循环,最后找出一个超级英雄(最优解)就达到目的了。

这样类似于一种无目的的搜索式寻找最优,不过遗传算法的效率更高。

关于原理,知乎上有些通俗好玩的文章可以看下:https://www.zhihu.com/question/23293449

关于算法步骤:从原理也可以总结出,主要步骤包括,适应度函数的设计,编码,选择,交叉,变异。

即是说,我们主要能用代码实现这些操作,一个算法就能基本实现了。这也算是面向对象编程了。给一张流程图:

图有点大

这流程图在整篇文字看完后在回来看一遍。(坚持,看完d===( ̄▽ ̄*)b)

关于算法术语(偷懒截图):

来源某不知源课件,大学资源多

先从个体开始,我总是乐意把个体和染色体一起理解,因为染色体就是编码过后的个体,两者本质一样,只是表现方式不一样。个体就是算法的一个解,比如一个函数在某个区间内,有无数个解。而染色体,是为了让算法能更好的理解和操作我们的个体,进行的编码结果。这里的编码,就是一个转换操作。

举个栗子,求一个函数区间内最大值,我将一个值为13的解,按照6位长的二进制编码,转换为:001101,这里的13就是个体,001101就是染色体,里面的0和1就是基因。这样来,算法操作这些二值集比实数容易得多。

然后,一大堆个体组成种群,我们需要做的,就是从种群中,挑选出优良的个体(染色体),进行交叉变异,生成下一代,组成新的种群。

评价个体是否优良的标准就是适应度函数,比如求极值函数的值哪些更大或更小。适应度函数给每个个体一个评价值,然后依据评价值,我们选出一部分——如种群数量的20%——作为优良的父代,通过交叉变异,让他们产生子代,组成新的种群,再计算适应度和循环。

交叉和变异就是遗传操作。交叉,就是把染色体里的基因交换,比如吧父亲的优良基因与母亲的优良基因组合在一起,生成下一代,如图:

我们将左边两个染色体交叉,产生了右边新的两个染色体。这个时候用了编码就十分好理解了,每个染色体就是一个二进制串,如图:

这样进行交叉比用实数表示容易实现多了去了。

然后是变异,就是染色体内部的基因变异,比如改变二进制串中的某个基因值,就能产生变异。

001101®011101,对第二个基因变异,产生新的染色体(解),也就是13产生了29。

理解了术语和步骤,接下来就是具体实现。具体的实现,我结合网上找的很实用的例子,来源应该是《遗传算法工具箱》这类书。

环境:matlab和遗传算法工具箱。

首先说下工具箱,这是由外国的大神们编制的一个工具箱,里面有对应的遗传算法各个操作会用到的函数。这些函数也是重点,因为遗传算法(或者大部分算法)都是分块儿的,每一个块儿就是一个操作,每一个操作都以函数形式来表达和进行。

因此具体的实现,就是对每个操作的函数实现。代码来自《工具箱》群书,只是主要部分:

前4行为算法约定或约束。表明,我们每一个种群中有40个个体(染色体)。最多会遗传25代,及循环25次或者说会生成25个种群。然后编码的长度—即染色体的长度为20位(使用的二进制编码)。代沟是选择的比例,即每个种群,我们选出40*0.1=4个优良个体。

接下来就是循环的设计,在循环里边,有函数:“计算目标函数值”,在这里即是适应度函数。大多时候,适应度函数都是用原函数。

二十进制转换函数bs2rv是为了让编码后的个体能恢复实数形式并用以计算适应度。

里边的选择、重组和变异,都是通过一个函数完成:select,recombin,mut。这里的选择,就是选出优良染色体用来产生下一代。重组就是交叉;变异就是…变异。

所以你看到,每一个操作用函数就可以完成,但是要知道,这里的一个函数只是对应了一种操作模式,二每个操作都有很多模式,比如编码有二进制编码、实数编码等。选择操作有赌轮选择、锦标赛选择。交叉有单点交叉、多点交叉等。变异有基本位变异、均匀变异等。

当然每一个模式,或者方法都有对应的原理和函数,这个就自行查找学习。

所以看来遗传算法也没那么难,搞清楚每一个操作,寻找或编写对应的函数,再调用即可。

不过这只是基本遗传操作,现在更在意的是遗传算法的改进和优化,而这些改进和优化,又都是针对以上操作的模式的不足进行的优化,也是好玩。

大概就到这里,最后推荐一本书,雷英杰,老师和张善文老师主编《MATLAB遗传算法工具箱及应用》,着实实用,实际操作也有,优化也有。

一张图解释什么是遗传算法_遗传算法总结(#看了就能懂和用系列#)相关推荐

  1. 一张图解释 CAP 理论中 C、A、P 三者间的关系

    参考:一张图解释 CAP 理论中 C.A.P 三者间的关系_墨城之左的博客-CSDN博客_cap中的a CAP 原则又称 CAP 定理,指的是在一个分布式系统中,一致性(Consistency).可用 ...

  2. 一张图解释SQL Server集群、镜像、复制、日志传送

    一张图解释SQL Server集群.镜像.复制.日志传送 本文版权归作者所有,未经作者同意不得转载.

  3. 几张图解释清楚死锁+wait和notify的搭配使用

    几张图解释清楚死锁+wait和notify的搭配使用 死锁

  4. 一张图解释什么是遗传算法_一张图告诉你什么叫真正的满配m416,吃鸡玩家看懵了...

    开开心心玩游戏,轻轻松松看快讯,欢迎来到<龙百万聊吃鸡>栏目,本期有哪些趣闻趣事呢?咱们一起看一下. 国际服和日韩服的训练场更新了,国服会跟进吗 最近刺激战场国际服和日韩服的训练场更新了, ...

  5. 一张图解释什么是遗传算法_遗传算法的核心是什么?!

    展开全部 1.2 遗传算法的原理 遗传算法GA把问题的解表示成"染色体",62616964757a686964616fe59b9ee7ad9431333332623938在算法中也 ...

  6. 一张图了解python基本语法_一张图认识Python(附基本语法总结)

    一张图带你了解Python,更快入门, 一张图认识Python(附基本语法总结) Python基础语法总结: 1.Python标识符 在 Python 里,标识符有字母.数字.下划线组成. 在 Pyt ...

  7. 三张图解释静态NAT、动态NAT、PAT

    介绍 定义:NAT是网络地址转换,Network Address Translations. IPv4地址分类: IP地址分为公网IP和私网IP 公网IP只能在公网上使用 私网IP只能在内网中使用 公 ...

  8. 一张图解释人工智能、机器学习、深度学习三者关系

    首先来一张图: 人工智能: 人工智能(ArtificialIntelligence),英文缩写为AI.是计算机科学的一个分支.人工智能是对人的意识.思维的信息过程的模拟.人工智能不是人的智能,但能像人 ...

  9. IT观察站:向过去致敬 3张图解释什么是做工

    我不知道有多少读者和我一样是80后,在我们刚上班那会儿,Thinkpad还不是联想的,水货也至少一两万.其他笔记本牌子也没有像今天那样大拼价格战,4.5千想买到一台像样的笔记本几乎是不可能的事情. 经 ...

最新文章

  1. Django入门之开发环境搭建1.1
  2. 关于WinForm的博客推荐
  3. Pandas简明教程:四、Pandas数据索引方式
  4. python编程设计_Python程序设计
  5. CentOS命令行界面与图形界面切换(图文详解)
  6. VTK:可视化之VisualizeVTP
  7. 符号链接文件_Windows10下创建符号链接(SymbolicLink)
  8. ubuntu安装sqoop1.4.7
  9. SQL case when then end根据某列数据内容在新列显示自定义内容
  10. java21天打卡day20-集合
  11. php 不恒等,php运算符==怎么使用以及与===恒等的区别是什么?
  12. matlab 各版本下载地址
  13. labview 写入mysql_LabVIEW 连接MySQL数据库
  14. 用计算机做电子贺卡送祝福,春节祝福电子贺卡模板制作
  15. 安全系统工程徐志胜电子版_安全系统工程-第3版
  16. bzoj1779 [Usaco2010 Hol]Cowwar 奶牛战争(网络流)
  17. linux中Swap分区是做什么的?
  18. Python爬虫网络请求 requests(get、post)
  19. 墨客IPFS子链技术交流
  20. TFTLCD 薄膜晶体管液晶显示器——探索者为例

热门文章

  1. PHP环境搭建和初体验
  2. Java码农日常搬砖整理 一(实现EXCEL新增)
  3. 动态规划最优二叉搜索树C语言,算法 – 动态规划:最优二叉搜索树
  4. TPS丰田生产体系与Lean精益生产之间的区别分析
  5. Mac使用Sequel Pro技巧
  6. Mysql 中 MUL,UNI,MUL 简单释义
  7. Ext+XML实现数据载入
  8. 测试数据生成工具datafaker使用
  9. C++代码实现atanx,atan2x,acosx,asinx,sinx,cosx,tanx三角函数、开方函数sqrtND()
  10. 【JavaWeb】什么是前后台分离?