欢迎来真孝善网,为您提供真孝善正能量书籍故事!

算法优化技巧(六):深入探讨遗传算法

时间:11-01 现代故事 提交错误

遗传算法包含三种操作(算子):交叉、变异和选择操作。下面我们将详细介绍这三个操作。

大多数生物的遗传信息都储存在DNA中,DNA是一种具有双螺旋结构的复杂有机化合物。其含氮碱基为腺嘌呤、鸟嘌呤、胞嘧啶和胸腺嘧啶。

遗传算法的个体结构受到DNA分子结构的启发,以计算机二进制为基础。其编码内容如下:No.12345678910 Gene 0110110100。该表代表一个个体有10个基因,其每个基因的值为0或1。

2.1交叉

生物体的有性繁殖一般伴随着基因重组。在遗传算法中,从父母个体和母亲个体生成后代个体的过程称为交叉。

编号12345678910A 豌豆基因0110110100B 豌豆基因1100101000 该表给出了两个豌豆基因,两者都有10 个等位基因(即具有相同编号的基因)。

遗传算法的交叉过程会在两个个体中随机选择1个或n个基因进行交叉,即两个个体交换等位基因。

例如,如果A豌豆和B豌豆在第6个基因上杂交,结果将如下:

编号12345678910A 豌豆基因0110100100B 豌豆基因1100111000 当两个个体的等位基因相同时,交叉过程可能不会产生新的个体。例如,当豌豆A和豌豆B的第二个基因杂交时,交叉操作不会产生新的个体。基因。

No. 12345678910A 豌豆基因0110110100B 豌豆基因1100101000 一般情况下,群体会设定一个交叉率crossRate,即群体中会选择一定比例的个体进行交叉。交叉率较大,一般值为0.8。

2.2变异

基因变异是生物进化的一个主要因素。

遗传算法中的变异操作比较简单。你只需要修改一个随机位基因的值,因为它的值只有0或1。那么当该基因为0时,变异操作会将其值设置为1。当该基因值为1时,变异操作会将其值设置为1。将其值设置为0。

编号12345678910A豌豆基因0110110100A突变基因0100110100上图为A豌豆基因突变第3位的遗传密码。

与交叉率类似,变异操作也有变异率alterRate,但变异率会远低于交叉率,否则会产生大量随机基因。一般突变率为0.05。

2.3选择

选择操作是遗传算法中的关键操作。其主要功能是按照一定的策略随机选择个体保留到下一代。适应度较好的个体被保留到下一代的概率较高。

在实现中,我们经常使用“轮盘赌”来随机选择保留哪个个体。

假设有4颗豌豆A、B、C、D,它们的适应度值如下:

个体适应值A1B2C3D4 适应值越大越好。由它们组成的轮盘如下:

但由于轮盘选择是一个随机选择过程,因此A、B、C、D进行轮盘选择后产生的下一代也可能出现A、A、A、A的情况。即,虽然有些人不好,但我很幸运,我被选中为下一代保留它。

介绍完了遗传算法的三个主要操作,我们来看看遗传算法的整体流程:

3.基因编码及操作细节

前面我们讲了遗传算法的流程和各种操作,那么实际问题中我们应该如何将其编码成基因呢?

3.1二进制编码

计算机中的所有数据都是使用二进制数据存储的,例如float类型和double类型数据。

浮点型数据将保存为32 位二进制数据: 1bit(符号位) 8bits(指数位) 23bits(尾数位)

例如-1.234567f,表示为二进制位10111111100111100000011001001011

类型符号位1 指数位8 位小数23 位10111111100111100000011001001011双精度型数据将保存为64 位二进制数据: 1bit(符号位) 11bits(指数位) 53bits(尾数位)

例如-1.234567d,用二进制表示为1011111111110011110000001100100101010011100110111000100010000111

类型符号位1指数位11小数位52数值101111111111001111000000110010010101001100110111000100010000111可见,不同精度的相同值在计算机中存储的内容会不同。前面的适应度函数有两个double类型的参数,所以当它用于遗传算法基因编码时,就会有128个基因。

虽然基因很多,但好在每个基因都是0或1,交叉和变异操作都非常简单。

3.2十进制编码

与二进制编码相比,十进制编码的基因长度更短。适应度函数有两个输入参数,因此一个个体有2个基因,但其交叉和变异操作相对复杂。

交叉操作

选项1:将一个基因作为一个整体,交换两个个体的等位基因。

交换前

12A 豌豆基因1020B 豌豆基因3040 交换第一个基因后

12A 豌豆基因3020B 豌豆基因1040 方案二:将两个个体的等位基因视为一个整体,使得总和不变但数值随机

交换前

12A 豌豆基因1020B 豌豆基因3040 交换第一个基因后

12A 豌豆基因2120B 豌豆基因1940 假设A、B 豌豆的第一个基因之和为40,即,第一个基因的取值范围为0-30,则A和B豌豆基因的取值范围为[10,30],即是[0,30]的随机数,。

