优化算法系列-遗传算法(1)——基本理论枯燥版本
1.历史背景(不感兴趣可以跳过)
遗传算法(Genetic Algorithm)是模拟生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。
遗传算法(Genetic Algorithm)是模拟生物在自然环境中的遗传和进化的过程而形成的自适应全局优化概率搜索算法。
1. 1858年,7月1日C.R.达尔文与A.R.华莱士在伦敦林奈学会上宣读了关于进化论的论文。后人称他们的自然选择学说为达尔文·华莱士学说。
2. 1859年,达尔文(Charles Robert Darwin)出版的《物种起源》一书中系统地阐述了他的进化学说
3. 1865年,孟德尔(Gregor Johann Mendel) 发现遗传定律。
4. 1967年,J.H.Holland的学生J.D.Bagley在博士论文中首次提出“遗传算法(Genetic Algorithms)”一词。
5. 1971年,R.B.Hollstien在他的博士论文中首次把遗传算法用于函数优化。
6. 1975年,J.H.Holland出版了他的著名专著《自然系统和人工系统的自适应》(Adaptation in Natural and Artificial Systems),这是第一本系统论述遗传算法的专著,标志着遗传算法的诞生。
7. 1985年,在美国召开了第一届遗传算法国际会议(International Conference on Genetic Algorithms ,ICGA),并且成立国际遗传算法学会(International Society of Genetic Algorithms ,ISGA),以后每两年举行一次。
8. 1989年,J.H.Holland的学生D.E.Goldberg出版了专著《搜索、优化和机器学习中的遗传算法》(Genetic Algorithms in Search , Optimization, and Machine Learning),总结出了一种统一的最基本的遗传算法-基本遗传算法(Simple Genetic Algorithms,简称SGA)。
9. 1990年,每隔一年举办一次Parallel Problem Solving from Nature 和Foundations of Genetic Algorithms学术会议,其中遗传算法是会议主要内容之一。
10.1991年,L.Davis编辑出版了《遗传算法手册》(Handbook of Genetic Algorithms),其中包括了遗传算法在工程技术和社会生活中的大量应用实例。
11.20世纪90年代以后,遗传算法作为一种高效、实用、鲁棒性强的优化技术,发展极为迅速,在机器学习、模式识别、神经网络、控制系统优化及社会科学等不同领域得到广泛应用。
12.21世纪,以不确定性、非线性、时间不可逆为内涵的复杂性科学成为一个研究热点。遗传算法因能有效地求解NP(Non-deterministic Polynomial)问题及非线性、多峰函数优化和多目标优化问题,得到了众多学者的重视。
2. 快速入门例子(不感兴趣可以跳过)
遗传算法的有趣应用很多:寻路问题,8数码问题,囚犯困境,动作控制,找圆心问题(在一个不规则的多边形 中,寻找一个包含在该多边形内的最大圆圈的圆心。),TSP问题,生产调度问题,人工生命模拟,袋鼠跳问题等。
2.1 提出问题及分析
提出问题:已知一元函数,现在要求在既定的区间内找出函数的最大值。
数学概念:
1. 极小值:一座座山谷
2. 极大值:一座座山峰
3. 最小值:所有山谷的最低谷
4. 最大子:所有山峰的最高峰
5. 局部最优解:函数的极值
6. 全局最优解:函数的最值
分析问题:既然我们把函数曲线理解成一个一个山峰和山谷组成的山脉。
那么我们可以设想所得到的每一个解就是一只袋鼠,我们希望它们不断的向着更高处跳去,直到跳到最高的山峰。
所以求最大值的过程就转化成一个“袋鼠跳”的过程。
【遗传算法要做的就是尽量爬到最高峰,而不是困在较低的小山峰上。(如果问题求解是最小值,那么要做的就是尽量走到最低谷,道理是一样的)】
2.2 问题解决
1. 爬山算法:一只袋鼠朝着比现在高的地方跳去。它找到了不远处的最高的山峰。但是这座山不一定是最高峰。这就是爬山算法,它不能保证局部最优值就是全局最优值。
2. 模拟退火:袋鼠喝醉了。它随机地跳了很长时间。这期间,它可能走向高处,也可能踏入平地。但是,它渐渐清醒了并朝最高峰跳去。这就是模拟退火算法。
3. 遗传算法:有很多袋鼠,它们降落到喜玛拉雅山脉的任意地方。这些袋鼠并不知道它们的任务是寻找珠穆朗玛峰。但每过几年,就在一些海拔高度较低的地方射杀一些袋鼠。于是,不断有袋鼠死于海拔较低的地方,而越是在海拔高的袋鼠越是能活得更久,也越有机会生儿育女。就这样经过许多年,这些袋鼠们竟然都不自觉地聚拢到了一个个的山峰上,可是在所有的袋鼠中,只有聚拢到珠穆朗玛峰的袋鼠被带回了美丽的澳洲。
达尔文的自然选择:物种想要生生不息,就得持续自我提升,适者才能生存。种群中最优秀的特质应该传递给后代,而其他个体也不能被遗忘,这样才能维持一定的多样性,自然环境发生变化时才更容易适应。
3. 遗传算法的基本概念(不感兴趣可以跳过)
简单而言,遗传算法使用群体搜索技术,将种群代表一组问题解,通过对当前种群事假选择、交叉和变异等一系列遗传操作来产生新一代的种群,并逐步使种群进化到包含近似最优解的状态。
3.1 遗传学与遗传算法术语对应关系
3.2 生物术语解释
- 遗传(Heredity):世间的生物从父代继承的性状或特征。
- 细胞(Cell):构成生物的基本结构和功能的单位
- 染色体(Chromosome):染色体又可以叫做基因型个体(individuals) 包含生物体所有遗传信息的化合物,表示可行解的编码。【在一个生物的任何一个细胞中,都有着相同的一套染色体。所谓染色体,就是指由 DNA 组成的聚合体。】
- 基因(Gene):时空之生物体某种性状(即遗传信息)的基本单位,表示可行解编码的分量。基因是串中的元素,基因用于表示个体的特征。例如有一个串S=1011,则其中的1,0,1,1这4个元素分别称为基因。它们的值称为等位基因(Alleles)。
- 基因位点(Locus):基因位点在算法中表示一个基因在串中的位置称为基因位置(Gene Position),有时也简称基因位。基因位置由串的左向右计算,例如在串 S=1101 中,0的基因位置是3。
- 等位基因(Alleles): 同一基因位点可能有的全部基因。
- 进化-群体(Population):生物的进化是以集团的形式共同进行的,群体是生物进化过程中的一个集团,表示可行解集。
- 进化-个体(Individual):个体是组成群体的单个生物体,表示可行解。
- 进化-适应度(Fitness): 各个个体对环境的适应程度叫做适应度(fitness)。为了体现染色体的适应能力,引入了对问题中的每一个染色体都能进行度量的函数,叫适应度函数。 这个函数是计算个体在群体中被使用的概率。
- 进化-选择(selection):以一定的概率从种群中选择若干个个体。一般,选择过程是一种基于适应度的优胜劣汰的过程。
- 遗传方式-复制(reproduction):细胞分裂时,遗传物质DNA通过复制而转移到新产生的细胞中,新细胞就继承了旧细胞的基因。
- 遗传方式-交叉(crossover):有性生殖,两个染色体的某一相同位置处DNA被切断,前后两串分别交叉组合形成两个新的染色体。也称基因重组或杂交;
- 遗传方式-变异(mutation):复制时可能(很小的概率)产生某些复制差错,变异产生新的染色体,表现出新的性状。
- 编码(coding):DNA中遗传信息在一个长链上按一定的模式排列。遗传编码可看作从表现型到基因型的映射。
- 解码(decoding):基因型到表现型的映射。
- 特征值: 在用串表示整数时,基因的特征值与二进制数的权一致; 例如在串 S=1011 中,基因位置3中的1,它的基因特征值为2;基因位置1中的1,它的基因特征值为8。
3.3 数学术语解释
求解最优解或者近似最优解的方法主要有三种: 枚举法; 启发式算法;搜索算法;
对于一个求函数最大值(最小值)的优化问题,一般可以描述为下述数学规划模型:
对于上述最优化问题,目标函数和约束条件种类繁多,有的是线性的,有的是非线性的;有的是连续的,有的是离散的;有的是单峰值的,有的是多峰值的。随着研究的深入,人们逐渐认识到在很多复杂情况下要想完全精确地求出最优解既不可能,也不现实,因而求出其近似最优解或满意解是人们的主要着眼点之一。遗传算法提供了一个有效地途径和通用框架。
3.4 模拟算法术语解释
X :一个染色体 (n个遗传基因组成) \ 一个个体
xi :一个遗传基因
等位基因:可以是一组整数;某一范围内的实数值;纯粹的一个记号;
P(t) : 第t代群体
X* :最优解
4. 遗传算法运算过程
1975年Michigan大学的J。Holland教授提出的遗传算法属于简单遗传算法(simple genetic algorithm,SGA),还处于遗传算法发展进程的初级阶段,但却具有里程碑式的意义。
SGA由编解码、个体适应度评价和遗传运算三大模块构成,而遗传算法又包括染色体复制、交叉、变异甚至倒位等。
在遗传算法中,定义种群或者群体为所有编码后的染色体集合,表征每个个体的是其相应的染色体。
4.1 编码与解码
- 编码重要性
- 编码方法决定了个体的染色体排列形式;
- 编码方法决定而来个体从搜索空间的基因型变换到解空间的表现型时的解码方法;
- 编码方法决影响了交叉算子、变异算子等遗传算子的运算方法;
- 编码方法决定了如何进行群体的遗传进化运算以及遗传进化运算的效率。
- 编码原则(De Jong)
- 编码原则一【有意义积木块编码原则】: 应使用能易于产生与所求问题相关的且具有低阶、短定义长度模式的编码方案。
- 编码原则二【最小字符集编码原则】: 应使用能使问题得到自然表示或描述的具有最小编码字符集的编码方案。
- 编码方法(遗传编码)
遗传编码将优化变量转化为基因的组合表示形式,优化变量的编码机制有二级制编码、十进制编码(实数编码)、符号编码三大类。
1、二进制编码: (1)定义:二进制编码方法是使用二值符号集{0,1},它所构成的个体基因型是一个二进制编码符号串。二进制编码符号串的长度与问题所要求的求解精度有关。
(2)编码:
![](https://img2018.cnblogs.com/blog/728328/201810/728328-20181031170307742-758699676.png)
(3)解码:
![](https://img2018.cnblogs.com/blog/728328/201810/728328-20181031170436585-757491851.png)
(4)举例
![](https://img2018.cnblogs.com/blog/728328/201810/728328-20181031170630819-85870.png)
(5)优点:符合最小字符集原则,便于用模式定理分析;
![](https://img2018.cnblogs.com/blog/728328/201810/728328-20181031171013885-1734296716.png)
(6)缺点:连续函数离散化时的映射误差。
![](https://img2018.cnblogs.com/blog/728328/201810/728328-20181031171415644-1175447948.png)
2、格雷码编码
(1)定义:格雷码编码是其连续的两个整数所对应的编码之间只有一个码位是不同的,其余码位完全相同。它是二进制编码方法的一种变形。
十进制数0—15之间的二进制码和相应的格雷码分别编码如下。
![](https://img2018.cnblogs.com/blog/728328/201810/728328-20181031171950923-1125856419.png)
(2)举例:对于区间[0。1023]中两个邻近的整数X1=175和X2=176,
若用长度为10位的二进制编码,可表示为 X11:0010101111 和 X12 0010110000,
而使用同样长度的格雷码,它们可表示为 X21:0010101111 和 X22:0010101000。
(3)优点:增强了遗传算法的局部搜索能力,便于连续函数的局部控件搜索。
![](https://img2018.cnblogs.com/blog/728328/201810/728328-20181031172306393-703652465.png)
3、浮点数(实数)编码 (1)定义:浮点数编码是指个体的每个基因值用某一范围内的一个浮点数来表示,而个体的编码长度等于其决策变量的个数。
因为这种编码方法使用的决策变量的真实值,也称之为真值编码方法。 (2)举例:
![](https://img2018.cnblogs.com/blog/728328/201810/728328-20181031172527151-1159180752.png)
(3)优点:实数编码是遗传算法中在解决连续参数优化问题时普遍使用的一种编码方式,具有较高的精度,在表示连续渐变问题方面具有优势。
![](https://img2018.cnblogs.com/blog/728328/201810/728328-20181031172916261-1317656826.png)
(4)注意点:
![](https://img2018.cnblogs.com/blog/728328/201810/728328-20181031173013047-219593200.png)
4、符号编码
(1)定义:
![](https://img2018.cnblogs.com/blog/728328/201810/728328-20181031173436346-24489092.png)
(2)举例:
![](https://img2018.cnblogs.com/blog/728328/201810/728328-20181031173337961-2056380469.png)
(3)优点:
![](https://img2018.cnblogs.com/blog/728328/201810/728328-20181031173535680-1447180266.png)
5、排列编码:排列编码也叫序列编码,是针对一些特殊问题的特定编码方式。排序编码使问题简洁,易于理解。该编码方式将有限集合内的元素进行排列。
若集合内包含m个元素,则存在m!种排列方法,当m不大时,m!也不会太大,穷举法就可以解决问题。当m比较大时,m!就会变得非常大,穷举法失效,遗传算法在解决这类问题上具有优势。
如解决TSP问题时,用排列编码自然、合理。
6、多参数级联编码等
4.2 个体适应度评价
生物学中用【适应度】来度量某个物种对于其生存环境的适应程度。
遗传算法中用【适应度】来度量群体中各个个体在优化计算中有可能达到或接近于最优解的优良程度。
度量个体适应度的函数称为适应度函数。
1. 适应度函数
基本遗传算法按与个体适应度成正比的概率来决定当前群体中每个个体遗传到下一代群体中的机会多少。为正确计算这个概率,大多数时候要求所有个体的适应度必须为正数或零。因此,面对不同的问题,必须事先确定好 目标函数值到个体适应度之间的转换规则,特别是确定好当目标函数为负值时候的处理方法。
2. 适应度尺度变换
(1)原因:仅仅使用上面连个式子来计算个体适应度时,有些遗传算法会收敛很快,有些会很慢。
(2)期望:
遗传算法运行初期阶段,算法能够对一些适应度较高的个体进行控制,降低其适应度与其他个体适应度之间的差异程度,从而限制其复制数量,以维护群体的多样性。(避免早熟现象,即得到某一局部最优解)
遗传算法运行后期阶段,算法能够对个体的适应度进行适当的放大,扩大最佳个体适应度与其他个体适应度之间的差异程度,以提高个体之间的竞争性。(重点区域重点搜索,提高算法运行效率)
(3)定义:
在遗传算法运行的不同阶段,有时需要对个体的适应度进行适当的扩大或缩小。这种变换就叫做适应度尺度变换。
(4)变换方法:主要有三种,线性尺度变换、乘幂尺度变换、指数尺度变换。
-
- 线性尺度变换
-
- 乘幂尺度变换
-
- 指数尺度变换
(5)约束条件处理方法:主要有三种,搜索空间限定法、罚函数法、可行解变换法。
-
- 搜索空间限定法
-
- 罚函数法
-
- 可行解变换法
4.3 选择算子
在生物的一窜和自然进化过程中,对生存环境适应程度较高的物种将有更多的机会遗传到下一代。
遗传算法中的选择操作用来确定如何从父代群体中按某种方法选取哪些个体遗传到下一代群体中的一种遗传算法。选择操作建立在对个体的适应度进行评价的基础上。
五种常见的选择算子操作方法:比例选择、分级选择|排序选择、竞技选择法、最优保存策略、确定式采样选择。
(1) 比例选择【Fitness proportional selection】
(2) 分级选择|排序选择【ranking selection】
(3) 竞技选择法【tournament selection】
(4) 最优保存策略【Elitist selection】
(5) 确定式采样选择【Deterministic Sampling selection】
4.4 交叉算子
内容:
生物的自然进化过程中,两个同源染色体通过交配而重组,形成新的染色体,从而产生出新的个体或物种。
遗传算法中的交叉运算,是对两个互相配对的染色体按某种方式互相交换部分基因,从而形成两个新的个体。
要求:
交叉算子一般要求它既不要太多地破坏个体编码串中表示优良性状的优良模式,
又要能够有效地产生出一些较好的新的个体模式。
(1)单点交叉【One-point Crossover】
(2)双点交叉与多点交叉【Two-point Crossover && Multi-point Crossover】
(3)均匀交叉【Uniform Crossover】
(4)算术交叉【Arithmetic Crossover】
4.5 变异算子
(1)基本位变异【Simple Mutation】
(2)均匀变异【Uniform Mutation】
(3)边界变异【Boundary Mutation】
(4)非均匀变异【Non_Uniform Mutation】
(5)高斯变异【Gaussian Mutation】
4.6 终止
参考网址
- 遗传算法GA2
- 遗传算法GA3
- http://www.cnblogs.com/maybe2030/p/4665837.html#undefined
- http://blog.chinaunix.net/uid-27105712-id-3886077.html
- http://www.cnblogs.com/bnuvincent/p/5265637.html
- 代码: https://github.com/apress/genetic-algorithms-in-java-basics
- NSGAII
- https://sourceforge.net/projects/jmetal/files/jmetal4.5/jmetal4.5.2.jar/download