遗传算法python程序_遗传算法+Python代码

算法原理

to-do

Python代码

# -- coding: utf-8 --

import numpy as np

import math

def solve_p(domain):

N = 20

domain = np.asarray(domain)

temp = max(np.max(abs(domain),axis=0))

p = (len(bin(temp))-2)*N

return p

def randInit(p,num,paraNum):

'''随机生成随机数'''

xSum = [None]*paraNum

for i in range(paraNum):

x = [None]*num

for j in range(num):

temp = np.random.randint(0,2,p)

x[j] = ''.join(str(temp[j]) for j in range(p))

xSum[i] = x

return xSum

def bin2dec(p,b,num,paraNum):

maxNumBin = '1'*p

maxNumDec = int(maxNumBin,2)

d = [None]*paraNum

for i in range(paraNum):

temp = [None]*num

for j in range(num):

temp[j] = int(b[i][j],2)/maxNumDec

d[i] = temp

return d

def values(p,x,func,num,paraNum):

x = bin2dec(p,x,num,paraNum) #转换为十进制

v = [None]*num

for j in range(num):

temp = [None]*paraNum

for i in range(paraNum):

temp[i] = x[i][j]

v[j] = func(temp)

return v

def func(t):

y = -20*math.exp(-0.2*math.sqrt(0.5*(t[0]**2+t[1]**2)))-math.exp(0.5*(math.cos(2*math.pi*t[0])+math.cos(2*math.pi*t[1])))+22.71282

# y = t[0]**2+t[1]**2

return y

def copy(x,v,num,paraNum):

#轮盘赌算法

v = np.asarray(v)/sum(v)

cumV = [0]*num

for i in range(num):

cumV[i] = cumV[i-1] + v[i]

someList = [y for y in range(num)]

n = [0]*num

for i in range(num):

temp = np.random.random()

for j in range(num):

if temp < cumV[j]:

n[j] += 1

break

#生成复制

x2 = [None]*paraNum

for i in range(paraNum):

temp = [None]*num

for j in range(num):

temp[j] = x[i][j]

x2[i] = temp

return x2

def cross(x2,num,paraNum):

x3 = [None]*paraNum

flag = np.random.randint(0,num)

s = np.random.permutation(num) #partnership

for i in range(paraNum):

temp = [None]*num

for j in range(0,num-1,2):

temp[s[j]],temp[s[j+1]] = x2[i][s[j]][:flag]+x2[i][s[j+1]][flag:],x2[i][s[j+1]][:flag]+x2[i][s[j]][flag:]

for k in range(j+1,num):

temp[s[k]] = x2[i][s[k]]

x3[i] = temp

return x3

def heter(x3,p,pro,num,paraNum):

x4 = [None]*paraNum

for i in range(paraNum):

temp2 = [None]*num

for j in range(num):

temp = list(x3[i][j])

for k in range(p):

if np.random.random() < pro:

temp[k] = str((int(temp[k])+1)%2)

temp2[j] = ''.join(temp)

x4[i] = temp2

return x4

def dieOut(x5,v2,num,paraNum):

vS = list(enumerate(v2))

def takeSecond(elem):

return elem[1]

vS.sort(key=takeSecond,reverse=True)

xNext = [None]*paraNum

for i in range(paraNum):

temp = [None]*num

for j in range(num):

temp[j] = x[i][vS[j][0]]

xNext[i] = temp

return xNext

def out(p,x,num,paraNum):

print('最优取值为:',end='')

temp = [None]*paraNum

for i in range(paraNum):

temp[i] = bin2dec(p,x[i][0],1,1)

print(temp)

for j in range(paraNum):

for i in range(paraNum):

temp[i] = temp[i][0]

print('最优解为',func(temp))

num = 50 #种群个数

paraNum = 2 #变量个数

domain = [[-5,5],[-5,5]] #定义域

p = solve_p(domain)

x = randInit(p,num,paraNum)

iterTimes = 50

for i in range(iterTimes):

v = values(p,x,func,num,paraNum)

x2 = copy(x,v,num,paraNum)

x3 = cross(x2,num,paraNum)

x4 = heter(x3,p,0.001,num,paraNum)

v2 = values(p,x4,func,num,paraNum)

x5 = x+x4

x = dieOut(x5,v2,num,paraNum)

out(p,x,num,paraNum)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值