遗传算法入门C1
遗传算法入门C1
觉得有用的话,欢迎一起讨论相互学习~Follow Me
遗传算法历史
- 遗传算法(GA)是从生物进化的角度考虑提出来的方法,19世纪达尔文在大量观察基础上总结了大自然进化规律,即优胜劣汰:后来孟德尔通过豌豆实验发现了遗传规律、分离规律和自由组合规律。遗传是指父代的基因将会遗传到子代中去,父代和子代具有相似性,同时,父代与子代也会有不同点,否则,从进化角度考虑,父代和子代无差别,物种没有出现进化。当子代中出现不适应生存的个体时,将会逐渐被环境淘汰,具有环境生存优势的个体将生存下来,这样遗传通过基因传递,并和环境相互作用,让基因朝着有利于生存的方向进化,优良的基因库就得以保存。
- 在19世纪60年代,科学家Fraser在其论文中首先提到了选择和突变操作。密西
根大学教授J.Holland在20世纪70年代研究自然和人工自适应系统时,首先提出了遗传算法基本形式。在80年代Goldberg根据前人研究成果,将遗传算法主要过程分为 选择、遗传和变异三部分 。由于遗传算法适应能力较强,同时具备较强的全局搜索能力,使遗传算法在各个领域都得到了广泛的应用,同时也促使遗传算法在理论上得到了很大的发展 运用遗传算法求解实际问题时, 我们需要将目标问题同遗传算法建立联系, 即通过遗传编码建立关联。 每一个编码可以称为个体或者染色体,多个解的个体构成了种群。 遗传算法通过模拟生物进化对种群中个体进行 选择、交叉、变异操作 ,能将优秀的基因保留下来,传递给后代,使种群向最优方向进化。
遗传编码
- 运用遗传算法寻求最优解时,在确定目标函数后,需要把函数变量转化成染色体表现形式,编码的过程必须满足以下条件:
- 必须保证解的空间中的所有解都在编码空间内
- 每一个解都能通过交叉和变异操作转化成解的空间中其他任意解
- 每一个染色体都是对应解的空间内的一个特定解
遗传编码方式很重要,同一问题不同的编码方式可能使遗传算法的出来的结果出现较大的差异,好的编码方式能提高求解效率,因此,需要根据求解问题的特点决定编码方式。根据前人总结,编码方式一般有二进制编码、浮点数编码和格雷码编码等编码形式。
适应度函数
遗传算法为了保证种群向着对环境适应能力较强的方向进化,就需要一个 评价标准 保证某一代中较优秀的个体能 有较大的概率将基因遗传给下一代 ,因此,遗传算法中就引入了 适应度函数 的概念。 个体中适应度值较大,其个体就有较大的概率遗传给下一代 反之,适应度值小的,其个体淘汰的概率就比较高,模拟进化过程中的优胜劣汰。
遗传操作
选择
选择操作的目的是为了将 当代 种群中 适应度值较高 的个体保存下来,将 适应度值低的个体淘汰 ,选择操作的过程中 本身不会产生任何新的个体 。但是选择操作由于是一个 随机选择过程 ,只是表示适应度值较高的个体将 有较高的概率 将自身基因遗传给下一代,并不表示适应度值较低的个体一定会淘汰, 但是,总体的趋势会是基因库中的基因越来越好,适应度值越来越高。选择操作的方法目前主要有 轮盘赌选择、最优保留法、期望值法 等等。
轮盘赌选择法
轮盘赌选择法又称为比例选择法,其选择方式是随机的,不过适应度值较高的被选择的概率大。设定种群规模为N,其中个体i的适应度值为\(f_i\),在选择操作中其被选中的概率为:\[P_i=\frac{f_i}{\sum^{N}_{i=1}f_{i}}\]
由于轮盘赌选择法是随机选择的,因此,有可能将适应度值较大的个体淘汰,导致最终结果可能不能寻找到最优解,通常,可以将 最优保留法和轮盘赌选择法结合选择 ,先通过 最优保留法 将适应度值最高的个体保留,之后再进行 轮盘赌选择法进行选择交叉
- 交叉操作在遗传算法中占据比较重要的作用,遗传算法中 产生新个体的主要就是通过交叉操作完成的 交叉操作的具体过程是 父代随机选取两个个体,按照某种规则对染色体上的基因相互交换,形成新的个体 ,这样做的目的是 为了将优秀的基因段通过交叉的方式有效进行整合,使下一代个体的适应度值比上一代更高 。常见的交叉规则有 单点交叉、多点交叉和均匀交叉 三种方式。
- 单点交叉 的方式是在染色体上随机选定一个基因点作为交叉位置,父代中两染色体在此处的基因信息互换,这样就形成了两个子代个体。如下图所示,对其基因采用二进制编码,若随机交叉点为第三基因位。

