1. 从“固定”到“自适应”:为什么你的遗传算法总卡在局部最优?
我刚开始用遗传算法做优化的时候,经常遇到一个头疼的问题:算法跑着跑着就“躺平”了。明明感觉离最优解就差那么一点,但种群里的个体们就是挤在一起,谁也不肯再往前探索一步,结果就是早早收敛到一个不怎么样的局部最优解里。后来我才明白,问题很可能就出在那两个看似不起眼的参数上——交叉概率(Pc) 和 变异概率(Pm)。
传统的遗传算法,通常会把Pc和Pm设成两个固定的值,比如经典的0.6和0.001。这就像你开车去一个陌生的地方探险,一开始路况复杂,你需要频繁地尝试不同的岔路(高交叉、高变异),但到了后期,你已经接近目的地了,这时候再胡乱变道,反而容易错过正确的路口。固定参数的问题就在于,它无法适应算法在不同进化阶段的需求。在早期,种群多样性高,我们需要更强的“探索”能力,去广泛搜索解空间;到了后期,种群已经收敛到优质区域附近,我们则需要更强的“开发”能力,精细地在这个区域里寻找最优解。
这就是自适应遗传算法的核心思想:让交叉和变异的概率“活”起来,根据种群的进化状态动态调整。简单来说,就是让算法自己学会“审时度势”。当种群陷入停滞、个体间差异变小时,就自动调高Pc和Pm,注入一些“突变”和“重组”的活力,打破僵局;当种群正在快速向好的方向进化时,就适当降低Pc和Pm,保护优秀的基因结构,让进化更稳定。这种动态平衡,正是提升算法效率、避免早熟收敛的关键。接下来,我们就一起看看,怎么亲手实现这套自适应的策略,并把它用在实际的机器学习任务中。
2. 自适应策略的核心:如何动态调整Pc与Pm?
自适应策略听起来很智能,其实背后的数学逻辑并不复杂。最经典的一种思路,是由Srinivas和Patnaik提出的方法,它根据个体的适应度值来动态计算其交叉和变异概率。其核心原则是:保护优秀个体,促进差个体变革。
2.1 交叉概率(Pc)的自适应公式
对于需要执行交叉操作的两个父代个体,它们的交叉概率不是固定的,而是这样计算:
Pc = k1 * (f_max - f') / (f_max - f_avg) , 当 f' >= f_avg 时
Pc = k3 , 当 f' < f_avg 时
这里需要解释一下公式里的几个角色:
- f_max:当前种群中所有个体里最高的适应度值。它代表了本代的“天花板”。
- f_avg:当前种群所有个体的平均适应度值。它是衡量种群整体水平的“及格线”。
- f':准备进行交叉的两个父代个体中,较大的那个适应度值。我们关心的是这对父母里相对较好的那一个。
- k1, k3:是两个预设的常数,通常
k1和k2取值在0.8-1.0之间,k3和k4取值在0.1左右。k1和k3控制了交叉概率的上限和下限。
这个公式的意图非常人性化:如果参与交叉的父代个体比较优秀(f' >= f_avg),那么我们就给予它们一个相对较低的交叉概率。因为优秀个体的基因结构已经很好,我们不想用剧烈的交叉操作轻易破坏它,而是希望它能更多地保留给下一代。反之,如果父代个体比较差(f' < f_avg),我们就给它一个固定的、相对较高的交叉概率(k3),鼓励它通过与其他个体的基因重组来产生突破,这相当于给差生“开小灶”,增加其改变命运的机会。
2.2 变异概率(Pm)的自适应公式
变异概率的自适应逻辑与交叉类似,但是针对单个个体:
Pm = k2 * (f_max - f) / (f_max - f_avg) , 当 f >= f_avg 时
Pm = k4 , 当 f < f_avg 时
- f:就是当前要进行变异操作的个体自身的适应度值。
- k2, k4:同样是常数,意义与k1、k3对应。


266

被折叠的 条评论
为什么被折叠?



