目录

大话智能优化算法之遗传算法

基本概念

遗传算法是根据生物进化理论得来的,在自然社会中,我们染色体的交叉变异都是随机的,适应能力强的生物得以抵抗恶劣环境发生变异能够存活下来,而适应能力不强的将消亡。

基于这种概念,我们是否可以考虑,在求最优值时,利用随机的变异交叉,迭代(可以认为是繁殖的多少代),将变异后好的样本值(目标值好的)留下来,然后将差的后代去掉,用好的来繁殖,进行迭代,这就是我们所说的优生优育啊。基因好的就该多生,目前这我们还没这政策呢。

举例

我举个简单例子,假如我求一个连续函数的最大值,比如y(x)=x2(这里是x的平方),x范围为[-2,2]。这个函数的函数值就是我们的适应度啊,有的x对应的函数值大,就留下来,有的很小我就用好的替换掉。

万物都是起源的对不,我也得首先给它造个亚当,夏娃啊。当然我们不只是造一个啦,我们造多个啊,这个群体人口基数大了才能迅速产生优良个体撒。

初始化

所以我们就先初始化样本个体,但是如何初始化啊,这个就涉及到编码问题了,学过生物我们都知道人体有23条染色体,染色体间是实现片段的交叉变异,但是我们这是一个值啊1,2,0.1等,这时我们就想到了用编码,二进制编码,反正只有0,1而且二进制和十进制之间是相互转换的嘛。但是我们取值的范围不是[-2,2]么,长度是4,转化为二进制就是100,很明显取值也只能是0,1,2,3,4,加上-2,就是可以取-2,-1,0,1,2。可是这个太短了吧样本,交叉变异都不好弄,这时我们发现我们精度不够,取值只有这几个呀,所以我们想到取精度为1呀,保留后一位,那取值长度个数就变成了4/0.1=40啊,这时二进制编码长度就有32~64之间,明显我们取6,即1000000,注意到其中的我们变量值x到基因值的转化,这个自己琢磨。

交叉变异

有了样本个体后我们就开始交叉,变异嘛,你要问我如何交叉,就是随机选两个样本来造下一代嘛,呃呃,不是酱紫的。就是随机先选择群体中的两个样本,然后用rand()随机生成在哪个位置交叉啊,就是两个样本在指定位置进行交换嘛,也就是交换0,1.一般的嘛,我们这么想交叉的越多,是不是进化的越快啊,想想人类也有几万亿年了。所以,看你设定随机交叉的次数了,交叉了我们就开始变异啊,这个更好办了,随机指定变异位置,反正就是0,1的变化。

筛选

这时我们就需要进行刷选了,有些样本不行就扔掉了。可是我们如何来确定好与坏呢,对的,我们还先计算函数值大小嘛,也就是y(x)的值。每个样本都这个适应度(函数值)。这就开始找吧,找到最好的,找到最差的,不过我们可是知道啊,每一代进化是不是有个最好的呀,然后从亚当夏娃开始,我们就记录一个更更好的个体,它是所有代里面最好的。然后呢,我们就需要将用这个最最好的个体来代替每一代选出来不行的样本啊,让它进化啊。一旦某一代出现了更好的样本,我们也需要更新这个最最好的样本嘛。

总结

这样,就完啦,遗传算法就这么简单呀,你给指定交叉变异来个100代,能得出最好的个体的。当然遗传算法还有许多变种,可是明白这最基础的原理是最重要的,有兴趣的可以解决离散问题的tsp问题,也很有意思。

原文出自我的csdb[博客](https://blog.csdn.net/zlhn55/article/details/50999573)

许可协议:CC BY-NC-ND 4.0