c遗传算法的终止条件一般_KDD比赛之遗传算法(举例理解)

求最大值问题是这样的:
求解函数 f(x) = x + 10*sin(5*x) + 7*cos(4*x) 在区间[0,9]的最大值。
这个函数大概长这样:

90e5a46db22eb6a0a4fb88511efc69b8.png


那么如何应用遗传算法如何来找到这个奇怪的函数的最大值呢?
事实上,不管一个函数的形状多么奇怪,遗传算法都能在很短的时间内找到它在一个区间内的(近似)最大值。
相当神奇,不是吗?
接下来围绕这个问题,讲讲我对遗传算法的一些理解。实现代码以及在Matlab中使用遗传算法的小教程都附在最后。1.介绍
遗传算法(Genetic Algorithm)遵循『适者生存』、『优胜劣汰』的原则,是一类借鉴生物界自然选择和自然遗传机制的随机化搜索算法。
遗传算法模拟一个人工种群的进化过程,通过选择(Selection)、交叉(Crossover)以及变异(Mutation)等机制,在每次迭代中都保留一组候选个体,重复此过程,种群经过若干代进化后,理想情况下其适应度达到***近似最优***的状态。
自从遗传算法被提出以来,其得到了广泛的应用,特别是在函数优化、生产调度、模式识别、神经网络、自适应控制等领域,遗传算法发挥了很大的作用,提高了一些问题求解的效率。2.遗传算法组成

  • 编码 -> 创造染色体
  • 个体 -> 种群
  • 适应度函数
  • 遗传算子
    • 选择
    • 交叉
    • 变异
  • 运行参数
    • 是否选择精英操作
    • 种群大小
    • 染色体长度
    • 最大迭代次数
    • 交叉概率
    • 变异概率

2.1 编码与解码
实现遗传算法的第一步就是明确对求解问题的编码和解码方式。
对于函数优化问题,一般有两种编码方式,各具优缺点

  • 实数编码:直接用实数表示基因,容易理解且不需要解码过程,但容易过早收敛,从而陷入局部最优
  • 二进制编码:稳定性高,种群多样性大,但需要的存储空间大,需要解码且难以理解


对于求解函数最大值问题,我选择的是二进制编码。

71e8506613814e19e8cf8fbc00efe488.png

以我们的目标函数 f(x) = x + 10sin(5x) + 7cos(4x), x∈[0,9] 为例。
假如设定求解的精度为小数点后4位,可以将x的解空间划分为 (9-0)×(1e+4)=90000个等分。
2^16<90000<2^17,需要17位二进制数来表示这些解。换句话说,一个解的编码就是一个17位的二进制串。
一开始,这些二进制串是随机生成的。
一个这样的二进制串代表一条染色体串,这里染色体串的长度为17。
对于任何一条这样的染色体chromosome,如何将它复原(解码)到[0,9]这个区间中的数值呢?
对于本问题,我们可以采用以下公式来解码:

x = 0 + decimal(chromosome)×(9-0)/(2^17-1)


decimal( ): 将二进制数转化为十进制数
一般化解码公式:

f(x), x∈[lower_bound, upper_bound] 
x = lower_bound + decimal(chromosome)×(upper_bound-lower_bound)/(2^chromosome_size-1)


