遗传算法python实现求最大值_标准遗传算法(二进制编码 python实现)

代码地址:https://github.com/guojun007/binary_sga

种群初始化:

#种群初始化函数

defpopulation_init(population, N, V, nbits):#自变量个数V并没有用到

delpopulation[:]for i inxrange(N):

tempIndividual=[]for j innbits:

tempVal=[]for k inxrange(j):

tempVal.append(random.randint(0,1))

tempIndividual.append(tempVal)

population.append(tempIndividual)

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

#!/usr/bin/env python#encoding:UTF-8

importcopyimportrandom#轮盘赌选择法

defselection(population, xbin):

s=sum(xbin)

temp=[k*1.0/s for k inxbin]

temp2=[]

s2=0for k intemp:

s2=s2+k

temp2.append(s2)

temp3=[]for _ inxrange(len(population)):

r=random.random()for i inxrange(len(temp2)):if r<=temp2[i]:

temp3.append(i)breaktemp4=[]

temp5=[]for i intemp3:

temp4.append(copy.deepcopy(population[i]))

temp5.append(xbin[i])

population[:]=temp4

xbin[:]=temp5

交叉操作:(单点交叉)

#二进制编码,单点交叉

defcrossover(population, alfa, nbits):for i in xrange(len(population), 2):for j inxrange(len(nbits)):

r=random.random()if r

p=random.randint(1, nbits[j]-1)

population[i][j][p:], population[i+1][j][p:]=population[i+1][j][p:], population[i][j][p:]

变异操作:

defmutation(population, belta, nbits):for i inxrange(len(population)):for j inxrange(len(nbits)):for k inxrange(nbits[j]):

r=random.random()if r

population[i][j][k]^=1

二进制个体解码操作:

#种群个体解码

defdecode(population, population_real, minBinVal, maxBinVal, nbits):delpopulation_real[:]definer(valList):

L=len(valList)

s=0for i invalList:

s=s+i*(2**(L-1))

L=L-1

returnsfor i inpopulation:

temp=[]for j ini:

temp.append(iner(j))for j inxrange(len(temp)):

temp[j]=temp[j]*(maxBinVal[j]-minBinVal[j])*1.0/(2**(nbits[j])-1)+minBinVal[j]

population_real.append(temp)

测试函数部分:

#对偶问题, 转化为求最大值#二维 Rastrigin测试函数

defobject_fun(p):importmath

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"""

主函数部分:

N=200V=2nbits=(17, 17)

maxBinVal=(-5, -5)

minBinVal=(5, 5)

population=[]

population_real=[]

alfa=0.9belta=0.05

#目标函数值列表

xbin=[]defper_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 变异概率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值