遗传算法python代码,采用二进制编码方法,利用遗传算法求函数
代码地址:https://github。com/郭俊007/binary _ SGA
种群初始化:
二进制_ SGA/人口_初始化/人口_初始化。巴拉圭
#种群初始化函数
def population_init(population,N,V,nbits):
#自变量个数V并没有用到
倒三角形人口[:]
对于xrange(N)中的我:
tempIndividual=[]
对于n位中的j:
tempVal=[]
对于xrange(j)中的k:
坦普瓦尔。追加(随机。randint(0,1))
temp personal . append(临时值)
population.append(临时个体)
选择操作:(轮盘赌选择)
二进制_ SGA/选择/选择。巴拉圭
#!/usr/bin/env python
#编码:UTF-8
导入副本
随机导入
#轮盘赌选择法
定义选择(人口,xbin):
s=总和(xbin)
温度=[k * 1.0/秒,用于系统的一些可执行文件中的k]
temp2=[]
s2=0
对于k in temp:
s2=s2 k
temp2.append(s2)
temp3=[]
for _ in xrange(len(population)):
r=random.random()
对于xrange(len(temp2))中的我:
如果r=temp2[i]:
temp3.append(i)
破裂
temp4=[]
temp5=[]
对于温度3中的我:
温度4。追加(复制。deepcopy(population[I])
temp5.append(xbin[i])
人口[:]=临时四
xbin[:]=温度5
交叉操作:(单点交叉)
二元_ SGA/交叉/交叉。巴拉圭
#二进制编码,单点交叉
极好的交叉(人口、阿尔法、nbits):
对于润智中的我(len(人口),2):
对于润智中的j(len(nbits)):
r=random.random()
如果r:
p=random.randint(1,nbits[j]-1)
人口[i][j][p:],人口[i 1][j][p:]=人口[I 1][j][p:],人口[i][j][p:]
变异操作:
二进制_ SGA/突变/变异。巴拉圭
极好的突变(人口、belta、nbits):
对于润智中的我(len(人口)):
对于润智中的j(len(nbits)):
对于xrange(nbits[j])中的k:
r=random.random()
如果r贝尔塔:
population[i][j][k]^=1
二进制个体解码操作:
binary_sga/decode /decode.py
#种群个体解码
def decode(population,population_real,minBinVal,maxBinVal,nbits):
倒三角形人口_实际[:]
def iner(valList):
L=len(valList)
s=0
对于我在valList:
s=s i*(2**(L-1))
L=L-1
返回s
对于人口中的我:
temp=[]
对于我中的j:
临时追加(iner(j))
对于润智中的j(长度(温度)):
temp[j]=temp[j]*(maxBinVal[j]-minBinVal[j])* 1.0/(2 * *(nbits[j])-1)minBinVal[j]
人口_真实。追加(临时)
测试函数部分:
二进制_ SGA/函数/对象_乐趣。巴拉圭
#对偶问题,转化为求最大值
#二维拉斯特里金测试函数
def object_fun(p):
导入数学
x=p[0]
y=p[1]
object _ value=20.0 x * * 2y * * 2-10.0 *(数学。cos(2 *数学。pi * x)数学。cos(2 *数学。pi * y))
返回100.0-对象值
#求最大值,无需转化
#二维谢弗测试函数
def object_fun(p):
导入数学
x=p[0]
y=p[1]
object _ value=0.5-((数学。罪恶(数学。sqrt(x * * 2y * * 2)))* * 2-0.5)/(1 0.001 *(x * * 2y * * 2))* * 2
返回对象值
主函数部分:
binary_sga /sga.py
N=200
V=2
nbits=(17,17)
maxBinVal=(-5,-5)
minBinVal=(5,5)
人口=[]
population_real=[]
阿尔法=0.9
贝尔塔=0.05
#目标函数值列表
xbin=[]
定义per_run():
人口初始化(人口N、V、nbits)
对于xrange(200)中的我:
decode(population,population_real,minBinVal,maxBinVal,nbits)
eval(population_real,xbin)
选择(群体,xbin)
交叉(人口、阿尔法、国家比特)
突变(人口、belta、nbits)
decode(population,population_real,minBinVal,maxBinVal,nbits)
eval(population_real,xbin)
返回100.0-最大值(xbin)N为个体种群数。
V为自变量个数。
nbits各个自变量二进制编码的长度。
maxBinVal各个自变量上限明宾瓦尔各个自变量下限。种群个体二进制编码列表人口。
种群个体实数解码列表真实人口。阿尔法=0.9交叉概率。
贝尔塔=0.05变异概率。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。