【遗传算法GA】 |
您所在的位置:网站首页 › 最大值如何求解 › 【遗传算法GA】 |
文章目录
1.遗传算法概述2.分步实现过程3.完整Python代码4.结果截图
1.遗传算法概述
对于遗传算法:遗传算法是一种用于解决最优化的搜索算法,也是进化算法的一种。取名遗传就是因为它借鉴了生物学中的一些概念,比如说遗传、变异、自然选择以及杂交等等。 对于个体:遗传算法中的个体可以抽象为染色体,然后使得种群向更好的方向进化。一般来说,染色体可以用一系列0和1的串来表示,通常使用的也就是二进制表示法。 对于进化:首先生成随机个体构成的种群,然后每个个体都有自己的适应度,基于适应度随机选择多个个体,然后通过自然选择以及突变产生新的生命种群,进行下一次的迭代。 GA参数(接下来代码中要使用的): 参数名含义popsize种群规模,我们使用100binarylength构成个体染色体的二进制串长度,我们使用10pc发生交叉的概率,我们使用0.6,60%的概率交叉pm发生变异的概率,我们使用0.001,0.1%的概率变异pop初始化种群newpop新一代种群特点: ∙ \bullet ∙ 当适应度函数选择不当时,可能会收敛于局部最优。在这篇文章中我们的适应度函数就是计算的函数,函数值越大,适应性越好。 ∙ \bullet ∙ 初始化种群的数量十分重要,初始种群多大,算法会占用大量资源;初始种群小时,可能不能求出最优解。 ∙ \bullet ∙ 对于每个解,我们都要对其进行编码,这样才方便写下面的交叉、变异函数。 ∙ \bullet ∙ 变异率也是一个重要的参数。 ∙ \bullet ∙ 选择过程很重要,下面再具体的代码中讲解我们的选择思路。 ∙ \bullet ∙ 遗传算法很快就能找到良好的解,即使是在很复杂的解空间中。 2.分步实现过程任务:使用遗传算法求得函数
y
=
10
×
s
i
n
(
5
x
)
+
7
∣
x
−
5
∣
+
10
y = 10×sin(5x)+7\left |x-5 \right |+10
y=10×sin(5x)+7∣x−5∣+10的最大值,定义域为[0,10]。函数图像如下所示: ∙ \bullet ∙ GA参数的设定(放在主函数中): popsize = 100 #种群规模 binarylength = 10 #二进制编码长度(DNA) pc = 0.6 #交叉概率 pm = 0.001 #变异概率 pop = initpop(popsize,binarylength) #初始化种群∙ \bullet ∙ 初始化种群函数initpop:两个参数,popsize值种群规模,binarylength值二进制编码长度。注意:我们认定最左边为最高位! def initpop(popsize,binarylength): #生成popsize×binarylength的二维0、1序列 pop = np.random.randint(0,2,(popsize,binarylength)) return pop这里我们使用numpy的函数来生成0、1序列,给大家看一看结果: ∙ \bullet ∙ 计算种群适应度函数cal_objval:适应度为其对应的函数值,函数值越大,适应度越高。 def cal_objval(pop): x = bintodec(pop) objval = 10*np.sin(5*x)+7*abs(x-5)+10 return objval∙ \bullet ∙ 选择函数selection,参数pop为种群,参数fitval为种群适应度,参数popsize为种群规模。根据其适应度选择个体,适应度高的个体我们多选择一些,来替换掉适应度低的个体(总个体数仍为popsize)。返回新生成的种群。 def selection(pop,fitval,popsize): idx = np.random.choice(np.arange(popsize),size=popsize,replace=True,p=fitval/fitval.sum()) return pop[idx]∙ \bullet ∙ 交叉函数crossover:参数pop为种群,参数pc为交叉概率。生成同样规格的newpop数组来存储新种群。 交叉规则:我们将其分成50对染色体,相邻的两个染色体为新染色体的父本和母本。每次随机生成一个数,如果生成数落在交叉概率pc外(大于pc)说明不需要进行交叉操作,那么将父本和母本原封不动的拷贝到两个子代个体中。如果生成数落在交叉概率pc内(小于pc)说明需要进行交叉操作,那么我们再随机生成一个0-9的数cpoint,我们将父本中[0:cpoint]和母本中[cpoint+1:py]组合形成第一个子代个体,将母本[0:cpoint]和父本[cpoint+1:py]组合形成子代第二个个体。对于50对染色体重复该操作,生成新的100个个体。 def crossover(pop,pc): [px,py] = pop.shape newpop = np.ones((px,py)) for i in range(0,px,2): if np.random.rand() |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |