来自:https://blog.csdn.net/u010451580/article/details/51178225

  

遗传算法是模仿生物进化机制的随机全局搜索和优化方法。借鉴达尔文进化论和孟德尔的遗传学说。

相关术语:

  基因型(genotype):性状染色体的内部表现;

  表现形(phenotype):性状外部表现。或个体的外部表现。

  进化(evolution):种群逐渐适应生存环境。生物进化是以种群的形式进行。

  适应度(fitness):度量某个物种对生存环境的适应程度。

  选择(selection):以一定的概率从种群中选择若干个个体。一般,选择过程是基于适应度的优胜劣汰的过程。

  复制(reproduction):细胞分裂时,DNA通过复制转移到新细胞,新细胞继承旧细胞的基因。

  交叉(crossover):两个染色体相同位置DNA被切断,前后两串分别交叉组合成两个新染色体。

  变异(mutation):复制时小概率产生差错,产生新染色体,表现出新性状。

  编码(coding):DNA中遗传信息在一个长链上按一定模式排列。

  解码(decoding):基因型到表现型的映射。

  遗传算法中每条染色体对应遗传算法的一个解决方案,用适应性函数衡量解决方案的优劣。所以从一个基因组到其解的适应度形成一个映射。遗传算法过程可以看作是一个多元函数求最优解的过程。

实例:已知一元函数 f(x) = xsin(10πx)+2   x∈[-1,2],求函数最大值。

“袋鼠跳”问题

  函数曲线理解成山峰和山谷的组成,设想得到的每个解就是一只袋鼠,求最大值转换为袋鼠不断的向更高处跳,直到最高的山峰。

爬山法:

  爬山法中,袋鼠只上坡,没下坡,但不能保证是全局最高峰。

模拟退火:

  模拟退火中,袋鼠喝醉了,而且随机地大跳很长时间。运气好的话,从一个山峰跳过山谷,到了另外一个更高的山峰上。但最后,它渐渐清醒了并朝着它所在的峰顶跳去。

遗传算法:

  遗传法中,有很多袋鼠,降落到不同地方,这些袋鼠不知道它们的任务是寻找全局最高峰。但每过几年,就在一些海拔较低的山峰射杀一些袋鼠,并希望存活的袋鼠是多产的,在所处地方生儿育女。最后袋鼠都聚拢到全局最高峰上。

遗传算法实现过程:

  • 首先寻找一种对问题潜在解进行“数字化”编码的方案。
  • 然后用随机数初始化一个种群(那么第一批袋鼠被随意分散在山上),种群里面的个体就是这些数字化的编码。
  • 接下来,通过适当的解码(得到袋鼠的位置坐标),用适应性函数对每个基因个体做一次适应度评估(袋鼠爬的越高,适应度越高)。
  • 用选择函数按照某种规定择优选择(每隔一段时间,射杀海拔较低的袋鼠,保持袋鼠总数平衡)。
  • 让个体基因变异(让袋鼠随机跳跳)。
  • 然后产生子代(希望存活下来的袋鼠多产,在那生儿育女)。

遗传算法并不保证获得问题最优解,它的最大优点在于不必操心如何“找”最优,只是“否定”不好的(把表现不好的,射杀)。

遗传算法一般步骤:

  1. 评估每条染色体所对应个体的适应度。
  2. 遵照适应度越高,选择概率越大原则,从中群中选择两个个体作为父方和母方。
  3. 抽取父母双方的染色体,进行交叉,产生子代。
  4. 对子代的染色体进行变异。
  5. 重复2,3,4步骤,直到新种群产生。

遗传算法过程的细节:

绘制袋鼠的染色体——基因编码方式

  • 采用二进制编码,如:010010011011011110111110
  • 采用浮点数编码,如:1.2 –3.3 – 2.0 –5.4 – 2.7 – 4.3
  • 采用符号编码。

  在遗传算法中关心的是袋鼠的位置(海拔低的被射杀),所以以袋鼠的位置作为特征进行编码,具体来说位置就是横坐标。 接着建立表现型到基因型的映射关系。就是如何用编码来变现出袋鼠所在的横坐标。由于横坐标是一个实数,说透了我们就是对这个实数编码。

  袋鼠的染色体就是横坐标上实数的二进制编码。

物竞天择——适应性评分与选择函数

1.物竞——适应度函数

袋鼠的海拔高度作为它的适应性评分。即适应度函数直接返回函数值就行了。

2.天择——选择函数

常用选择方法——轮盘赌

比如有5条染色体,他们所对应的适应度评分分别为:5,7,10,13,15。

所以累计总适应度为:

所以各个个体被选中的概率分别为:

注:还有精英选择机制

遗传变异——基因重组(交叉)与基因突变

这两种遗传操作,二进制编码与浮点型编码处理上很大差异。

1. 基因重组、交叉

(1)、二进制编码

类似高中生物中同源染色体的联会过程(随机把其中几个位于同一位置的编码进行交换,产生新的个体。)

(2)、浮点数编码

  

