‘壹’ 遗传算法
根据问题的目标函数构造一个适值函数,对一个由多个解(每个解对应一个染色体)构成的种群进行评估、遗传、选择,经多代繁殖,获得适应值最好的个体作为问题的最优解。
1,产生一个初始种群
2,根据问题的目标函数构造适值函数
3,根据适应值的好坏不断选择和繁殖
4,若干代后得到适应值最好的个体即为最优解
1.种群和种群大小
一般越大越好,但是规模越大运算时间越大,一般设为100~1000
2. 编码方法 (基因表达方法
3. 遗传算子
包括交叉和变异,模拟了每一代中创造后代的繁殖过程。是遗传算法的精髓
交叉:性能在很大程度上取决于交叉运算的性能,交叉率Pc:各代中交叉产生的后与代数与种群中的个体数的比。Pc越高,解空间就越大,越耗时/
变异:Pm:种群中变异基因数在总基因数中的百分比。它控制着新基因导入种群的比例。太低,一些有用的基因就难以进入选择;太高,后代就可能失去从双亲继承下来的良好特性,也就失去了从过去中搜索的能力。
4.选择策略
适者生存,优胜劣汰
5.停止准则
最大迭代数
初始种群的产生:随机产生,具体依赖于编码方法
编码方法 :二进制编码法、浮点编码法、符号编码法。顺序编码,实数编码,整数编码。
适值函数 :根据目标函数设计
遗传运算 : 交叉 :单切点交叉,双切点交叉,均匀交叉,算术交叉
变异 :基本位变异(Simple Mutation):对个体编码串中以变异概率、随机指定的某一位或某几位仅因座上的值做变异运算。
均匀变异(Uniform Mutation):分别用符合某一范围内均匀分布的随机数,以某一较小的概率来替换个体编码串中各个基因座上的原有基因值。(特别适用于在算法的初级运行阶段)
边界变异(Boundary Mutation):随机的取基因座上的两个对应边界基因值之一去替代原有基因值。特别适用于最优点位于或接近于可行解的边界时的一类问题。
非均匀变异:对原有的基因值做一随机扰动,以扰动后的结果作为变异后的新基因值。对每个基因座都以相同的概率进行变异运算之后,相当于整个解向量在解空间中作了一次轻微的变动。
高斯近似变异:进行变异操作时用符号均值为P的平均值,方差为P**2的正态分布的一个随机数来替换原有的基因值。
选择策略 :1.轮盘赌选择(Roulette Wheel Selection):是一种回放式随机采样方法。每个个体进入下一代的概率等于它的适应度值与整个种群中个体适应度值和的比例。选择误差较大。
2.随机竞争选择(Stochastic Tournament):每次按轮盘赌选择一对个体,然后让这两个个体进行竞争,适应度高的被选中,如此反复,直到选满为止。
3.最佳保留选择:首先按轮盘赌选择方法执行遗传算法的选择操作,然后将当前群体中适应度最高的个体结构完整地复制到下一代群体中。
4.无回放随机选择(也叫期望值选择Excepted Value Selection):根据每个个体在下一代群体中的生存期望来进行随机选择运算。方法如下:
(1) 计算群体中每个个体在下一代群体中的生存期望数目N。
(2) 若某一个体被选中参与交叉运算,则它在下一代中的生存期望数目减去0.5,若某一个体未 被选中参与交叉运算,则它在下一代中的生存期望数目减去1.0。
(3) 随着选择过程的进行,若某一个体的生存期望数目小于0时,则该个体就不再有机会被选中。
5.确定式选择:按照一种确定的方式来进行选择操作。具体操作过程如下:
(1) 计算群体中各个个体在下一代群体中的期望生存数目N。
(2) 用N的整数部分确定各个对应个体在下一代群体中的生存数目。
(3) 用N的小数部分对个体进行降序排列,顺序取前M个个体加入到下一代群体中。至此可完全确定出下一代群体中M个个体。
6.无回放余数随机选择:可确保适应度比平均适应度大的一些个体能够被遗传到下一代群体中,因而选择误差比较小。
7.均匀排序:对群体中的所有个体按期适应度大小进行排序,基于这个排序来分配各个个体被选中的概率。
8.最佳保存策略:当前群体中适应度最高的个体不参与交叉运算和变异运算,而是用它来代替掉本代群体中经过交叉、变异等操作后所产生的适应度最低的个体。
9.随机联赛选择:每次选取几个个体中适应度最高的一个个体遗传到下一代群体中。
10.排挤选择:新生成的子代将代替或排挤相似的旧父代个体,提高群体的多样性。
之前在网上看到的一个比方,觉得很有趣:
{
既然我们把函数曲线理解成一个一个山峰和山谷组成的山脉。那么我们可以设想所得到的每一个解就是一只袋鼠,我们希望它们不断的向着更高处跳去,直到跳到最高的山峰。所以求最大值的过程就转化成一个“袋鼠跳”的过程。
下面介绍介绍“袋鼠跳”的几种方式。
爬山算法:一只袋鼠朝着比现在高的地方跳去。它找到了不远处的最高的山峰。但是这座山不一定是最高峰。这就是爬山算法,它不能保证局部最优值就是全局最优值。
模拟退火:袋鼠喝醉了。它随机地跳了很长时间。这期间,它可能走向高处,也可能踏入平地。但是,它渐渐清醒了并朝最高峰跳去。这就是模拟退火算法。
遗传算法:有很多袋鼠,它们降落到喜玛拉雅山脉的任意地方。这些袋鼠并不知道它们的任务是寻找珠穆朗玛峰。但每过几年,就在一些海拔高度较低的地方射杀一些袋鼠。于是,不断有袋鼠死于海拔较低的地方,而越是在海拔高的袋鼠越是能活得更久,也越有机会生儿育女。就这样经过许多年,这些袋鼠们竟然都不自觉地聚拢到了一个个的山峰上,可是在所有的袋鼠中,只有聚拢到珠穆朗玛峰的袋鼠被带回了美丽的澳洲。
}
(把那些总是爱走下坡路的袋鼠射杀,这就是遗传算法的精粹!)
遗传算法并不保证你能获得问题的最优解,但是使用遗传算法的最大优点在于你不必去了解和操心如何去“找”最优解。(你不必去指导袋鼠向那边跳,跳多远。)而只要简单的“否定”一些表现不好的个体就行了。(把那些总是爱走下坡路的袋鼠射杀,这就是遗传算法的精粹!)
改进与变形
编码方法:
‘贰’ 遗传算法的主要步骤
为了使用遗传算法来解决优化问题,准备工作分为以下四步[56,57,61]。
7.4.1 确定问题的潜在解的遗传表示方案
在基本的遗传算法中,表示方案是把问题的搜索空间中每个可能的点表示为确定长度的特征串(通常是二进制串)。表示方案的确定需要选择串长l和字母表规模k。在染色体串和问题的搜索空间中的点之间选择映射有时容易实现,有时又非常困难。选择一个便于遗传算法求解问题的表示方案经常需要对问题有深入的了解。
7.4.2 确定适应值的度量
适应值度量为群体中每个可能的确定长度的特征串指定一个适应值,它经常是问题本身所具有的。适应值度量必须有能力计算搜索空间中每个确定长度的特征串的适应值。
7.4.3 确定控制该算法的参数和变量
控制遗传算法的主要参数有群体规模Pop-Size、算法执行的最大代数N-Gen、交叉概率Pc、变异概率Pm和选择策略R等参数。
(1)群体规模Pop-Size。群体规模影响到遗传算法的最终性能和效率。当规模太小时,由于群体对大部分超平面只给出了不充分的样本量,所以得到的结果一般不佳。大的群体更有希望包含出自大量超平面的代表,从而可以阻止过早收敛到局部最优解;然而群体越大,每一代需要的计算量也就越多,这有可能导致一个无法接受的慢收敛率。
(2)交叉率Pc。交叉率控制交叉算子应用的频率,在每代新的群体中,有Pc·Pop-Size个串实行交叉。交叉率越高,群体中串的更新就越快。如果交叉率过高,相对选择能够产生的改进而言,高性能的串被破坏得更快。如果交叉率过低,搜索会由于太小的探查率而可能停滞不前。
(3)变异率Pm。变异是增加群体多样性的搜索算子,每次选择之后,新的群体中的每个串的每一位以相等的变异率进行随机改变。对于M进制串,就是相应的位从1变为0或0变为1。从而每代大约发生Pm·Pop-Size·L次变异,其中L为串长。一个低水平的变异率足以防止整个群体中任一给定位保持永远收敛到单一的值。高水平的变异率产生的实质是随机搜索。
比起选择和交叉,变异在遗传算法中是次要的,它在恢复群体中失去的多样性方面具有潜在的作用。例如,在遗传算法执行的开始阶段,串中一个特定位上的值1可能与好的性能紧密联系,也就是说从搜索空间中某些初始随机点开始,在那个位上的值1可能一致地产生适应性度量好的值。因为越好的适应值与串中那个位上的值1相联系,复制作用就越会使群体的遗传多样性损失。当达到一定程度时,值0会从整个群体中的那个位上消失,然而全局最优解可能在串中那个位上是0。一旦搜索范围缩小到实际包含全局最优解的那部分搜索空间,在那个位上的值0就可能正好是达到全局最优解所需的。这仅仅是一种说明搜索空间是非线性的方式,这种情形不是假定的,因为实际上所有我们感兴趣的问题都是非线性的。变异作用提供了一个恢复遗传多样性的损失的方法。
(4)选择策略R。有两种选择策略。一是利用纯选择,即当前群体中每个点复制的次数比与点的性能值成比例。二是利用最优选择,即首先执行纯选择,且具有最好性能的点总是保留到下一代。在缺少最优选择的情况下,由于采样误差、交叉和变异,最好性能的点可能会丢失。
通过指定各个参数Pop-Size、Pc、Pm和R的值,可以表示一个特定的遗传算法。
7.4.4 确定指定结果的方法和停止运行的准则
当遗传的代数达到最大允许代数时,就可以停止算法的执行,并指定执行中得到的最好结果作为算法的结果。
基本的遗传算法
1)随机产生一个由固定长度字符串组成的初始群体。
2)对于字符串群体,迭代地执行下述步骤,直到选择标准被满足为止。
①计算群体中的每个个体字符串的适应值;
②实施下列三种操作(至少前两种)来产生新的群体,操作对象的选取基于与适应度成比例的概率。
选择:把现有的个体串按适应值复制到新的群体中。
交叉:通过遗传重组随机选择两个现有的子串进行遗传重组,产生两个新的串。
变异:将现有串中某一位的字符随机变异产生一个新串。
3)把在后代中出现的最好适应值的个体串指定为遗传算法运行的结果。这一结果可以是问题的解(或近似解)。
基本的遗传算法流程图如图7-1所示。
‘叁’ 遗传算法精英保留策略
我个人认为。直接复制本代的最优解到下一代的这种方法虽然会有益于形成较优解,但是违背了遗传规律。个人见解,哈哈。
‘肆’ 优化算法笔记(六)遗传算法
遗传算法(Genetic Algorithms,GA)是一种模拟自然中生物的遗传、进化以适应环境的智能算法。由于其算法流程简单,参数较少优化速度较快,效果较好,在图像处理、函数优化、信号处理、模式识别等领域有着广泛的应用。
在遗传算法(GA)中,每一个待求问题的候选解被抽象成为种群中一个个体的基因。种群中个体基因的好坏由表示个体基因的候选解在待求问题中的所的得值来评判。种群中的个体通过与其他个体交叉产生下一代,每一代中个体均只进行一次交叉。两个进行交叉的个体有一定几率交换一个或者多个对应位的基因来产生新的后代。每个后代都有一定的概率发生变异。发生变异的个体的某一位或某几位基因会变异成其他值。最终将以个体的适应度值为概率选取个体保留至下一代。
遗传算法启发于生物的繁殖与dna的重组,本次的主角选什么呢?还是根据大家熟悉的孟德尔遗传规律选豌豆吧,选动物的话又会有人疑车,还是植物比较好,本次的主角就是它了。
遗传算法包含三个操作(算子):交叉,变异和选择操作。下面我们将详细介绍这三个操作。
大多数生物的遗传信息都储存在DNA,一种双螺旋结构的复杂有机化合物。其含氮碱基为腺嘌呤、鸟嘌呤、胞嘧啶及胸腺嘧啶。
表格中表示了一个有10个基因的个体,它们每一个基因的值为0或者1。
生物的有性生殖一般伴随着基因的重组。遗传算法中父辈和母辈个体产生子代个体的过程称为交叉。
表中给出了两个豌豆的基因,它们均有10个等位基因(即编号相同的基因)。
遗传算法的交叉过程会在两个个体中随机选择1位或者n位基因进行交叉,即这两个个体交换等位基因。
如,A豌豆和B豌豆在第6位基因上进行交叉,则其结果如下
当两个个体交叉的等位基因相同时,交叉过程也有可能没有产生新的个体,如交叉A豌豆和B豌豆的第2位基因时,交叉操作并没有产生新的基因。
一般的会给群体设定一个交叉率,crossRate,表示会在群体中选取一定比例的个体进行交叉,交叉率相对较大,一般取值为0.8。
基因的变异是生物进化的一个主要因素。
遗传算法中变异操作相对简单,只需要将一个随机位基因的值修改就行了,因为其值只为0或1,那么当基因为0时,变异操作会将其值设为1,当基因值为1时,变异操作会将其值设为0。
上图表示了A豌豆第3位基因变异后的基因编码。
与交叉率相似,变异操作也有变异率,alterRate,但是变异率会远低于交叉率,否则会产生大量的随机基因。一般变异率为0.05。
选择操作是遗传算法中的一个关键操作,它的主要作用就是根据一定的策略随机选择个体保留至下一代。适应度越优的个体被保留至下一代的概率越大。
实现上,我们经常使用“轮盘赌”来随机选择保留下哪个个体。
假设有4个豌豆A、B、C、D,它们的适应度值如下:
适应度值越大越好,则它们组成的轮盘如下图:
但由于轮盘赌选择是一个随机选择过程,A、B、C、D进行轮盘赌选择后产生的下一代也有可能出现A、A、A、A的情况,即虽然有些个体的适应度值不好,但是运气不错,也被选择留到了下一代。
遗产算法的三个主要操作介绍完了,下面我们来看看遗传算法的总体流程:
前面我们说了遗传算法的流程及各个操作,那么对于实际的问题我们应该如何将其编码为基因呢?
对于计算机来所所有的数据都使用二进制数据进行存放,如float类型和double类型的数据。
float类型的数据将保存为32位的二进制数据:1bit(符号位) 8bits(指数位) 23bits(尾数位)
如-1.234567f,表示为二进制位
Double类型的数据将保存为64位的二进制数据:1bit(符号位) 11bits(指数位) 53bits(尾数位)
如-1.234567d,表示为二进制为
可以看出同样的数值不同的精度在计算机中存储的内容也不相同。之前的适应度函数 ,由于有两个double类型的参数,故其进行遗传算法基因编码时,将有128位基因。
虽然基因数较多,但好在每个基因都是0或者1,交叉及变异操作非常简单。
相比二进制编码,十进制编码的基因长度更短,适应度函数 有两个输入参数,那么一个个体就有2个基因,但其交叉、变异操作相对复杂。
交叉操作
方案1:将一个基因作为一个整体,交换两个个体的等位基因。
交换前
交换第1位基因后
方案2:将两个个体的等位基因作为一个整体,使其和不变,但是值随机
交换前
交换第1位基因后
假设A、B豌豆的第一位基因的和为40,即 ,第一位基因的取值范围为0-30,那么A、B豌豆的第一位基因的取值范围为[10,30],即 为[0,30]的随机数, 。
变异操作,将随机的一位基因设置为该基因取值范围内的随机数即可。
这个过程说起来简单但其实现并不容易。
我们要将它们的值映射到一个轴上才能进行随机选择,毕竟我们无法去绘制一个轮盘来模拟这个过程
如图,将ABCD根据其值按顺序排列,取[0,10]内的随机数r,若r在[0,1]内则选择A,在(1,3]内则选择B,在(3,6]内则选择C,在(6,10]则选择D。
当然这仍然会有问题,即当D>>A、B、C时,假如它们的值分布如下
那么显然,选D的概率明显大于其他,根据轮盘赌的选择,下一代极有可能全是D的后代有没有办法均衡一下呢?
首先我想到了一个函数,
不要问我为什么我不知道什么是神经什么网络的,什么softmax、cnn统统没听说过。
这样一来,它们之间的差距没有之前那么大了,只要个体适应度值在均值以上那么它被保留至下一代的概率会相对较大,当然这样缩小了个体之间的差距,对真正优秀的个体来说不太公平,相对应,我们可以在每次选择过程中保留当前的最优个体到下一代,不用参与轮盘赌这个残酷的淘汰过程。
最令人高兴的环节到了,又可以愉快的凑字数了。
由于遗传算法的收敛速度实在是太慢,区区50代,几乎得不到好的结果,so我们把它的最大迭代次数放宽到200代。
使用二进制编码来进行求解
参数如下:
求解过程如上图,可以看出基因收敛的很快,在接近20代时就图中就只剩一个点了,之后的点大概是根据变异操作产生。看一下最后的结果。
可以看出最好的结果已经得到了最优解,但是10次实验的最差值和平均值都差的令人发指。为什么会这样呢?
问题出在二进制编码上,由于double类型的编码有11位指数位和52位小数位,这会导致交叉、变异操作选到指数位和小数位的概率不均衡,在小数位上的修改对结果的影响太小而对指数为的修改对结果的影响太大,
如-1.234567d,表示为二进制为
对指数为第5位进行变异操作后的结果为-2.8744502924382686E-10,而对小数位第5为进行变异操作后的结果为-1.218942。可以看出这两部分对数值结果的影响太不均衡,得出较好的结果时大概率是指数位与解非常相近,否则很难得出好的结果,就像上面的最差值和均值一样。
所以使用上面的二进制编码不是一个好的基因编码方式,因此在下面的实验中,将使用十进制来进行试验。
使用:十进制编码来进行求解
参数如下:
我们可以看到直到40代时,所有的个体才收束到一点,但随后仍不断的新的个体出现。我们发现再后面的新粒子总是在同一水平线或者竖直线上,因为交叉操作直接交换了两个个体的基因,那么他们会相互交换x坐标或者y坐标,导致新个体看起来像在一条直线上。
我们来看看这次的结果。
这次最优值没有得到最优解,但是最差值没有二进制那么差,虽然也不容乐观。使用交换基因的方式来进行交叉操作的搜索能力不足,加之轮盘赌的选择会有很大概率选择最优个体,个体总出现在矩形的边上。
下面我们先改变轮盘赌的选择策略,使用上面的sigmod函数方案,并且保留最优个体至下一代。
使用:十进制编码来进行求解
参数如下:
看图好像跟之前的没什么区别,让我们们看看最终的结果:
可以看出,最优值没有什么变化,但是最差值和平均值有了较大的提升,说明该轮盘赌方案使算法的鲁棒性有了较大的提升。在每次保留最优个体的情况下,对于其他的个体的选择概率相对平均,sigmod函数使得即使适应度函数值相差不太大的个体被选到的概率相近,增加了基因的多样性。
使用:十进制编码来进行求解,改变交叉方案,保持两个个体等位基因和不变的情况下随机赋值。
参数如下:
上图可以看出该方案与之前有明显的不同,在整个过程中,个体始终遍布整个搜索空间,虽然新产生的个体大多还是集中在一个十字架型的位置上,但其他位置的个体比之前的方案要多。
看看结果,
这次的结果明显好于之前的所有方案,但仍可以看出,十进制的遗传算法的精度不高,只能找到最优解的附近,也有可能是算法的收敛速度实在太慢,还没有收敛到最优解。
遗传算法的探究到此也告一段落,在研究遗传算法时总有一种力不从心的感觉,问题可能在于遗传算法只提出了一个大致的核心思想,其他的实现细节都需要自己去思考,而每个人的思维都不一样,一万个人能写出一万种遗传算法,其实不仅是遗传算法,后面的很多算法都是如此。
为什么没有对遗传算法的参数进行调优,因为遗传算法的参数过于简单,对结果的影响的可解释性较强,意义明显,实验的意义不大。
遗传算法由于是模仿了生物的进化过程,因此我感觉它的求解速度非常的慢,而且进化出来的结果不一定是最适应环境的,就像人的阑尾、视网膜结构等,虽然不是最佳的选择但是也被保留到了今天。生物的进化的随机性较大,要不是恐龙的灭绝,也不会有人类的统治,要不是人类有两只手,每只手有5根手指,也不会产生10进制。
以下指标纯属个人yy,仅供参考
目录
上一篇 优化算法笔记(五)粒子群算法(3)
下一篇 优化算法笔记(七)差分进化算法
优化算法matlab实现(六)遗传算法matlab实现
‘伍’ 遗传算法原理简介
遗传算法(Genetic Algorithm, GA)是一种进化计算(Evolutionary Computing)算法,属于人工智能技术的一部分。遗传算法最早是由John Holland和他的学生发明并改进的,源于对达芬奇物种进化理论的模仿。在物种进化过程中,为了适应环境,好的基因得到保留,不好的基因被淘汰,这样经过很多代基因的变化,物种的基因就是当前自然环境下适应度最好的基因。该算法被广泛应用于优化和搜索中,用于寻求最优解(或最优解的近似),其最主要的步骤包括交叉(crossover)和突变(mutation)。
所有的生物体都由细胞组成,每个细胞中都包含了同样的染色体(chromosome)。染色体由一串DNA组成,我们可以简单地把一个生物个体表示为一条染色体。每条染色体上都包含着基因,而基因又是由多个DNA组成的。每个基因都控制着个体某个性状的表达,例如眼睛的颜色、眼皮的单双等。在物种繁衍的过程中,首先发生交叉,来自于父母的染色体经过分裂和重组,形成后代的染色体。之后,后代有一定概率发生基因突变,即染色体上某个位置处的基因以一定概率发生变化。之后,对每一代都重复进行交叉和突变两个步骤。对于每一个后代,我们可以通过一定的方式测量其适应度。适应度越好的个体,在下一次交叉中被选中的概率越大,它的基因越容易传给下一代。这样,后代的适应度就会越来越好,直到收敛到一个稳定值。
在优化问题中,可行解总是有很多个,我们希望寻找一个最优解,它相对于其他可行解来说具有更好的适应度(即目标函数值更大或更小)。每个可行解就是一个“生物个体”,可以表示为状态空间中的一个点和适应度。每个解都是一个经过编码的序列,已二进制编码为例,每个解都是一个二进制序列。这样每个染色体就是一个二进制序列。遗传算法从从一组可行解开始,称为population,从population中随机选择染色体进行交叉产生下一代。这一做法的基于下一代的适应度会好于上一代。遗传算法的过程如下:
终止条件可以是达到了最大迭代次数,或者是前后连续几代的最优染色体的适应度差值小于一个阈值。以上算法描述也许还不够直观,我们举例说明。假设解可以用二进制编码表示,则每个染色体都是一个二进制序列。假设序列长度为16,则每个染色体都是一个16位的二进制序列:
首先,我们随机生成一个population,假设population size为20,则有20个长度为16的二进制序列。计算每个染色体的适应度,然后选取两个染色体进行交叉,如下图所示。下图在第6为上将染色体断开再重组,断开的位置是可以随机选择的。当然,断裂位置也可以不止一个。可以根据具体问题选择具体的交叉方式来提升算法性能。
之后,随机选取后代染色体上某个基因发生基因突变,突变的位置是随机选取的。并且,基因突变并不是在每个后代上都会发生,只是有一定的概率。对于二进制编码,基因突变的方式是按位取反:
上述例子是关于二进制编码的,像求解一元函数在某个区间内的最大最小值就可以使用二进制编码。例如,求解函数f(x)=x+sin(3x)+cos(3x)在区间[0,6]内的最小值。假设我们需要最小值点x保留4位小数,那么求解区间被离散成60000个数。因为2 {15}<60000<2 {16},所以,需要16位二进制数来表示这60000个可能的解。其中0x0000表示0,0x0001表示0.0001,以此类推。针对这个例子,文末给出了demo code.
然而,在排序问题中无法使用二进制编码,应该采用排列编码(permutation encoding)。例如有下面两个染色体:
交叉:随机选取一个交叉点,从该出将两个染色体断开。染色体A的前部分组成后代1的前部分,然后扫描染色体B,如果出现了后代1中不包含的基因,则将其顺序加入后代1中。同理,染色体B的前部分组成了后代2的前部分,扫描染色体A获得后代2的后部分。注意,交叉的方式多种多样,此处只是举出其中一种方式。
( 1 5 3 2 6 | 4 7 9 8) + ( 8 5 6 7 2 | 3 1 4 9) => ( 1 5 3 2 6 8 7 4 9) + ( 8 5 6 7 2 1 3 4 9)
突变:对于一个染色体,随机选中两个基因互换位置。例如第3个基因和倒数第2个基因互换:
(1 5 3 2 6 8 7 4 9) => (1 5 4 2 6 8 7 3 9)
此外还有值编码(value encoding)和树编码(tree encoding)等,具体例子可以参考这个链接: http://obitko.com/tutorials/genetic-algorithms/encoding.php
在实际的遗传算法中,往往会保留上一代中的少数几个精英(elite),即将上一代population中适应度最好的几个染色体加入到后代的poulation中,同时去除后代population中适应度最差的几个染色体。通过这个策略,如果在某次迭代中产生了最优解,则最优解能够一直保留到迭代结束。
用GA求函数最小值的demo code: https://github.com/JiaxYau/GA_test
参考资料 :
[1] Introction to Genetic Algorithm, http://obitko.com/tutorials/genetic-algorithms/index.php
[2] Holland J H. Adaption in natural and artificial systems
‘陆’ 遗传算法的基本原理
遗传算法的基本原理和方法
一、编码
编码:把一个问题的可行解从其解空间转换到遗传算法的搜索空间的转换方法。
解码(译码):遗传算法解空间向问题空间的转换。
二进制编码的缺点是汉明悬崖(Hamming Cliff),就是在某些相邻整数的二进制代码之间有很大的汉明距离,使得遗传算法的交叉和突变都难以跨越。
格雷码(Gray Code):在相邻整数之间汉明距离都为1。
(较好)有意义的积木块编码规则:所定编码应当易于生成与所求问题相关的短距和低阶的积木块;最小字符集编码规则,所定编码应采用最小字符集以使问题得到自然的表示或描述。
二进制编码比十进制编码搜索能力强,但不能保持群体稳定性。
动态参数编码(Dynamic Paremeter Coding):为了得到很高的精度,让遗传算法从很粗糙的精度开始收敛,当遗传算法找到一个区域后,就将搜索现在在这个区域,重新编码,重新启动,重复这一过程,直到达到要求的精度为止。
编码方法:
1、 二进制编码方法
缺点:存在着连续函数离散化时的映射误差。不能直接反映出所求问题的本身结构特征,不便于开发针对问题的专门知识的遗传运算算子,很难满足积木块编码原则
2、 格雷码编码滚如:连续的两个整数所对应的编码之间仅仅只有一个码位是不同的,其余码位都相同。
3、 浮点数编码方法:个体的每个基因值用某一范围内的某个浮点数来表示,个体的编码长度等于其决策变量的位数。
4、 各参数级联编码:对含有多个变量的个体进行编码的方法。通常将各个参数分别以某种编码方法进行编码,然后再将他们的编码按照一定顺序连接在一起就组成了表示全部参数的个体编码。
5、 多参数交叉编码:将各个参数中起主要作用的码位集中在一起,这样它们就不易于被遗传算子破坏掉。
评估编码的三个规范:完备性、健全性、非冗余性。
二、选择
遗传算法中的选择操作就是用来确定如何从父代群体中按某种方法选取那些个体遗传到下一代群体中的一种遗传运算,用来确定重组或交叉个体,以及被选个体将产生多少个子代个体。
常用的选择算子:
1、 轮盘赌选择(Roulette Wheel Selection):是一种回放式随机采样方法。每个个体进入下一代的概率等于它的适应度值与整个种群中个体适应度值和的比例。选择误差较大。
2、 随机竞争选择(Stochastic Tournament):每次按轮盘赌选择一对个体,然后让这两个个体进行竞争,适应度高的被选中,如此反复,直到选满为止。
3、 最佳保留选择:首先按轮盘赌选择方法执行遗传算法的选择操作,然后将当前群体中适应度最高的大宏启个体结构完整地复制到下一代群体中。
4、 无回放随机选择(也叫期望值选择Excepted Value Selection):根据每个个体在下一代群体中的生存期望来进行随机选择运算。方法如下
(1) 计算群体中每个个体在下一代群体中的生存期望数目N。
(2) 若某一个体被选中参与交叉运算,则它在下一代中的生存期望数目减去0.5,若某一个体未被选中参与交叉运算,则它绝配在下一代中的生存期望数目减去1.0。
(3) 随着选择过程的进行,若某一个体的生存期望数目小于0时,则该个体就不再有机会被选中。
5、 确定式选择:按照一种确定的方式来进行选择操作。具体操作过程如下:
(1) 计算群体中各个个体在下一代群体中的期望生存数目N。
(2) 用N的整数部分确定各个对应个体在下一代群体中的生存数目。
(3) 用N的小数部分对个体进行降序排列,顺序取前M个个体加入到下一代群体中。至此可完全确定出下一代群体中M个个体。
6、无回放余数随机选择:可确保适应度比平均适应度大的一些个体能够被遗传到下一代群体中,因而选择误差比较小。
7、均匀排序:对群体中的所有个体按期适应度大小进行排序,基于这个排序来分配各个个体被选中的概率。
8、最佳保存策略:当前群体中适应度最高的个体不参与交叉运算和变异运算,而是用它来代替掉本代群体中经过交叉、变异等操作后所产生的适应度最低的个体。
9、随机联赛选择:每次选取几个个体中适应度最高的一个个体遗传到下一代群体中。
10、排挤选择:新生成的子代将代替或排挤相似的旧父代个体,提高群体的多样性。
三、交叉
遗传算法的交叉操作,是指对两个相互配对的染色体按某种方式相互交换其部分基因,从而形成两个新的个体。
适用于二进制编码个体或浮点数编码个体的交叉算子:
1、单点交叉(One-pointCrossover):指在个体编码串中只随机设置一个交叉点,然后再该点相互交换两个配对个体的部分染色体。
2、两点交叉与多点交叉:
(1) 两点交叉(Two-pointCrossover):在个体编码串中随机设置了两个交叉点,然后再进行部分基因交换。
(2) 多点交叉(Multi-pointCrossover)
3、均匀交叉(也称一致交叉,UniformCrossover):两个配对个体的每个基因座上的基因都以相同的交叉概率进行交换,从而形成两个新个体。
4、算术交叉(ArithmeticCrossover):由两个个体的线性组合而产生出两个新的个体。该操作对象一般是由浮点数编码表示的个体。
四、变异
遗传算法中的变异运算,是指将个体染色体编码串中的某些基因座上的基因值用该基因座上的其它等位基因来替换,从而形成以给新的个体。
以下变异算子适用于二进制编码和浮点数编码的个体:
1、基本位变异(SimpleMutation):对个体编码串中以变异概率、随机指定的某一位或某几位仅因座上的值做变异运算。
2、均匀变异(UniformMutation):分别用符合某一范围内均匀分布的随机数,以某一较小的概率来替换个体编码串中各个基因座上的原有基因值。(特别适用于在算法的初级运行阶段)
3、边界变异(BoundaryMutation):随机的取基因座上的两个对应边界基因值之一去替代原有基因值。特别适用于最优点位于或接近于可行解的边界时的一类问题。
4、非均匀变异:对原有的基因值做一随机扰动,以扰动后的结果作为变异后的新基因值。对每个基因座都以相同的概率进行变异运算之后,相当于整个解向量在解空间中作了一次轻微的变动。
5、高斯近似变异:进行变异操作时用符号均值为P的平均值,方差为P2的正态分布的一个随机数来替换原有的基因值。
‘柒’ 遗传算法中的排序选择策略选择最优的复制到下一代是不是已经包含了精英保留策略的作用
这得看你的排序选择策略是怎样的。
一种排序是只对当代种群进行排序,这种排序选择方式并不包含精英保留策略的作用。
另一种排序是把上一次种群放一直排序,这种方式包含了精英保留策略的作用。
例如有初始种群包含个体为A1,A2,A3,A4,经过适应度计算后得知最优个体为顺序为A2,A1,A3,A4,经过排序选择后为A2,A2,A1,A3,然后经过交叉和变异后的变为B1,B2,B3,B4,而B1,B2,B3,B4的适应度均没有A2大,那么如果采用第一种排序方式,只对B1-B4排序选择,那么将丢失A2这一优良个体,所以并不包含精英保留作用。如果将B1-B4与A1-A2一起排序,那么由于A2适应度最大,因此必然会选到A2,等效于精英保留策略。
‘捌’ 遗传算法的基本原理
遗传算法本质上是对染色体模式所进行的一系列运算,即通过选择算子将当前种群中的优良模式遗传到下一代种群中,利用交叉算子进行模式重组,利用变异算子进行模式突变。