遗传算法总结(#看了就能懂和用系列#)

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遗传算法工具箱及应用》,着实实用,实际操作也有,优化也有。

时间: 2024-10-06 15:32:52

遗传算法总结(#看了就能懂和用系列#)的相关文章

js实现分页的几个源码,看完基本就懂了

第一种: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>addUser.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta htt

Bootstrap中的datetimepicker用法,只看一眼就全懂了

本文实例为大家分享了bootstrap datetimepicker日期插件的简单使用,供大家参考,具体内容如下 首先在文件头部引入必要的文件: 1 2 <link rel="stylesheet" href="Css/bootstrap-datetimepicker.min.css"> <script src="Js/bootstrap-datetimepicker.js"></script> 然后调用初始化

比特币是什么-看这边你就懂了

对于比特币也许一千个人有一千种理解.本文作为入门篇,我尽量用简单易懂的语言来介绍比特币.到底什么是比特币,它到底是怎么运行的呢. 比特币是什么 比特币是一种基于分布式网络的数字货币.比特币系统(广义的比特币)则是用来构建这种数字货币的网络系统,是一个分布式的点对点网络系统. 本文主要讲解狭义的比特币概念. 数字货币是什么 凯恩斯在<货币论>上讲,货币可以承载债务,价格的一般等价物.货币的本质是等价物,它可以是任何东西,如:一张纸,一个数字,只要人们认可它的价值.人民币,美元等作为国家信用货币,

手机究竟要不要升级系统?总是自动升级该怎么办?看完你就懂了

手机到底该不该升级?这是很多朋友都会遇到的问题,而且不分安卓与苹果.有些朋友升级后说,手机更流畅功能更多了.而也有朋友表示,手机升级后耗电增加了,而且还变卡了许多.为什么会出现两种截然不同的情况呢?下面我们就一起来看看原因. 1. 系统升级的好处 其实系统升级也是分大小的,通常小升级就是几十兆大小,并且只是修复一些已知的bug和小问题.而大升级指的是大跨度升级,比如说EMUI9到EMUI10之类的,此类升级带来的更新也会比较大,并且会增加一些新功能. 2. 系统升级的风险 其实系统升级是存在风险

什么是面向服务的体系结构?看完你就懂了

通过优锐课的java架构知识讲解中,了解面向服务的体系结构的特征以及什么构成基于Java的SOA基础结构.分享给大家学习参考. 面向服务的体系结构(SOA)是基于用于同步和异步应用程序的请求/答复设计范例的分布式计算的演变.应用程序的业务逻辑或各个功能被模块化,并作为针对消费者/客户端应用程序的服务呈现.这些服务的关键是它们的松散耦合性质.即服务接口独立于实现.应用程序开发人员或系统集成商可以通过组合一项或多项服务来构建应用程序,而无需了解服务的基础实现.例如,可以在.Net或J2EE中实现服务

《后端也要懂一点前端系列》使用webpack搭建项目

今天突然有兴致想要学习一下前端的技术,所以特此记录学习前端之路.由于之前在公司做的项目大部分都是关于JSP页面的增删改查,所以前端后端都是一个人来写的,对于前端还只是停留在js.html.css阶段,对于一些前端框架是一点也不了解,正好学习后端的时候遇到了cookie.session.token的问题,特此也简单的了解一下前端知识. 概念介绍 大概在网上找了一些的教程,由于是想速成,所以先从搭建项目开始学起了.搭建项目使用的webpack,我觉得前端的webpack和后端的gradle.mave

你的计算机也可以看懂世界(一)——十分钟跑起卷积神经网络(Windows+CPU)

学习.使用卷积神经网络已经挺久了,期间一直在基于贾扬清大神的Caffe框架来研究别人的模型,抑或是在无聊的时候以近似于算命一样的方式,眼睛微闭,摇头晃脑,口中不时漏出几个音节,半晌便DIY出一个自认为改进颇多的模型,然后去跑一下,当然结果是非常惨淡的(要不然我就直接发论文了哪有这么闲还来写博客...),从这个过程中,我深刻地体会到了"前人栽树后人乘凉"这句话的正确性,虽然贾大神这个前人也不比我等大上几岁.今天听说贾大神宣布了最新的可以在移动设备上进行训练和测试的Caffe框架,心想我知

你觉得:产品经理需要懂技术吗?

相信绝大部分想从事产品经理工作或刚入行的产品经理都会问这样的问题:做产品经理要不要懂技术?需要懂到什么程度?怎么着手学习技术?要成为一名优秀产品经理,需要什么特质? 今天纽带线CRM系统小编跟大家详聊产品经理需不需要懂技术. 要不要懂技术? 产品经理也分多种类型,不同类型的产品经理对技术的要求也不尽相同.总的来说,产品经理懂一定技术是有利于其工作的.原因请往下看. 为何要懂技术? 产品经理学点技术知识,无外乎以下3点: 1.实现与技术无障碍沟通.异步通知.回调.ajax等总得知道吧. 2.更深层

读懂IL代码就这么简单(二)

一 前言 IL系列 第一篇写完后 得到高人指点,及时更正了文章中的错误,也使得我写这篇文章时更加谨慎,自己在了解相关知识点时,也更为细致.个人觉得既然做为文章写出来,就一定要保证比较高的质量,和正确率 .感谢 @冰麟轻武 的指点 你没有看第一篇?  点这里看第一篇 读懂IL代码就这么简单(一) IL指令大全 :IL指令详解 IL反编译工具: ILDasm 知识点回顾: Managed Heap(托管堆):用于存放引用类型的值 Evaluation Statck(计算栈):临时存放值类型数据,引用