对于变异操作,只需将基因的一个随机位设置为该基因取值范围内的随机数即可。

3.3轮盘赌

这个过程听起来很简单,但实施起来并不容易。

对于个体适应度值A1B2C3D4,我们需要将它们的值映射到一个轴上以进行随机选择。毕竟我们无法画一个轮盘来模拟这个过程。

如图,将ABCD按照它们的值依次排列,取[0,10]内的随机数r,如果r在[0,1]内,则选择A,如果在(1,3]内,选择B,如果r在[0,1]范围内,则选择B。3,6],选择C,并且(6,10],选择D。

当然,这样还是会有问题,就是当DA、B、C时,如果它们的值分布如下

个体适应度值为A1B2C3D100。显然,选择D的概率明显大于其他。按照轮盘赌的选择,下一代很有可能都是D的后裔,有什么办法可以平衡呢?

首先我想到了一个函数,

别问我为什么不知道什么是神经网络,也没有听说过softmax或者cnn。

该值为sigmod((适应度-平均值)/(最大-最小值))。现在我们来计算ABCD的值。个体适应度值为A0.435B0.438C0.441D0.677。这样一来,他们之间的差距就没有以前那么大了。这么大,只要个体的适应度值高于平均值,它被保留到下一代的概率就会比较高。当然,这缩小了个人之间的差距,这对于真正优秀的个人来说并不公平。相应地,我们可以在每次选择过程中将当前最优秀的个体保留给下一代,而无需参与轮盘赌残酷的淘汰过程。

4.实验

最欣慰的部分来了,又可以愉快地补字数了。

由于遗传算法的收敛速度太慢,仅仅50代很难得到好的结果,因此我们将其最大迭代次数放宽至200代。

方案1.

使用二进制编码解决

参数如下:

参数值问题维度(dimension) 2 豌豆数量(种群数量) 20 复制数量(最大迭代次数) 200 crossRate(交叉率) 0.8 alterRate(变异率) 0.05 取值范围(-100, 100) 编码方式二进制实验次数10

求解过程如上图所示。可以看出基因收敛得非常快。到了接近20代的时候,身材就只剩下1点了。后续的点很可能是根据变异操作生成的。看看最终结果。

数值最优值0.0 最差值1374.1828414659183 平均值214.78194828105424 可以看出,最好的结果得到了最优解,但最差值和10 次实验的平均值相差甚远。为什么会发生这种情况?

问题出在二进制编码上。由于double类型编码有11位指数位和52位小数位,这会导致交叉和变异操作选择指数位和小数位的概率不平衡。修改小数位会影响结果。影响太小而指标的修改对结果影响太大。

例如-1.234567d,用二进制表示为1011111111110011110000001100100101010011100110111000100010000111

类型符号位1 指数位11 小数位52 数值1011111111110011110000001100100101010011100110111000100010000111 对指数第5位进行变异运算的结果为-2.8744502924382686E-1 0,而对于十进制数字5来说,变异操作后是-1.218942。可以看出,这两部分对数值结果的影响太不平衡了。当得到更好的结果时,指数位置很可能非常接近解。否则很难得到好的结果,就像上面的最差值和平均值一样。

所以使用上面的二进制编码并不是一个好的基因编码方式,所以在后面的实验中,会使用十进制进行实验。

方案2:

使用:十进制编码求解

参数如下:

参数值问题维度(dimension) 2 豌豆数量(种群数) 20 繁殖次数(最大迭代次数) 200 crossRate(交叉率) 0.8 alterRate(变异率) 0.05 取值范围(-100, 100) 编码方式十进制交叉方法交流遗传实验次数10

我们可以看到,直到第40代,所有个体才汇聚到一点,但随后又不断出现新的个体。我们发现后续的新粒子总是在同一条水平或垂直线上,因为交叉操作直接交换了两个个体的基因,那么它们就会互相交换x坐标或y坐标,导致新个体看起来就像一条优越的直线。

我们来看看这次的结果吧。

最佳值为0.4998897017064181。最差值为101.50731384880558。平均值为26.879257652054093。这次最优值没有得到最优解,但最差值并不像二进制那么糟糕,虽然并不乐观。利用交换基因的方法进行交叉操作的搜索能力不足。另外,轮盘赌选择会有很大的概率选择最优个体,并且个体总是出现在矩形的边缘。

接下来,我们首先改变轮盘赌选择策略,使用上面的sigmod函数方案,将最好的个体保留给下一代。

方案3:

使用:十进制编码求解

参数如下:

参数值问题维度(dimension) 2 豌豆数量(种群数) 20 繁殖次数(最大迭代次数) 200 crossRate(交叉率) 0.8 alterRate(变异率) 0.05 取值范围(-100, 100) 编码方式十进制交叉方法交换遗传轮盘法sigmod函数方案,保留最好的给下一代实验号10