遗传算法(GA)的更多相关文章

  1. 用遗传算法GA改进CloudSim自带的资源调度策略(2)

    遗传算法GA的核心代码实现: 最核心: private static ArrayList<int[]> GA(ArrayList<int[]> pop,int gmax,dou ...

  2. 机器学习笔记之遗传算法(GA)

    遗传算法是一种大致基于模拟进化的学习方法,假设常被描述为二进制串.在遗传算法中,每一步都根据给定的适应度评估准则去评估当前的假设,然后用概率的方法选择适应度最高的假设作为产生下一代的种子.产生下一代的 ...

  3. 【比较】遗传算法GA和遗传编程GP有什么不同?

    遗传算法GA 本质上有一个固定的长度,这意味着所产生的功能有限的复杂性 通常会产生无效状态,因此需要以非破坏性方式处理这些状态 通常依赖于运算符优先级(例如,在我们的例子中,乘法发生在减法之前),这可 ...

  4. 【比较】粒子群算法PSO 和 遗传算法GA 的相同点和不同点

    目录 PSO和GA的相同点 PSO和GA不同点 粒子群算法(PSO)和遗传算法(GA)都是优化算法,都力图在自然特性的基础上模拟个体种群的适应性,它们都采用一定的变换规则通过搜索空间求解. PSO和G ...

  5. 遗传算法GA

    遗传算法(Genetic Algorithms,GA)是一种全局优化方法,它借用了生物遗传学的观点,通过自然选择.遗传.变异等作用机制,实现种群中个体适应性的提高,体现了自然界中“物竞天择.适者生存” ...

  6. 【优化算法】遗传算法GA求解混合流水车间调度问题(附C++代码)

    00 前言 各位读者大家好,好久没有介绍算法的推文了,感觉愧对了读者们热爱学习的心灵.于是,今天我们带来了一个神奇的优化算法--遗传算法! 它的优点包括但不限于: 遗传算法对所求解的优化问题没有太多的 ...

  7. 用遗传算法GA改进CloudSim自带的资源调度策略

    首先理解云计算里,资源调度的含义: 看了很多云计算资源调度和任务调度方面的论文,发现很多情况下这两者的意义是相同的,不知道这两者是同一件事的不同表述还是我没分清吧,任务调度或者资源调度大概就是讲这样一 ...

  8. 遗传算法的C语言实现(二)-----以求解TSP问题为例

    上一次我们使用遗传算法求解了一个较为复杂的多元非线性函数的极值问题,也基本了解了遗传算法的实现基本步骤.这一次,我再以经典的TSP问题为例,更加深入地说明遗传算法中选择.交叉.变异等核心步骤的实现.而 ...

  9. 遗传算法的C语言实现(一):以非线性函数求极值为例

    以前搞数学建模的时候,研究过(其实也不算是研究,只是大概了解)一些人工智能算法,比如前面已经说过的粒子群算法(PSO),还有著名的遗传算法(GA),模拟退火算法(SA),蚁群算法(ACA)等.当时懂得 ...

  10. 遗传算法入门C1

    遗传算法入门C1 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 遗传算法历史 遗传算法(GA)是从生物进化的角度考虑提出来的方法,19世纪达尔文在大量观察基础上总结了大自然进化规律 ...

随机推荐

  1. 干了这杯Java之transient关键字

    看源码的时候,发现transient这个关键字,不甚理解,查找资料发现:不被序列化 疑问: 静态变量是不是不被序列化? public class User implements Serializabl ...

  2. _sntprintf_s 和 _sntprintf 区别

    https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/snprintf-s-snprintf-s-l-snwprintf-s ...

  3. node+webpack+vue-cli

     安装nodejs + 安装webpack + 安装vue-cli+安装脚手架模板+安装依赖+运行 1 安装nodejs 去官网安装node.js( http://www.runoob.com/nod ...

  4. Linux下利用文件描述符恢复的成功失败实验

    1.测试环境准备[oracle@redhat3 ~]$ uname -aLinux redhat3 2.6.32-573.el6.x86_64 #1 SMP Wed Jul 1 18:23:37 ED ...

  5. docker 标记和推送镜像

    打开Launchpad并定位到docker Quickstart Terminal图标. 点击Docker Quickstart Terminal图标, 打开一个窗口. 将光标定位到Docker Qu ...

  6. Go 初体验 - 常量 与 iota

    常量的概念跟大多数语言一样,都是定义一个不可变的数值 go 语言支持常量,但没有 C# 中的枚举类型,所以常量在 go 语言里多用于枚举 上代码,有注释 输出: 在来看这个代码: 注释已说明结果 io ...

  7. C++——简单数据类型及布尔类型

    一. 简单数据类型 数据类型描述了对象在内存存储区中占据的空间大小,描述了对象能够表示的数据范围 和类型.C++语言中常用的数据类型有整型.实型.字符型(这3种类型也被称之为简单数 据类型).数组类型 ...

  8. Python学习笔记(Ⅱ)——循环/选择/函数

    一.循环结构 python中提供了for循环和while循环两种操作,没有do……while语句. 1.for循环: 与其他语言中for循环的常见的写法如for (int i=0;i<10;i+ ...

  9. Liunx系统升级自带的Python版本

    一.查看系统信息 [root@localhost ~]# cat /etc/redhat-release CentOS release 6.4 (Final) [root@localhost ~]# ...

  10. psql 存储过程

    --添加人员和虹膜注册信息 CREATE OR REPLACE FUNCTION AddPersonInfoAndIrisEnrollInfo(personName character, workSn ...