对于遗传算法,谈谈个人看法

最近在学习遗传算法,小有体会。这个用数学方法来模拟生物学过程的算法实在是有很多值得玩味的地方。

遗传算法要干什么?比如Z=f(x,y),我们要找到他在x[0,1],y[0,1]区间上的最大值。我们就先随机在x[0,1],y[0,1]选取50个点,然后经历选择,基因重组,变异的过程,得到一代又一代的个体,每一代还是50个,达到最终代数时选取最优个体作为问题的解。

遗传算法的基本运算过程如下:

a)初始化:设置进化代数计数器t=0,设置最大进化代数T,随机生成M个个体作为初始群体P(0)。

b)个体评价:计算群体P(t)中各个个体的适应度

遗传算法

c)选择运算:将选择算子作用于群体。选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。选择操作是建立在群体中个体的适应度评估基础上的。(概率分布函数p=f(x,y)/sum(f(x,y)),p代表被选择的概率,显然如果Z越大,我们越想让他留下来,因为我们就是想要最大值嘛。)

d)交叉运算:将交叉算子作用于群体。遗传算法中起核心作用的就是交叉算子。(根据概率选取50个个体,两两配对,交换x,y,比如之前两个是(x1,y1),(x2,y2),之后变成了(x1,y2),(x2,y1))

e)变异运算:将变异算子作用于群体。即是对群体中的个体串的某些基因座上的基因值作变动。(x2可能变为x2+δ,y1变为y1+δ)

群体P(t)经过选择、交叉、变异运算之后得到下一代群体P(t+1)。

f)终止条件判断:若t=T,则以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。

 

首先,遗传算法最后的出现的情况会很多很多。比如你取50个样本(亲代固定),做100次繁殖,那么第100代可能出现的情况……简直是不可描述(太麻烦了)。大致描述一下吧,第一代的50个个体是由亲代的25对组合繁殖出来了的,一个组合有多少种可能呢,(50*49/2+50=1275种),之后再看做是1275个不同的人去做25个无序的座位。。。这还只是第一代,种类是树杈图关系,(不能用乘法原理,因为第一代的不同情况下面对应的第二代的情况也是不同的,就是说第一代算出来有n种情况,对于每一种情况,第二代不是一个相同的值。。。Give up)。种类应该是很多很多的。

但是有两朵乌云,第一朵:虽然随着代数的增加,种类个数肯定会越来越少(劣势个体被淘汰,整个种群趋近于优势个体,单调化),但是就光算算前面几代,都够吓人了。。。计算机实现感觉上也比较困难。

第二朵:会不会有基因在之前的几代进行了改变,但是后经过后面几代的变化改回来了?这个重复会导致种类的减少,但是这个概率“感觉上”是很小很小的,因为基因种类数大部分情况下是在减小的,你想要产生一样的情况,原来的某个基因都已经消失淘汰了怎么复原,除非变异,但是变异的几率也是很小很小的。

所以遗传算法最后出现的群体是做不到大致预测,给出一个期望值的(本来想把所有情况以及对应的概率算出来)。在实验中,我们发现平均适应度函数的值(对于一个群体用平均适应度来衡量),会随着遗传算法的进行而升高,同时适应度方差越来越小,这是我们所希望的优化。分析一下原理,就是适应度函数大的个体在选择的这个环节中概率大,从而他身上的基因(其实就是参数),保留下来的几率就大,从而可能性更大地可以参与到之后的基因重组环节,(选取两个个体,再产生一个随机数来指明交换的随机位点,之后在这个随机位点交换两者的参数。以上讨论的是遗传算法最简单的情况,仅仅有两个自变量,只能交换x,y,当有上百个自变量的时候,重组操作的位点是随机选取的。比如后70个自变量交换,后45个变量交换都是有可能的。)。

这以上看起来没什么问题,毕竟实验结果说明确实做到了优化,但我有一个小疑问,我认为遗传算法的适用范围其实是有一定限制的,或者说在某些模型中才能发挥比较好的作用。那就是那些参数对整体的贡献独立性比较强的时候。为什么这么说呢,打个很简单的比方,团队一有ABC三个人,他们在一起的时候业绩很高,团队二有DEF三个人,业绩也很高,但是如果试行上面的那种交换变成了AEF与DBC两个团队,他们两个团队分别的业绩反而会降低。这里团队一指的就是个体一,ABC指的是个体一下的三个参数,也就是所谓的基因,团队二同理。照上面的道理,个体一和个体二被上天选择的概率(适应度高,团队业绩好)都比较大,当他们在一起配对的时候,发生的基因重组破坏了原来各自的基因组合关系,反而产生了适应度比之前还要低的个体,这显然会消灭一些“天才”个体。说到这,又引出了另一个问题,你的优化目的是什么?我们大多数时候是为了寻找最优解,也就是这个群体中的最优个体,以上发生的这种情况显然不是我们所希望的。