lower_bound: 函数定义域的下限
upper_bound: 函数定义域的上限
chromosome_size: 染色体的长度
通过上述公式,我们就可以成功地将二进制染色体串解码成[0,9]区间中的十进制实数解。2.2 个体与种群
『染色体』表达了某种特征,这种特征的载体,称为『个体』。
对于本次实验所要解决的一元函数最大值求解问题,个体可以用上一节构造的染色体表示,一个个体里有一条染色体。
许多这样的个体组成了一个种群,其含义是一个一维点集(x轴上[0,9]的线段)。2.3 适应度函数
遗传算法中,一个个体(解)的好坏用适应度函数值来评价,在本问题中,f(x)就是适应度函数。
适应度函数值越大,解的质量越高。
适应度函数是遗传算法进化的驱动力,也是进行自然选择的唯一标准,它的设计应结合求解问题本身的要求而定。2.4 遗传算子
我们希望有这样一个种群,它所包含的个体所对应的函数值都很接近于f(x)在[0,9]上的最大值,但是这个种群一开始可能不那么优秀,因为个体的染色体串是随机生成的。
如何让种群变得优秀呢?
不断的进化。
每一次进化都尽可能保留种群中的优秀个体,淘汰掉不理想的个体,并且在优秀个体之间进行染色体交叉,有些个体还可能出现变异。
种群的每一次进化,都会产生一个最优个体。种群所有世代的最优个体,可能就是函数f(x)最大值对应的定义域中的点。
如果种群无休止地进化,那总能找到最好的解。但实际上,我们的时间有限,通常在得到一个看上去不错的解时,便终止了进化。
对于给定的种群,如何赋予它进化的能力呢?

  • 首先是选择(selection)
    • 选择操作是从前代种群中选择***多对***较优个体,一对较优个体称之为一对父母,让父母们将它们的基因传递到下一代,直到下一代个体数量达到种群数量上限
    • 在选择操作前,将种群中个体按照适应度从小到大进行排列
    • 采用轮盘赌选择方法(当然还有很多别的选择方法),各个个体被选中的概率与其适应度函数值大小成正比
    • 轮盘赌选择方法具有随机性,在选择的过程中可能会丢掉较好的个体,所以可以使用精英机制,将前代最优个体直接选择
  • 其次是交叉(crossover)
    • 两个待交叉的不同的染色体(父母)根据交叉概率(cross_rate)按某种方式交换其部分基因
    • 采用单点交叉法,也可以使用其他交叉方法
  • 最后是变异(mutation)
    • 染色体按照变异概率(mutate_rate)进行染色体的变异
    • 采用单点变异法,也可以使用其他变异方法


一般来说,交叉概率(cross_rate)比较大,变异概率(mutate_rate)极低。像求解函数最大值这类问题,我设置的交叉概率(cross_rate)是0.6,变异概率(mutate_rate)是0.01。
因为遗传算法相信2条优秀的父母染色体交叉更有可能产生优秀的后代,而变异的话产生优秀后代的可能性极低,不过也有存在可能一下就变异出非常优秀的后代。这也是符合自然界生物进化的特征的。

3.遗传算法流程

c2cec3aee4379d1e1606d57d05b5dce1.png

附上实现代码: genetic-algorithm
如果你觉得这个仓库对你有帮助,欢迎给她一个 star 或者 fork 一下!
测试结果

  • 最优个体:00011111011111011
  • 最优适应度:24.8554
  • 最优个体对应自变量值:7.8569
  • 达到最优结果需要的迭代次数:多次实验后发现,达到收敛的迭代次数从20次到一百多次不等
    迭代次数与平均适应度关系曲线(横轴:迭代次数,纵轴:平均适应度)

5d914e30a15ce0cf79f20420577fc22a.png

有现成的工具可以直接使用遗传算法,比如 Matlab。
最后就再介绍一下如何在 Matlab 中使用遗传算法。在 MATLAB 中使用 GA 工具
1. 打开 Optimization 工具,在 Solver 中选择 ga - genetic algorithm,在 Fitness function 中填入 @target
2. 在你的工程文件夹中新建 target.m,注意MATLAB的当前路径是你的工程文件夹所在路径
3. 在 target.m 中写下适应度函数,比如

function [ y ] = target(x) 
y = -x-10*sin(5*x)-7*cos(4*x); 
end


*MATLAB中的GA只求解函数的(近似)最小值,所以先要将目标函数取反。
4. 打开 Optimization 工具,输入 变量个数(Number of variables) 和 自变量定义域(Bounds) 的值,点击 Start,遗传算法就跑起来了。最终在输出框中可以看到函数的(近似)最小值,和达到这一程度的迭代次数(Current iteration)和最终自变量的值(Final point)
5. 在 Optimization - ga 工具中,有许多选项。通过这些选项,可以设置下列属性

  • 种群(Population)
  • 选择(Selection)
  • 交叉(Crossover)
  • 变异(Mutation)
  • 停止条件(Stopping criteria)
  • 画图函数(Plot functions)

Reference

  • Alex Yu , 简单遗传算法MATLAB实现
  • 《机器学习》/(美)米歇尔 (Mitchell, T. M.)著;曾华军等译. —北京:机械工业出版社。
如何通俗易懂地解释遗传算法?有什么例子?​www.zhihu.com

