遗传算法是一种智能优化算法,通常用于求解复杂的数学问题。相比于传统方法,遗传算法摒弃了盲目的穷举或完全随机的求解策略,借鉴了自然界优胜劣汰、自然进化的思想,快速逼近最优解。上文对遗传算法的基本内容进行了介绍,本文将通过一个例子的讲解带领读者深入遗传算法的每一个具体步骤,并用python完整地实现整个算法,题目如下图所示。

第一步:编码

通过对题目的分析,这是一个包含两个自变量的复杂函数,而且规定了自变量的取值范围。为保证精度,我们将保留小数点后四位小数。下面考虑如何将两个自变量编码成二进制:1.为了满足精度的同时避免使用小数点,我们需要将自变量乘以10000;2.为了节省内存,我们应该根据自变量的取值范围确定2进制的位数。

上图很清楚地展示了编码的思路和过程,首先根据自变量的取值范围确定二进制的位数(分别对应18位和15位),然后将两个01串拼接成一个长度为33的01串。这个二进制串可以看作一条染色体,0或1可以看作基因,接下来的交叉、变异操作都将在这个二进制串上进行。

第二步:种群初始化

种群中应包含一定数目的染色体(33位的二进制),这些染色体使用随机数的方法完成初始化。用python实现这一功能非常简单,双重for循环+随机数函数轻松解决,代码很容易理解,这里不再啰嗦。

第三步:计算个体适应度

有了初始化的种群,下面让我们开启“上帝视角”,判断种群中每个个体对自然的适应程度。由于我们的目的是寻找函数的最大值,因此题目中的函数就是我们“自然法则”,我们要将33位的二进制数解析成两个自变量,然后带入函数计算结果,结果越大代表适应度越强,在进化过程中更容易得到上帝的垂青。在下图的python代码中,将二进制转换成十进制之后,要将自变量转换到指定取值范围。

第四步:开始进化

选择。“物竞天择,适者生存”是进化论的核心思想,接下来要根据个体的适应度来决定哪些个体被淘汰,哪些个体继续进化。为了避免陷入局部最优解,维护自然界的公平正义,我们采用轮盘赌的方法。所有个体都可能被淘汰,只不过适应度越低,被淘汰的概率越高。下图的python代码不长,相信读者一看就懂。

交叉。经过自然法则的选择之后幸存下来的个体开始繁衍生息,生命的繁衍过程实际上是染色体相互交叉的过程,目的是生成适应度更高的后代。我们设定一个参数“交叉率”,利用“上帝之手”--随机数对是否进化做出选择。产生0~32之间的随机整数对两个33位的二进制数进行切割,并交叉重组。

变异。自然界中的基因突变,也可以完全用程序实现。变异的概率很低,我们需要设定另外一个参数“变异率”,通过修改染色体上随机位置的一个基因实现变异。下图中的python代码中replace_char( )函数为自定义函数,功能是实现了指定位置字符的替换,参见完整代码。

多代进化

以上的步骤构成了种群的一次完整进化过程,当然为了得到最优解,我们需要让种群进行成百上千代的进化。再多的世代对python而言都是一个for循环的事。第一次实验,我设置的参数:进化世代为1000,种群规模为100,交叉率0.7,变异率0.1,结果显示在335代时得到最优解,x1=11.6284,x2=5.3241,此时函数的最大值为38.4342,各世代最优解如下所示。

总结

本文从一个例子出发,详细讲解了遗传算法的具体步骤和python实现,应该说整体的思路还是很清晰的,如果使用numpy代码会更简洁,当然还有更简单的实现方法,matlab和python的sklearn包中都集成了遗传算法工具包,只需要几行代码就能完成遗传算法的计算,但是我觉得自己动手实现有助于加深我们对遗传算法的理解。完整代码已上传,老规矩,如果需要请在下方评论留言。

