遗传算法
遗传算法(Genetic Algorithm)
一个讲得很清楚的博客:非常好理解的遗传算法的例子
简单理解:
用计算机模拟人类进化,适应环境(符合条件)的继续繁衍后代,不适应环境(不符合条件)的淘汰,从而逐步找到最优解。
整体思路:
随机挑选初始种群,根据适应度函数给初始种群中的个体“打分”,通过定义的规则进行选择,将选择出来的个体两两配对进行交叉,并在生成的对象中挑选变异点,将0变1,1变0,生成后代种群,如此循环找到最优个体即为最优解。
初始种群是啥:
利用二进制(一般)表示最终解
例如:需要求解z=x^2+y^2的最大值,x={1,5,3,8},y={5,4,0,6}
用六位二进制数表示由x,y组成的解,例如:001100 表示x=1,y=4
001100 称为一条基因序列,表示的是该问题的一种解决方案
种群是包含多个基因序列(解决方案/个体)的集合
适应度函数是啥,有什么作用:
适应度函数可以理解成“游戏规则”,如果问题较为复杂,需要自定义适应度函数,说明如何区分优秀与不优秀的个体; 如果问题比较简单,例如上述求最大值的问题,则直接用此函数式作为适应度函数即可。作用:评定个体的优劣程度,从而决定其遗传机会的大小。
怎么选择:
定义“适者生存不适者淘汰”的规则,例如:定义适应度高的被选择的概率更大
怎么交叉:
利用循环,遍历种群中的每个个体,挑选另一个体进行交叉。例如,通过遍历为基因序列A挑选出B配对,则取A的前半部分,B的后半部分,组合成新的个体(基因序列)C
如何变异:
随机挑选基因序列上的某一位置,进行0-1互换
在此附上莫烦的python实现代码(解决在多峰曲线函数中寻找最大值的问题,如图所示):
莫烦关于此部分的详细讲解视频/代码:遗传算法 莫烦源码
import numpy as np
import matplotlib.pyplot as plt
DNA_SIZE = 10 #序列长度
POP_SIZE = 100 #种群的个体数目
CROSS_RATE = 0.8 #选择多少个体进行交叉配对
MUTATION_RATE = 0.003 #变异的概率/强度
N_GENERATIONS = 100 #有多少代(主循环的迭代次数)
X_BOUND = [0,5] #输入数据的范围
#需要要找到哪个函数的最大值
def F(x): return np.sin(10*x)*x + np