这种情况发生在什么时候呢?当然是个体中的各个参数关联性,或者说组合性比较大的时候,而这种性质怎么去衡量呢?我想了想,这种性质是很难去精确衡量的,至于为什么先放一放。

反过来问问自己,既然有优势个体会因为基因重组变得劣势,那么就也应该有劣势个体会因为基因重组而变得优势。这两者一个抑制群体发展,一个促进群体发展,那么整体上来讲到底是啥?分析开始几代的情况,那个时候劣势个体还没有被淘汰,讲道理劣势个体越劣势,那么他经过组合之后变好的可能性就越大,但是不要忘了,越劣势,它本身的适应度就越低,选择时被选择到的概率也就越低,那么越有希望变好的个体反而越被埋没。同理,越优秀的个体,越有经过基因重组后变差的风险,却越容易被选择到。当然这只能用作刚开始几代的分析,因为这个时候大家虽然有差异,但是由于种类多,因此个体之间概率的差异不是很大。比如z=f(x,y)这样一个最简单的例子,z是适应度函数,(x,y)成为一个个体,x,y称为这个个体的基因,x,y范围为[-1,1],种群中有50个随机分布的个体,假如x=0.2这个截面上(把z=f(x,y)图像画出来),相比于其他x的截面,z的值都非常高,那么显然0.2这个基因会在物竞天择中占据优势,从而“一代代”基因频率越来越高,但这样的优势是需要积累的。比如一个拥有x=0.2基因的个体,适应度f(0.2,0.435)=5,但是其他的个体的适应度只有1,0.5,0.8,0.6……但是不要忘了,有50个个体啊,你是别人的好几倍,在概率分布函数p=f(x,y)/sum(f(x,y))面前,你仍然在整体中只占一小部分,除你之外的“疆土”还是有很多。但是时间会慢慢改变,那些概率低的个体在一代代的选择中淘汰了,他们所带有的不够强大的基因也慢慢不见了,这时x=0.2的基因频率就会越来越大,最终可能和几个也比较强大的x=0.3,x=0.4一起瓜分天下,最终整个种群趋于稳定,个体差异性被大程度消灭。

我还想说一点就是,“相比于其他x的截面,z的值都非常高”上面说的这句话,完全可以对x=xn与函数交线,以及x=xn与z=0平面的交线这两个交线构成的平面进行面积积分来进行衡量,但是这个衡量肯定是“粗浅的”,因为在这个积分中,所有区域的概率是一样的,真正科学的做法应该是,把z乘上对应的概率再进行积分,这个概率怎么算呢?又来举个例子,比如含有0.2的个体还是(0.2,0.435),另一个个体是(0.3,0.666),对于x=0.2来说,他的y变为0.666的概率就是f(0.3,0666)/sum(f(x,y)),对应的把其余所有的个体算一遍。所有个体记为C1,C2……C50,对应的第k代的概率为pk1,pk2……pk50,对应的基因分别为x1,x2……x50,y1,y2……y50那么描述基因x=xn的在第k代的传递强度Wn(其实就是在第k+1代的期望适应度)为:

Wn=2*pkn*(1-pkn)*(pk1*f(xn,y1)+pk2*f(xn,y2)+pk3*f(xn,y3)+……+pk50*f(xn,y50)[说明:这个累加中没有pkn*f(xn,yn)])+2*pkn*pkn*f(xn,yn)

(推广到更多元的函数时,把y1看成由除了xn以外的变量组成的一个矩阵就行)

这个值越大,这个基因在下一代传递下去的概率就越大。