- 多点交叉 是指染色体中有 两个或两个以上的基因位点交叉 ,图中染色体同样采用二进制编码,假定多点交叉为随机取两个基因位点交叉。若交叉点发生在第二、三基因位。

- 均匀交叉 其交叉通过两父代染色体之间设置一个屏蔽码来实现的, 屏蔽码的长度需要与染色体上的基因为长度一致 如下图所示,图中在父代染色体中出现了一串屏蔽码,使用规则为: 凡是屏蔽码中码为1时,父代染色体中与之对应的基因位发生交叉互换;凡是屏蔽码中码为0,则与之对应的父代染色体基因位不进行交叉操作

- 单点交叉 的方式是在染色体上随机选定一个基因点作为交叉位置,父代中两染色体在此处的基因信息互换,这样就形成了两个子代个体。如下图所示,对其基因采用二进制编码,若随机交叉点为第三基因位。
遗传交叉操作方式的选取对遗传算法效率影响较大,具体采用何种交叉方式取决于实际问题情况,总之无论采取哪种交叉方式,都需要 保证种群基因多样性,不然容易使遗传算法陷入早熟。但是,交叉点太多,又极可能导致遗传算法无法收敛
变异
- 生物进化过程中,在外在环境发生较大变化时,某些物种大部分个体由于环境变化而消亡,但是有极少数个体能够生存下来,其原因是因为环境发生大的变化时,其个体内的基因发生了突变,基因突变导致出现了新的基因出现,而此基因能适应改变后的环境。显然,变异操作也在遗传算法中对保持种群多样性、防止早熟、丰富基因库有着重大意义。
- 变异操作的概念是指种群中任意个体以一定的概率使其染色体中一个或几个基因位发生突变。这种操作很有可能出现原有种群通过交叉获取不到的基因表现形式,在丰富种群基因库同时也能防止遗传算法过早的收敛。下图为对基因位的变异操作过程,取变异基因位为第一位

遗传编码、选择、交叉和变异组成了遗传算法的基本框架 ,即遗传算法的标准组成部分,其操作过程都是采用随机操作,有一定能力 跳出局部最优 ,具有较好的 全局搜索能力 。通过对遗传算法的编码形式的分析,可以得出遗传算法在面对 非线性、不连续、离散型 问题时,具有较强的处理能力,在解决实际问题中具有较强的适应能力。下图是一个标准遗传算法的程序流程图,严格按照选择、交叉和变异来进行,在达到终止条件时,遗传进化停止,输入所求得最优解。

