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