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

遗传算法是一种智能优化算法,通常用于求解复杂的数学问题。相比于传统方法,遗传算法摒弃了盲目的穷举或完全随机的求解策略,借鉴了自然界优胜劣汰、自然进化的思想,快速逼近最优解。上文对遗传算法的基本内容进行了介绍,本文将通过一个例子的讲解带领读者深入遗传算法的每一个具体步骤,并用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包中都集成了遗传算法工具包,只需要几行代码就能完成遗传算法的计算,但是我觉得自己动手实现有助于加深我们对遗传算法的理解。完整代码已上传,老规矩,如果需要请在下方评论留言。

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

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

相关文章

JAVA面试常考系列十一

转载自 JAVA面试常考系列十一 题目一 什么是JSP? JSP(Java Server Page)是一个文本文档,是一种将静态内容和动态生成内容混合在一起的技术。 JSP包含两种类型的文本:静态数据和JSP元素。静态数据可以用任何基于文本的格式表示,如H…

.NET跨平台实践:用C#开发Linux守护进程

Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作。 一句话,为Linux开发与控制台无关…

ThreadLocalRandom与Random区别

转自: 一文秒懂 Java ThreadLocalRandom - Java 一文秒懂 - 简单教程,简单编程随机数生成是一个非常常见的操作,而且 Java 也提供了 java.util.Random 类用于生成随机数,而且呢,这个类也是线程安全的,就是…

python自动配置文件_【python接口自动化】- ConfigParser配置文件的使用

前言:目前我们使用的绝大多数计算机程序,无论是办公软件,浏览器,甚至游戏、视频都是通过菜单界面系统配置的,它几乎成了我们使用机器的默认方式。而在python中,也有这样的一个配置模块可以把代码可配置化。…

JAVA面试常考系列十

转载自 JAVA面试常考系列十 题目一 Servlet是什么? Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,是用Java编写的服务器端程序,主要的作用是处理客户端请求并生成动态Web内容。…

DotNet 资源大全

Awesome DotNet,这又是一个 Awesome XXX 系列的资源整理,由 quozd 发起和维护。内容包括:编译器、压缩、应用框架、应用模板、加密、数据库、反编译、IDE、日志、风格指南等。 伯乐在线已在 GitHub 上发起「DotNet 资源大全中文版」的整理。欢…

javabean与json转换(fastjson与jackson两个版本)

【README】 本文演示了 javabean与json转换的开发方式&#xff1b; 要想 javabean的属性名 与 json的字段名不一致&#xff0c;也是可以转换的&#xff1b; 之前需要引入 ali.fastjson <dependency><groupId>com.alibaba</groupId><artifactId>fas…

mysql数据库新建一个递增的_分享一个mysql实验—基于数据库事务隔离级别RR及RC的测试...

概述今天主要分享一个最近做的实验&#xff0c;主要是测试mysql数据库在RR和RC不同事务隔离级别下的表现。MySQL使用可重复读来作为默认隔离级别的主要原因是语句级的Binlog。RR能提供SQL语句的写可串行化&#xff0c;保证了绝大部分情况(不安全语句除外)的DB/DR一致。下面以my…

直面Java第45期

转载自 直面Java第45期

ABP框架搭建项目系列教程基础版

我现在要着手一个新的项目&#xff0c;也打算用这个框架&#xff0c;所以想要将我一步一步用这个框架的做项目的步骤和想法跟大家分享出来。 经过前面十二篇的基础教程&#xff0c;现在终于该做个总结了。 第一篇&#xff0c;我们建议新手朋友们先通过ABP官网的启动模板生成解决…

字节数组转jsonobject(如读取HttpServletRequest.inputstream到jsonobject)

【README】 本文po出了 如何读取 字节数组到jsonobject&#xff1b; 字节数组如何获取&#xff0c;本文不再赘述&#xff1b; 【1】代码 /*** Description 字节数组转json演示* author xiao tang* version 1.0.0* createTime 2022年02月11日*/ public class ByteArr2JsonDem…

sql server 2008安装_性能不够?基于时序数据库的Zabbix 5.2安装指南

我们往往在谈论zabbix的优缺点的时候&#xff0c;提到最多的依然还是数据库(默认采用关系型数据库)&#xff0c;由于关系型数据库所有的读写都是采用sql语句解析&#xff0c;一但并发过大或者数据量过大&#xff0c;处理能力就显得捉襟见肘&#xff0c;这也是Zabbix让人诟病的地…

对象并不一定都是在堆上分配内存的

转载自 对象并不一定都是在堆上分配内存的 JVM内存分配策略 关于JVM的内存结构及内存分配方式&#xff0c;不是本文的重点&#xff0c;这里只做简单回顾。以下是我们知道的一些常识&#xff1a; 1、根据Java虚拟机规范&#xff0c;Java虚拟机所管理的内存包括方法区、虚拟机栈、…

Bash on Windows 抢鲜测试 -- 介绍及安装

前言 微软在上周的Windows BUILD大会上宣布&#xff0c;WIN10将引入原生Bash&#xff0c;并将很快在技术预览版中推出。 如此一来&#xff0c;windows的命令行工具就不再只有cmd和powershell了&#xff0c;我们可以还可以使用bash。 今天&#xff08;2016/4/8&#xff09;收到了…

jvm的client与server工作模式

【README】 JVM Server模式与client模式启动&#xff0c;最主要的差别在于&#xff1a; -Server模式启动时&#xff0c;速度较慢&#xff0c;但是一旦运行起来后&#xff0c;性能将会有很大的提升. 原因是:当虚拟机运行在-client模式的时候,使用的是一个代号为C1的轻量级编译…

python重定向到socket_python套接字流重定向实例汇总

#!/usr/bin/env python3"""测试socket-stream 重定向模式"""import sys,os,timefrom multiprocessing import Processfrom socket import *def initListenerSocket(port50008,host):"""初始化在服务器模式下调用者用于监听连接的…

Spring Boot的自动化配置原理

转载自 Spring Boot的自动化配置原理 随着Ruby、Groovy等动态语言的流行&#xff0c;相比较之下Java的开发显得格外笨重。繁多的配置、低下的开发效率、复杂的部署流程以及第三方技术集成难度大等问题一直被人们所诟病。随着Spring家族中的新星Spring Boot的诞生&#xff0c;这…

复盘Build 2016:不要错过微软给.NET开发者的这些福利

本文作者陈计节&#xff0c;ThoughtWorks 高级咨询师。多年的跨平台 .NET 开发者&#xff0c;全栈工程师&#xff0c;技术布道师。擅长互联网应用程序的设计、开发和运维等工作。 近年来&#xff0c;微软坚持为社区提供更多灵活性&#xff0c;并以更开放的思路重构其已有平台&a…

java异步线程内存可见性实验

【README】 本文演示了内存可见性的场景&#xff0c;以及解决方法&#xff1b; 相关定义如下&#xff08;转自java并发编程实战&#xff0c;一本好书&#xff0c;强烈推荐&#xff09;&#xff1a; 内存可见性&#xff1a;一个线程修改了对象状态后&#xff0c; 其他线程可以…

springboot 单例_如何实现一个单例及优化

前言 社长,一个爱学习,爱分享的程序猿,始终相信,付出总会有回报的。 知识改变命运,学习成就未来。爱拼才会赢! 程序猿学社的GitHub,已整理成相关技术专刊,欢迎 Star:。 https:// github.com/ITfqyd/cxyxs 社长,4年api搬运工程师,之前做的都是一些框架的搬运工作,做的时间…