关于遗传算法
遗传算法是仿照自然界中生物进化而产生的一类优化算法。个人感觉遗传算法简单粗暴,适应性广。关于遗传算法的介绍网上有很多了,这里按照我自己的理解简单概括一下。
- 编码解码,将待优化的参数编码为DNA序列,最简单直接的为二进制编码(即有两种碱基的DNA链);
- 生成随机初代
- 选择,适应度(由待优化的模型得到)较好的个体有更大的概率被选择,应用比较多的方法有轮盘赌和锦标赛;
- 按照一定概率进行随机的交叉变异
- GOTO Step 2
经过多个世代的迭代之后,将会收敛到最优解。交叉和编译的作用是产生新个体,避免陷入局部最优解。
利用Python实现
前辈们常说一句话“避免重复造轮子”,其实最直接的还是搜一下别人写的包。这里之所以花时间自己搞一个主要是因为这个算法比较简单,逻辑性很明确,比较适合练手,因此才决定自己实现一下,算是敲开Python大门的第一个项目。
编码解码
这里选择使用二进制编码的方式来实现,根据用户输入的参数范围和精度计算出每个参数需要的位数,然后将参数空间均分映射为二进制编码。
Copy
1 |
# Encode parameters into DNA |
这种方式实现的精度并不是确切的为用户输入的精度,而是要高于用户的输入精度。
选择
选择的策略使用了名为锦标赛的方式,同时添加了精英保留机制。锦标赛是指随机选择N个(通常N=2)候选个体,再从中选择最优的个体进入下一代,重复多次,直到子代规模达到要求。精英保留机制是是指保护已经产生的最优个体不被淘汰,不被交叉和变异破坏。
Copy
1 |
# Select individuals |
交叉和变异
交叉和编译比较简单,利用随机数的方式来控制发生的概率。这里值得一提的是,现实中可能会发生多点的变异或者交叉,只不过概率非常低,在遗传算法的实现中如果仅仅采用单点的交叉和变异也是可以的。
代码和例子
https://yingnan.me/files/GeneticAlgorithm.py
使用例程:
Copy
1 |
import GeneticAlgorithm as GA # 导入GeneticAlgorithm模块 |