可能有朋友发现了,之前的积分是连续的,但是我们现在是离散的,没错,50个个体如果想精确计算确实不能代表区域,当我们研究问题时,可以引进一个分布密集度的参考值,粗浅的说比如一个[-1,1]区间里面应该随机分布1000个样本,可以近似看做连续,这个时候分布密集度是500(1000/2即样本数量n/自变量上限减下限),那么当另一个问题区间变为[-100,100]时取1000个样本够不够呢?我们肯定会觉得不够,但是如果因变量的变化范围和区间为[-1,1]时是一样的,相当于图像变平坦了,或者说直接把[-1,1]区间扩大100倍,这个时候同样用1000个样本其实是合理的,因为对图像的放缩不会改变样本密度的“合格值”。因为区间虽然扩大了,但是因变量的变化范围没有变,虽然样本数量相对于新区间来说是变少了,但是图像平坦化使得对于样本数量的要求同样也降低了。想到这,我们可以引进一个参考变量叫做变化敏感度。首先将x,y,m,n等所有变量全部归一化处理,假设之前是一个五元函数Z(x,y,m,n),归一化之后得到一个新函数Z1(x,y,m,n) 。然后x变量的变化敏感度可以定义为:样本数量∫|Z1x|dxdydmdn)/n(对每个变量求偏导之后再进行p重积分,重积分的积分变量为所有的自变量。p为自变量个数),积分区域为整个自变量范围(都是0到1),同理又可以求出y变量,m变量,n变量的变化敏感度。当然在我们的这个例子中截下来的是一个二元函数,只需要求∫|Zx|dx/n就行(准确的说这里的被积函数是Zxn,xn看做是一个定值)。总之,取数据时,我们既要保证分布密集度在一个经验阈值之上,又要保证变化敏感度在一个经验阈值之下,根据木桶原理,这个经验阈值应该是由最“调皮”的变量的变化敏感度去决定的。

进一步说明一下,这个分布密集度是指在单位自变量区间内样本的分布状态,变化敏感度指的是在单位因变量区间内样本的分布状态的倒数,变化敏感度

好的,我们得到了第k代某种情况(不妨算作第m种情况)下x=xn基因传到第K+1代的期望概率。这说明如果要精确计算第k+1代的适应度期望,我们必须知道第k代的种群分布。那么如何从第1代算出第100代某个基因的期望适应度呢?(说明:本来适应度是对于一个个体才有的,这里所说的基因的期望适应度是一个概率上的适应度,反映的是在众多的情况下含有xn的个体在概率分布下的一个期望适应度)

我们就必须“写出”第99代的所有情况以及所有情况所对应的概率,然后再用Wn的公式把99情况所对应的Wn算出来,乘上情况对应的概率然后相加,得到第100代的概率期望。很多人看了估计会打我,因为你直接把第100代情况的概率分布写出来,再算出f(xn,yn),乘上对应情况的概率相加不就行了吗?对确实是一样的,但是前者更简单,少了从第99代情况推出第100代分布情况的这一步骤。但是估计有更多人想打我了:你都写到了第99代,少写了一代在写了99代这样一个庞大的工作量面前算得了什么。

好吧。。。我挨打无话可说,因为确实如此。其实我一开始的想法只是想找到一种方法通过亲代的分布,和适应度函数,大致去预测第100代哪几个基因最具有竞争力。讨论到现在,我说服了自己还是放弃,因为从亲代的分布情况,算出一个可信度比较高的基因的适应度分布,可行性为无穷小。

所以唯一有一点可行性的就是我前面某一段提到的,用x=x0的截面的积分去衡量,这种衡量只有在分布密集度比较好,同时分布也比较均匀的时候才行,这种情况只会在开始几代出现,但话说回来,其实就算基因分布得比较密集也比较均匀,由于各自所属的个体对应的适应度是不一样的,讲道理应该还要乘上适应度所算出来的概率得到一个“加权积分”,每一个部分的概率都是由当前的包含这个部分的个体的适应度算出来的。所以说,这个方法根本就是“看看就好,然并卵”。这就是我为什么说这个方法比较粗浅的原因。当然,用来分析最开始几代还是有价值的。