遗传算法入门C1的更多相关文章
- NSGA-II入门C1
NSGA-II入门C1 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献1 参考文献2 白话多目标 多目标中的目标是个瓦特? 多目标即是优化问题中的优化目标在3个及以上,一般这些优化的 ...
- 优化算法系列-遗传算法(3)——NSGAII学习网址
JMetal https://www.cnblogs.com/denggaoshan/p/6306640.html https://www.cnblogs.com/denggaoshan/p/6308 ...
- css3复杂选择器+内容生成+Css Hack
1.复杂选择器2.内容生成3.多列4.CSS Hack(浏览器兼容性)=======================================1.复杂选择器 1.兄弟选择器 1.特点: 1.通过 ...
- 【Machine Learning】机器学习の特征
绘制了一张导图,有不对的地方欢迎指正: 下载地址 机器学习中,特征是很关键的.其中包括,特征的提取和特征的选择.他们是降维的两种方法,但又有所不同: 特征抽取(Feature Extraction): ...
- 外连接的用法 -- 《SQL进阶教程》 jupyter note
import pandas as pd import sqlite3 conn = sqlite3.connect('1-5.db') 用外连接进行行列转换1(行 -> 列): 制作交叉表 怎么 ...
- python的遗传算法--Hello World入门篇
本系列文章代码取材于书籍<Genetic Algorithms with Python>,本人是在校电气专业的研究生,立志从事于Python相关的代码工作,具体什么方向还有待深究. 众所周 ...
- XTU | 人工智能入门复习总结
写在前面 本文严禁转载,只限于学习交流. 课件分享在这里了. 还有人工智能标准化白皮书(2018版)也一并分享了. 绪论 人工智能的定义与发展 定义 一般解释:人工智能就是用 人工的方法在 **机器( ...
- 【第四篇】ASP.NET MVC快速入门之完整示例(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- 续关于C#的微信开发的入门记录一
前几天写了一篇博客<关于C#的微信开发的入门记录一>,原文地址:http://www.cnblogs.com/zhankui/p/4515905.html,现在继续完善: 目前很多小伙伴都 ...
随机推荐
- 2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-准备阶段
2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-准备阶段 在一个人孤身奋斗了将近半个学期以后,终于迎来的我们的第一次团队协作共同编码,也就是,我们的第一个结对编程练 ...
- 团队项目--NABCD模型
蹭课神器 N(need需求) 每个人的兴趣都不一样,或许你很喜欢自己的专业,并且想再进一步学习专业知识:或许你不是太喜欢自己的专业,想上一些自己感兴趣的课程:但是,当你想上你所钟 意的课时,却发现自己 ...
- 特别好用的eclipse快捷键
alt+/ 提示 alt+shift+r重命名 alt+shift+j添加文档注释 Ctrl+shift+y小写 Ctrl+shift+x大写 ctrl+shift+f格式化代码(需要取消输入法的简繁 ...
- DPDK skeleton basicfwd 源码阅读
学习这个例子用于理解单纯的 dpdk 转发过程,L2 和 L3 的转发是基于此:在rte_eth_rx_burst()收包后进行解包,提取 mac.ip 等信息然后在转发到输出网卡. 如果要写出自己的 ...
- c语言文法定义
<程序>→<外部声明>|<程序><外部声明> <外部声明>→<函数定义>|<声明> <函数定义>→< ...
- BUAA软工个人作业Week2-代码复审
一. 代码复审Check List 1.概要部分 代码能符合需求和规格说明么? 对-c的测试: 可以看到程序不支持1000000的数独终局输出,读源码发现常量MaxCounts定义为了100000,导 ...
- [转]string和stringstream用法总结
转自:http://blog.csdn.net/xw20084898/article/details/21939811 作者:xw20084898 一.string string 是 C++ 提供的字 ...
- 前端切图相关ps技术
标签(空格分隔): 前端切图 复制图层到一个新的ps文件 对于单个图层 1.选中图层 2.CTRL+A全选 3.CTRL+C 4.CTRL+N新建文件,文件大小默认就可以(背景透明也在这个面板设置), ...
- 多线程-Thread的run()与start()的区别
总结: 1) start: 用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码.通过调用Thread类的start()方法来启动一个线程,这 ...
- MySql的多存储引擎架构, 默认的引擎InnoDB与 MYISAM的区别(滴滴)
1.存储引擎是什么? MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术, ...