kdd比赛遗传算法代码

hexagon-ml​compete.hexagon-ml.com

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

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

相关文章

6.elasticsearch查询与过滤上下文(query context与filter contenxt)以及term术语查询

【README】 1.本文总结自&#xff1a; Query and filter context | Elasticsearch Guide [7.2] | Elastichttps://www.elastic.co/guide/en/elasticsearch/reference/7.2/query-filter-context.html2.文档相关性分数是否被计算&#xff0c;取决于查询子句是在查询上下文&…

Oracle入门(十四.22)之创建DDL和数据库事件触发器

一、什么是DDL和数据库事件触发器&#xff1f;DDL语句触发DDL触发器&#xff1a;CREATE&#xff0c;ALTER或DROP。 数据库事件触发器由数据库中的非SQL事件触发&#xff0c;例如&#xff1a; •用户连接到数据库或与数据库断开连接。 •DBA启动或关闭数据库。•用户会话中引发了…

Visual Studio上开发Python?你不可不知道的六大功能!

Visual Studio 2013/2015 搭配 Python Tools for Visual Studio 扩充套件让 Visual Studio 能提供对 Python 程序语言高度整合的开发环境&#xff0c;并完整发挥 Visual Studio 强大的功能&#xff0c;协助您在 Visual Studio 内开发 Python 程序上如虎添翼&#xff0c;提升开发…

qt中sendevent_Qt中postEvent和sendEvent函数

Qt中postEvent和sendEvent函数部分内容参考http://blog.csdn.net/lvmengzou/article/details/65450908qt事件循环需要维护一个事件队列&#xff0c;在Qt的main函数中最后一般调用QApplication::exec()成员函数来保持程序对事件队列的处理&#xff0c;exec()的实质是不停调用pro…

IIS负载均衡-Application Request Route详解第五篇:使用ARR来配置试点项目

看到本篇的题目&#xff0c;大家可能感到有点奇怪&#xff01;下面&#xff0c;我们就来看看这到底是什么意思。 大家可能遇到过这样的一种情况&#xff1a;希望根据某些请求用户的特性&#xff0c;将用户的请求导向不同的站点&#xff08;请大家这里区分“亲缘性”的概念&…

Oracle入门(十四.23)之管理触发器

一、触发器需要特权要在模式中创建触发器&#xff0c;需要&#xff1a; •CREATE TRIGGER系统特权 •触发器主体中引用的其他架构中的对象的普通对象特权&#xff08;SELECT&#xff0c;UPDATE&#xff0c;EXECUTE等&#xff09; •与触发器关联的表或视图上的ALTER特权。触发器…

为什么哲学是最难的学科_什么是哲学哲学对大师来说可能非常理论化,没有一定哲学基础肯能很难 爱问知识人...

我的总结是科学哲学是从哲学角度考察科学的一门学科。它以科学活动和科学理论为研究对象&#xff0c;探讨科学的本质、科学知识的获得和检验、科学的逻辑结构等有关科学认识论和科学方法论的基本问题。哲学是什么&#xff1f;这是一个问题&#xff0c;一个既简单又复杂的问题。…

8.es更新文档通过版本号实现并发控制

【README】 1.本文介绍了es更新文档时的并发控制策略&#xff1b;2.通过版本号实现并发控制&#xff08;类似于mysql中基于版本号的乐观锁&#xff09;&#xff1b;3.Es为支持并发控制&#xff0c;为每篇文章设置了版本号_version。初始值为1&#xff0c;每更新1次加1。…

Oracle入门(十五)之数据库锁

一、锁的概念 锁是数据库用来控制共享资源并发访问的机制。锁用于保护正在被修改的数据直到提交或回滚了事务之后&#xff0c;其他用户才可以更新数据二、锁定的优点 一致性 - 一次只允许一个用户修改数据完整性 - 为所有用户提供正确的数据。如果一个用户进行了修改并保存&a…

.NET 和 Mono 的一点历史

提到微软公司研发 .NET Framework 的初衷&#xff0c;难免要提到 SUN 公司1995年推出的 Java 语言。由于 Java 在业界得到了广泛的支持而且迅速建立了庞大的生态系统&#xff0c;微软也不得不考虑如何加以应对&#xff0c;毕竟自己手里的 Visual Basic 和 Visual C 和 Java 一比…

