1700507736
1700507737
x是21位的二进制编码,例如。F(x)是二进制编码到十进制实数的映射函数。
1700507738
1700507739
第2步:设计初始群体
1700507740
1700507741
1700507742
设计一定量的群体,每个个体都用一个二进制编码来表示,使用程序循环生成N个21位二进制编码,当发现时就进行舍弃并重新生成,直到生成N个满足要求的21位二进制编码。
1700507743
1700507744
第3步:遴选与生育
1700507745
1700507746
首先,比较当前N个H(x)的值。然后,将其从大到小排序,选择最大的前M个对象作为可以生育后代的备选。最后,在这M个备选对象中进行两两之间的基因重组(如图11-21所示)。
1700507747
1700507748
1700507749
1700507750
1700507751
图11-21 基因重组
1700507752
1700507753
1700507754
根据排列组合,每一代会产生个下一代对象。在两两组合的过程中,可能会在这21位中的第1位后到第21位前的任意位置断开然后重组,这个位置是随机的。
1700507755
1700507756
以2个基因组为例:
1700507757
1700507758
101010101010101010101
1700507759
1700507760
000011110000111100001
1700507761
1700507762
假如在第7位后断开,那么生成的2个后代的基因组就是
1700507763
1700507764
000011101010101010101
1700507765
1700507766
101010110000111100001
1700507767
1700507768
1700507769
最终,一共产生了个新的后代基因。
1700507770
1700507771
1700507772
1700507773
在当前的M个评价函数值最大的基因和个新的后代基因中再次进行这个评价函数的排序,并选择前M个作为产生下一代的备选基因。
1700507774
1700507775
在这个过程中,可以用概率p来调整其中某一位由0变成1或由1变成0的可能性,这个环节叫作“变异”,它给某个基因组提供了从一个多维空间中评价函数较低位置跳跃到较高位置的机会。虽然也有一定的概率会从较高位置跳跃到较低位置,但是跳跃到较高位置的会有更大的概率被保留下来。
1700507776
1700507777
接下来,循环进行这个遴选与剩余的过程,直到连续K轮的函数最大值不再增加,就可以判断为函数收敛。在这个算法中,N、M、K都属于可调整的参数。一般来说,N、M、K越大,找到优质解的可能性也就越大(代价是消耗的计算资源增多)。
1700507778
1700507779
遗传算法是启发式(Heuristic Algorithm)算法的一种,因为在这种几乎没有确切方向的优化场景中,需要让计算机来进行一定的“智能”选择。这种“智能”就是我们通过对基因的编码,以及对基因编码的交换,从中找出那些在一轮一轮的遴选中由计算机挑选出来的编码体现出更好特性的对象。这些优秀的对象所蕴含的编码就是逼近最优解的模板,并通过不断尝试重构这些编码来获取更好的解,这一发掘过程是一种人启发计算机的过程。
1700507780
1700507781
梯度下降法也好,牛顿法也罢,得到的都是一个近似解,都不是理想的、满足条件的最优解——总是差那么一丁点。但是,只要这个差距足够小、能够满足工程需要就够了,毕竟即使求出了这个最理想的位置,在实现中也会由于各种其他误差的引入而使为向这个理想位置逼近的努力付诸东流。这就是理想和现实的区别,希望这个方法能够治好大多数人的“强迫症”。
1700507782
1700507783
在生产实践中解决,我们通常会想办法把一个复杂问题的评价函数变成一个凸函数或者连续函数,然后通过迭代法逐步逼近,使问题得到解决。只要算法设计合理,往往能起到事半功倍的效果。
1700507784
1700507785
[
上一页 ]
[ :1.700507736e+09 ]
[
下一页 ]