标准遗传算法(二进制编码 python实现)(遗传算法的编码与解码)

网友投稿 409 2022-09-03


标准遗传算法(二进制编码 python实现)(遗传算法的编码与解码)

代码地址:population_init(population, N, V, nbits): #自变量个数V并没有用到 del population[:] for i in xrange(N): tempIndividual=[] for j in nbits: tempVal=[] for k in xrange(j): tempVal.append(random.randint(0, 1)) tempIndividual.append(tempVal) population.append(tempIndividual)

选择操作:(轮盘赌选择)

​​binary_sga​​​/​​selection​​/selection.py

#!/usr/bin/env python#encoding:UTF-8import copyimport random#轮盘赌选择法def selection(population, xbin): s=sum(xbin) temp=[k*1.0/s for k in xbin] temp2=[] s2=0 for k in temp: s2=s2+k temp2.append(s2) temp3=[] for _ in xrange(len(population)): r=random.random() for i in xrange(len(temp2)): if r<=temp2[i]: temp3.append(i) break temp4=[] temp5=[] for i in temp3: temp4.append(copy.deepcopy(population[i])) temp5.append(xbin[i]) population[:]=temp4 xbin[:]=temp5

交叉操作:(单点交叉)

​​binary_sga​​​/​​crossover​​/crossover.py

#二进制编码,单点交叉def crossover(population, alfa, nbits): for i in xrange(len(population), 2): for j in xrange(len(nbits)): r=random.random() if r

变异操作:

​​binary_sga​​​/​​mutation​​/mutation.py

def mutation(population, belta, nbits): for i in xrange(len(population)): for j in xrange(len(nbits)): for k in xrange(nbits[j]): r=random.random() if r

二进制个体解码操作:

​​binary_sga​​​/​​decode​​/decode.py

#种群个体解码def decode(population, population_real, minBinVal, maxBinVal, nbits): del population_real[:] def iner(valList): L=len(valList) s=0 for i in valList: s=s+i*(2**(L-1)) L=L-1 return s for i in population: temp=[] for j in i: temp.append(iner(j)) for j in xrange(len(temp)): temp[j]=temp[j]*(maxBinVal[j]-minBinVal[j])*1.0/(2**(nbits[j])-1)+minBinVal[j] population_real.append(temp)

测试函数部分:

​​binary_sga​​​/​​function​​/object_fun.py

#对偶问题, 转化为求最大值#二维 Rastrigin测试函数def object_fun(p): import math x=p[0] y=p[1] object_value=20.0+x**2+y**2-10.0*(math.cos(2*math.pi*x)+math.cos(2*math.pi*y)) return 100.0-object_value"""#求最大值,无需转化#二维 Schaffer测试函数def object_fun(p): import math x=p[0] y=p[1] object_value =0.5-((math.sin( math.sqrt(x**2+y**2) ))**2-0.5)/(1+0.001*(x**2+y**2))**2 return object_value"""

主函数部分:

​​binary_sga​​/sga.py

N=200V=2nbits=(17, 17)maxBinVal=(-5, -5)minBinVal=(5, 5)population=[]population_real=[]alfa=0.9belta=0.05#目标函数值列表xbin=[]def per_run(): population_init(population, N, V, nbits) for i in xrange(200): decode(population, population_real, minBinVal, maxBinVal, nbits) eval_fun(population_real, xbin) selection(population, xbin) crossover(population, alfa, nbits) mutation(population, belta, nbits) decode(population, population_real, minBinVal, maxBinVal, nbits) eval_fun(population_real, xbin) return 100.0-max(xbin)

N为个体种群数。

V为自变量个数。

nbits 各个自变量二进制编码的长度。

maxBinVal 各个自变量 上限。

minBinVal 各个自变量 下限。

种群个体 二进制编码 列表 population。种群个体 实数解码  列表 population_real。

alfa=0.9  交叉概率。belta=0.05 变异概率。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:标准遗传算法(实数编码 python实现)模拟二进制交叉SBX 多项式变异(自然数编码的遗传算法)
下一篇:Java SE 面向对象编程的3个常用接口
相关文章

 发表评论

暂时没有评论,来抢沙发吧~