从图片上看,似乎和之前的没有什么区别。我们来看看最终的结果:

最优值为0.4504701892811481 最差值为18.879980044723276 平均值为6.865234201226049 可以看出最优值没有变化,但是最差值和平均值都有了很大的提高,说明轮盘赌方案使得算法更加鲁棒。一个很大的进步。在每次保留最佳个体的情况下,其他个体的选择概率相对平均。 sigmod函数使得即使适应度函数值差别不大,被选择的概率也相似,增加了遗传多样性。

方案4:

使用:十进制编码来求解,改变交叉方案,并分配随机值,同时保持两个单独等位基因的总和不变。

参数如下:

参数值问题维度(dimension) 2 豌豆数量(种群数量) 20 复制数量(最大迭代次数) 200 crossRate(交叉率) 0.8 alterRate(变异率) 0.05 取值范围(-100, 100) 编码方式十进制交叉方法修改Gene 使其成为和不变轮盘法sigmod 函数方案,保留最好的给下一代实验编号10

从上图可以看出,这个方案与之前的方案有明显的不同。在整个过程中,个体始终分布在整个搜索空间中。虽然大部分新生成的个体仍然集中在十字形的位置,但其他位置的个体却比之前小了很多。还有更多计划。

看看结果,

最优值为0.011758796459006677 最差值为2.2756330462780725 平均值为0.8849388632252244 这次的结果明显优于之前所有的解决方案,但仍然可以看出十进制遗传算法的精度不高,只能找到最优解的附近。也有可能的问题是算法收敛速度太慢,还没有收敛到最优解。

5.总结

遗传算法的研究已经结束了。研究遗传算法时总有一种力不从心的感觉。问题可能在于遗传算法只提出了一个大概的核心思想,其他的实现细节需要自己去思考。每个人的想法都不同。一万人可以编写一万种遗传算法。其实不光是遗传算法,还有很多后续的算法。

为什么遗传算法的参数没有调好?由于遗传算法的参数过于简单,对结果的影响具有很强的可解释性和意义,实验意义不大。

由于遗传算法模仿了生物体的进化过程,所以我感觉它的求解速度很慢,而且进化出来的结果不一定是最适应环境的,就像人的阑尾、视网膜结构等,虽然它们是不是最佳的。这个选择一直保留到今天。生物的进化是高度随机的。如果恐龙没有灭绝,就不会有人类的统治。如果人类没有两只手,每只手有五个手指,就不会有十进制。

以下指标纯属个人观点,仅供参考

用户评论

闲肆

我要学习遗传算法了,感觉听起来很厉害的样子!

    有19位网友表示赞同!

看我发功喷飞你

终于看到了关于遗传算法的笔记啦,太棒了!

    有20位网友表示赞同!

孤败

笔记讲解得很好懂,对遗传算法有了更深的理解。

    有15位网友表示赞同!

巷陌繁花丶

我一直想了解一下遗传算法是如何工作的,这篇文章正好解释得很清楚。

    有5位网友表示赞同!

昂贵的背影

感觉遗传算法可以用在好多实际问题上啊,真实用!

    有13位网友表示赞同!

无望的后半生

我现在正在研究优化算法,遗传算法是重点学习对象!

    有20位网友表示赞同!

服从

期待看到更多关于遗传算法的笔记和应用案例。

    有7位网友表示赞同!

杰克

学习完这篇文章后,我可以尝试用遗传算法解决一些练习题了!

    有6位网友表示赞同!

孤者何惧

遗传算法这种算法还真是让人眼前一亮,太有趣了!

    有12位网友表示赞同!

蹂躏少女

以前只知道算法名字,现在终于明白了它的原理!

    有16位网友表示赞同!

陌潇潇

笔记的案例分析很有帮助,可以更直观地理解遗传算法。

    有20位网友表示赞同!

矜暮

我要把这篇文章保存起来,回头仔细阅读几遍。

    有6位网友表示赞同!

经典的对白

学习了这么多优化算法,感觉遗传算法特别吸引人!

    有9位网友表示赞同!

孤街浪途

这个博客真的太棒了,经常分享到我感兴趣的知识点!

    有12位网友表示赞同!

景忧丶枫涩帘淞幕雨

希望以后还能看到更多关于人工智能领域的笔记。

    有14位网友表示赞同!

龙吟凤

遗传算法在实际应用中的潜力巨大,很有必要深入研究它!

    有14位网友表示赞同!

岁岁年年

文章写得通俗易懂,非常适合入门学习的人看。

    有15位网友表示赞同!

安之若素

我已经对遗传算法产生了浓厚的兴趣,我要继续学习相关知识。

    有20位网友表示赞同!

念旧情i

感谢作者的分享,让我对优化算法有更深入的了解!

    有12位网友表示赞同!

【算法优化技巧(六):深入探讨遗传算法】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活