遗传算法(Genetic Algorithm)是优化算法里的经典方法,灵感来自达尔文的生物进化论。它通过模拟自然选择和遗传变异的过程,在解空间里搜索最优解。很多人第一次接触遗传算法觉得抽象,但其实把流程图画出来,整个过程就清晰多了。今天就一步步拆解遗传算法的流程,帮你把它的原理和实现思路搞明白。
遗传算法的第一步是编码,也就是把问题的解表示成"染色体"(通常是一个字符串或数组)。比如要优化一个函数的参数,可以把每个参数编码成二进制串或者浮点数,多个参数拼接起来就是一条染色体。编码方式的选择很关键,直接影响后面的交叉和变异操作。二进制编码最简单,交叉就是交换二进制位,变异就是翻转某一位;实数编码更直观,但交叉变异的设计要复杂一些。
第二步是初始化种群。种群就是一组染色体,每条染色体代表一个候选解。初始化时随机生成一定数量的染色体,种群大小一般取几十到几百。种群太小容易陷入局部最优,太大计算量又上去了。初始化完成后,要计算每条染色体的适应度(fitness),也就是这个解有多好。适应度函数根据具体问题来定,比如求函数最大值就直接用函数值,求最小值就取倒数或者负数。
第三步是选择,也就是"优胜劣汰"。根据适应度大小,从种群里选出一些染色体作为父代,适应度高的被选中的概率大。常用的选择方法有轮盘赌选择(适应度越高被选概率越大)、锦标赛选择(随机抽几条选最好的)、排序选择(按适应度排名分配选择概率)。选择的目的是把优秀的基因传到下一代,但也要保持一定的多样性,不能让种群过早收敛到局部最优。
第四步是交叉,模拟生物的基因重组。从选出的父代里两两配对,以一定的交叉概率交换部分基因,生成子代。比如二进制编码下,随机选一个交叉点,把两条染色体在这个点之后的部分互换。交叉概率一般取0.6到0.9,太低了进化慢,太高了容易破坏好的基因结构。交叉是遗传算法产生新解的主要手段,决定了算法的全局搜索能力。
第五步是变异,模拟基因突变。以很小的变异概率(一般0.001到0.01)随机改变子代染色体的某一位。二进制编码下就是0变1或1变0,实数编码下就是给某个参数加个小扰动。变异的作用是保持种群的多样性,防止算法陷入局部最优。虽然变异概率很小,但缺了它,种群很容易提前收敛到一个次优解。
选择、交叉、变异完成后,就得到了新一代的种群。然后回到第三步,重复这个过程,直到满足终止条件——比如达到最大迭代次数,或者适应度连续几代没有改善。最后从种群里挑出适应度最高的染色体,解码后就是问题的最优解。画流程图的话,就是"初始化→评估适应度→选择→交叉→变异→新一代种群→评估适应度→(不满足条件就循环)→输出最优解"这样一个闭环。掌握了这个流程,不管用什么语言实现遗传算法都不难。
下一篇:没有了