lisp 角平分线_证明冯奥贝尔定理的3种方法

怎样证明冯奥贝尔定理&#xff1f;Von.Aubel定理: 以任意四边形ABCD的边为斜边作四个转向相同的等腰直角三角形ΔABE&#xff0c;ΔBCF&#xff0c;ΔCDG&#xff0c;ΔDAH。则:EGFH&#xff0c;EG⊥FH。关于上述定理的几点说明:(1)&#xff0c;条件是任意四边形&#xff0c;所…

java迭代实现二叉树先中后序遍历(非递归)

【README】 本文复习了通过java迭代实现 二叉树先序&#xff0c;中序&#xff0c;后序遍历&#xff1b; 本文引入了 栈&#xff0c;替换了递归&#xff0c;对二叉树进行遍历&#xff1b; 补充&#xff1a;使用递归遍历二叉树缺点&#xff1a; 众所周知&#xff0c;每次递归…

漫画:什么是分布式锁

转载自 漫画&#xff1a;什么是分布式锁分布式锁的实现有哪些&#xff1f;1.Memcached分布式锁利用Memcached的add命令。此命令是原子性操作&#xff0c;只有在key不存在的情况下&#xff0c;才能add成功&#xff0c;也就意味着线程得到了锁。2.Redis分布式锁和Memcached的方式…

程序员求职面试三部曲之一:选择合适的工作单位

前不久在知乎上看到一个话题&#xff0c;大概是说中国比国外好的有哪些方面&#xff0c;网友们例举了一大堆&#xff0c;其中有一条是说“在中国找工作比较容易”。 是的&#xff0c;特别对于我们IT从业者来说&#xff0c;找工作真的是小菜一碟&#xff1b;只要肯在网络上公开简…

处理api返回的数据_API 乐队指挥家,网关服务正式上线

随着知晓云小伙伴们业务的发展&#xff0c;对我们服务的支持又有了新的要求&#xff0c;比如在对接第三方服务时&#xff0c;需要自定义数据结构等。为此&#xff0c;经过 32 次的需求讨论会以及工程师们的紧张开发后&#xff0c;知晓云 API 网关诞生了。你可以通过可视化界面配…

数据结构排序总结

【0】README 0.1&#xff09; 本文总结于 数据结构与算法分析个人的学习心得体会&#xff0c;源代码均为原创&#xff1b; 0.2&#xff09; 本文列出了数据结构中基本上所有的数据结构排序算法&#xff0c; 整理了相关的博文&#xff08;源代码&#xff09;&#xff1b; 0.3…

IIS负载均衡-Application Request Route详解第六篇:使用失败请求跟踪规则来诊断ARR

失败请求跟踪规则&#xff08;FailedRequest Tracing Rules&#xff09;是IIS7中对请求处理进行诊断的强大的工具。我们本篇文章将会带领大家一步步的来配置失败请求跟踪规则&#xff0c;并且告诉大家如何使用这些信息来诊断ARR。 要真正的理解本篇文章要讲述的知识&#xff0c…

减一天 日期函数_一文掌握excel中的日期函数

在excel中&#xff0c;因为日期的特殊性&#xff0c;大部分关于日期的运算都要用到特有的函数。对于大多数小伙伴们可能没有专门去学习过日期函数都有哪些&#xff1f;如何运用&#xff1f;可以实现什么样的功能&#xff1f;今天小编就为大家整理出来并详细介绍一下常用的日期函…

软件开发的微信公众号分享

一、已阅 &#xff08;1&#xff09;程序员面试&#xff08;mvpjob&#xff09;&#xff08;2&#xff09;程序员小灰&#xff08;chengxuyuanxiaohui&#xff09;&#xff08;3&#xff09;Hollis&#xff08;hollischuang&#xff09;&#xff08;4&#xff09;Java技术栈&am…

算法递归简论

【0】README 0.1&#xff09; 本文总结于 数据结构与算法分析&#xff0c;旨在了解设计 递归程序 的相关法则和技巧&#xff1b; 0.2&#xff09; 我记忆尤新的一点是&#xff1a; 凡事可以用循环代替的递归函数&#xff0c;它就不是一个好的递归函数&#xff0c;对我帮助很大…