遗传算法是一种启发式优化算法,灵感来自达尔文的进化论。它通过模拟自然选择和遗传变异的过程,在解空间里搜索最优解。跟传统的数学优化方法比,遗传算法不要求目标函数可导,也不要求连续,特别适合那种解空间巨大、传统方法搞不定的优化问题,比如路径规划、调度、参数寻优这些。
遗传算法的核心流程其实就是三步:选择、交叉、变异,再加上初始化和终止判断。一开始随机生成一群"个体"(也就是候选解),每个个体的好坏用"适应度"来衡量。然后进入迭代:先根据适应度选择优秀的个体作为父母,再让父母进行交叉操作产生后代,后代有一定概率发生变异。这样一代一代繁衍下去,种群整体的适应度会越来越高,最终收敛到近似最优解。
选择操作的目的是"优胜劣汰",适应度高的个体有更大的概率被选中繁殖。常用的选择方法是轮盘赌选择,把每个个体的适应度按比例映射到轮盘上,转一下轮盘,指针停在哪就选哪个。这样适应度高的占的面积大,被选中的概率就高,但适应度低的也不是完全没机会,保持了种群的多样性。还有锦标赛选择,随机抽几个个体比谁适应度高,选最好的那个,这种方法实现简单,用得也很多。
交叉操作是产生新个体的主要方式。对于二进制编码的个体,最简单的是单点交叉:随机选一个位置,把两个父母在这个位置后面的基因段交换,得到两个后代。比如父母是1101|1010和1010|0101,交叉后变成11010101和10101010。交叉概率通常设得比较高(0.6到0.9),保证种群能不断产生新解。对于实数编码的个体,交叉方式不太一样,常用模拟二进制交叉(SBX)。
变异操作是为了防止种群过早收敛到局部最优。它以很小的概率(通常0.001到0.01)随机改变个体的某个基因,比如把0变成1。变异概率不能太大,太大就退化成随机搜索了;也不能太小,太小种群多样性不够,容易早熟。变异相当于给算法注入一点随机性,让它有机会跳出局部最优的坑。
实际用遗传算法时,参数调优很关键。种群规模太小容易早熟,太大算得慢;交叉概率和变异概率要根据问题特点调整;终止条件可以是达到最大迭代次数,或者适应度连续多少代没有提升。编码方式也很重要,二进制编码简单但有"汉明悬崖"问题(比如0111和1000数值差1但比特位全变了),实数编码更适合连续优化问题。如果解的质量不够好,可以试试增大种群规模、调整交叉变异概率,或者用精英保留策略(每代最好的个体直接保留到下一代)。
下一篇:没有了