python遗传算法工具箱的使用_遗传算法的python实现,非常值得看的一篇文章相关推荐

  1. 运维学python用不上_作为运维你还在想要不要学Python,看完这篇文章再说!

    原标题:作为运维你还在想要不要学Python,看完这篇文章再说! 本文由马哥教育Python自动化实战班5期学员推荐,转载自简书,作者为Li.Yingjie,内容略经小编改编和加工,观点跟作者无关,最 ...

  2. python将照片转文字_如何使用Python把图片变成文字

    为什么要让孩子学编程?看了这篇文章,你就知道编程的强大之处了! 你遇到以下的情况吗? 你负责整理一些文件,结果发现文件没有word存档,这又需要我们把图片变成word. 或者是在今日头条上看到了某片好 ...

  3. python能做什么日常_我用 Python 做些什么?

    我主要工作是后端,所以这一点我就不说了.本文主要说下我用 Python 做的其它的一些事. 1 数据导出支撑 一个月可能有一两次需要导出一些数据,每次的需求都有些不同.刚开始的时候还好,用数据库的一些 ...

  4. python脚本自动化赚钱系统_自从用python写了个自动弹幕脚本后,各大主播都来找我,净赚十万!...

    Python Python开发 Python语言 自从用python写了个自动弹幕脚本后,各大主播都来找我,净赚十万! 大家好,今天又给大家带来了Python爬虫的分享,今天我们继续上次的问题,继续来 ...

  5. 看完这篇文章,你的Python基础就差不多了(附571集精品教程)

    学一门语言贵在坚持用它,不用就淡忘了,而记录下一篇文章也有助于日后快速回忆.全文分为两大部分,分别是Python基础语法和面向对象. 入门Python其实很容易,但是我们要去坚持学习,每一天坚持很困难 ...

  6. python装饰器原理-看完这篇文章还不懂Python装饰器?

    原标题:看完这篇文章还不懂Python装饰器? 1.必备 2.需求来了 初创公司有N个业务部门,1个基础平台部门,基础平台负责提供底层的功能,如:数据库操作.redis调用.监控API等功能.业务部门 ...

  7. java与python难度对比_Python和Java的区别,看完这篇文章你就清楚啦

    众所周知,在数不清的编程语言中Java自诞生之日起长盛不衰,可谓是神话般的存在.随着人工智能时代的到来,Python迅速席卷全球,作为当下最热门的编程语言,因其简单实用且应用场景广泛备受青睐. 一个是 ...

  8. python类和对象课件_简单解释Python的类和对象

    前言: 对象是模拟真实世界,把数据和程序进行封装 . 对象 = 属性+ 方法 我们需要用类来创造一个对象,就像我们要用图纸来造房子一样.在Python中函数名是以小写字母开头 ,类名是以大写字母开头. ...

  9. python wx窗口无法关闭_菜鸟学Python,双手奉上老司机给上路新手总结的Python实战问题…...

    针对Python这一话题每天后台都会有不少小伙伴提出问题,下面我就将这些问题进行汇整,产出"Python实战问题篇",我认为这些问题非常具有代表性,希望可以帮到大家. 第一类问题: ...

最新文章

  1. 习题2.4 递增的整数序列链表的插入 (15 分)
  2. ubuntu apache php mysql phpmyadmin_Ubuntu下Apache+PHP+MySQL+phpMyAdmin的快速安装步骤
  3. NET问答: 如何给 ASP.NET Core 配置指定端口 ?
  4. 物联网架构成长之路(24)-Docker练习之Compose容器编排
  5. java jml_JML 入门
  6. C语言基础知识:printf的输出格式
  7. 秋游可以去哪些地方?
  8. 【Interfacenavigation】规划多个触摸屏尺寸(57)
  9. 高数————思维导图(上岸必备)(向量代数与几何部分)
  10. 华为笔试题:进制转换
  11. 《算法笔记》和《算法笔记上机训练指南》学习笔记汇总
  12. 实用的BeanUtils工具类
  13. ASO优化|五步解锁关键词选择优化正确姿势!
  14. amoeba mysql下载_amoeba for mysql
  15. 手码-在U-boot SPL 移植新的PMIC芯片驱动
  16. Springboot毕设项目查听课管理系统zkb6w(java+VUE+Mybatis+Maven+Mysql)
  17. 微信公众号网页授权--前端获取code及用户信息(vue)
  18. 快速搭建一个APMT265树莓派无人机
  19. Android 4.4 Kit Kat 源码下载
  20. php导出excel列数太多,PhpSpreadsheet导出Excel超过26列解决办法

热门文章

  1. 牛客题霸 [ 在二叉树中找到两个节点的最近公共祖先] C++题解/答案
  2. P7516 [省选联考 2021 A/B 卷] 图函数
  3. YbOJ-网格序列【拉格朗日插值】
  4. P7599-[APIO2021]雨林跳跃【二分,倍增,ST表】
  5. P4309-[TJOI2013]最长上升子序列【Splay】
  6. jzoj6310-Global warming【线段树,LIS】
  7. jzoj100042-保留道路【最小生成树,图论】
  8. P1463-[POI2002][HAOI2007]反素数【约数,数论】
  9. p2762-太空飞行计划问题【网络流,最大权闭合图,最小割】
  10. 【背包】SMRTFUN