总的来说,遗传算法是一个比较黑的黑箱模型,数值计算基本上很困难。但是大致可以说,注意,“大致可以说”,只有那些稳定性和单个区间的实力兼备的基因,最后才有可能在残酷的竞争中占据主导地位,同时还要加上一点亲代分布时的好运气(打个不太恰当的比方,通俗点说就是富二代容易混得好一些)。一个基因光有一两个小区间适应度很高是不够的,因为在开始几代会发生大规模的与其他个体基因重组,肯定会有换地方的时候,别的地方不行还是得凉,因此稳定性和实力必须兼顾。同时,如果基因真的只有一个地方特别特别强,同时第一次随机生成亲代的时候正好又生成到了你这个区间,那么恭喜你有了一对好爸妈,能帮你多撑过好几代的物竞天择,但是迟早有一代会翻车,特别是在样本数量达到成百上千的时候,这种先天“优势”带来的效益就越发有限,会被大量的其他样本数据所“平均”掉。所以还是那句老话,运气、整体实力同样重要,在越广阔的世界里,一个基因的整体实力的重要性是上升的,运气的重要性是下降的。(这里的整体实力包括稳定性和单个区间实力两部分)

再讨论一个小问题,比方说有一个基因是y1=0.2,另一个是y2=0.3,如果他们的适应度是对称的,那怎么来区别这两个基因呢?这里解释一下对称的含义,就是y1=0.2不是截出来一条曲线Z1(X)么,同理有Z2(X),已知x的范围是[0,1],这两个函数关于x=0.5这条直线对称,这个时候用我们之前的“积分判别法(呵呵)”来看这两个整体实力是差不多的,只不过优势分布不同而已,比如Z1(X)在[0,0.5]区间上适应度很高,但是[0.5,1]上比较低,那么Z1(X)和他正好反过来。所以这个时候就要看x的优势基因分布在哪里了,如果分布在[0,0.5]上,那么显然在初始条件一样的情况下,y1=0.2基因会胜出。这里还提一句,随着代数越来越大,优势基因体现了出来,那么之前的“积分判别法”就显得很不科学了,假设x基因中的优势基因为x0,x1,x2,对于某个基因y=y0来说,它能否在竞争中取得优势主要是看x=x0,x=x1,x=x2这些交点上的个体是否有竞争力,对于x的整个取值区间,随着代数增长,优势基因的扩张使得其他变量在计算适应度时在这些基因上的“权重”变得越来越大,这个时候决定胜负不再是整体实力,而就是在与优势基因的交点上的实力。回到一开始的例子,最初几代时,y1y2x相对于其他整体实力不好的基因都能有比较好的优势,但是随着时间推移,y1在x优势基因的帮助下最终将战胜y2,可见变量之间其实是相互制约的。

所以最后我们得到的个体是什么呢?并不是那些“暴发户”,而是一些整体表现都比较不错的基因的交点。(比如x=0.2,0.4和y=0.9,0.8比较整体好,在遗传中占据了主导地位,那么最后得到群体中大部分都是(0.2,0.9)(0.2,0.8)(0.4,0.9)(0.4,0.8)附近的解,“附近”是考虑基因可能会在原有范围产生一些微小变异。)我们回到最初的起点,我们想要的是什么,是最优解,而不是一个比较不错的群体,那么这个时候,这四个点不一定是“最优”解,因为这个时候我们关注的是单个区间的实力,而不是整体实力,我们就想要找那个最牛逼的解,最厉害的点,而不是几个都还不错的基因的交集,交集肯定不会差到哪去,但也肯定不会是最厉害的那个解。因为x=x0基因是一个大部分比较好的基因(换句话说在x=x0这个截面上大概率适应度比较好),y=y0基因也是一个大部分比较好的基因,最多能推出在(x0,y0)大概率是一个比较好的解。于是我们应该采取“保护最优个体”的策略,让他不参与基因重组,不去破坏他的参数结构,每一代都选取一个最优个体,让其余的个体参加基因重组,当100代全部进行完之后,在每一代的最优个体中优中选优,能够更好达到我们的目的。

个人拙见,欢迎讨论。

 

 

 

 

 

 

补充:

选择染色体用随机数去决定,从整体上可以反映出交配概率。

基因突变也是用随机数

(要用程序实现)

 

复杂的问题会用到倒位

 

二进制编码会破坏变量的整体性,之前我写的那篇日志不能用来说明遗传算法中的二进制编码。

 

两个染色体交换之后情况1:要么一个增大,一个减小。但是大者不可能小过小者,小者不可能大过大者。

情况2:要么小者更小,但不可能小过0,大者更大,不可能大过最大值。

 

但是倒位就会破坏变量之间的三级独立性,完全陷入一种无序随机的状态,会增强全局搜索能力。

 

 

    原文作者:遗传算法
    原文地址: https://blog.csdn.net/qq_40791635/article/details/83034961
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