遗传算法
用遗传算法求解
f(x)=10xsin(2x)+20xcos(3x)
在区间
import numpy as np
import math
import random
#判定需要多少二进制位数
def DeciBina(spacinte,accu):
ls = int(spacinte/accu)
lenth_min = 0
lenth_max = 100
while (lenth_min < lenth_max-1):
mid = math.ceil((lenth_min+lenth_max)/2)
if math.pow(2,mid)>ls:
lenth_max = mid
if math.pow(2,mid)<ls:
lenth_min = mid
if math.pow(2,mid)==ls:
return mid
return lenth_max
#生成候选群体
def genegroup(gpnum,lenth):
pop = [[]]
for i in range(gpnum):
temp = []
for j in range(lenth):
temp.append(random.randint(0, 1))
pop.append(temp)
return pop[1:]
#评价、适应度、选择
def calobjvalue(pop,lenth):
popnum=len(pop)
popvalue = []
for i in range(popnum):
t = 0
for j in range(len(pop[i])):
t+=pop[i][j]*math.pow(2,j)
t1 = -1 + t*3/math.pow(2,lenth)
popvalue.append(10*t1*math.sin(2*t1)+20*t1*math.cos(3*t1))
return popvalue
def calfitvalue(popvalue,c_min):
num = len(popvalue)
group_fit = []
for i in range(num):
if popvalue[i] <= c_min:
group_fit.append(c_min)
else:
group_fit.append(popvalue[i])
return group_fit
#选择与繁殖,
#计算累积比率、生成随机数、累计比率和随机数列比较、得到新的群体
def sum(group_fit):
sumrate = []
total = 0
for i in range(len(group_fit)):
total += group_fit[i]
total1 = 0
for j in range(len(group_fit)):
total1+=group_fit[j]
rate = total1/total
sumrate.append(rate)
return sumrate
def best(pop,group_fit):
max_fit = 0
individual = []
best_index = 0
for i in range(len(pop)):
if group_fit[i]>max_fit:
max_fit = group_fit[i]
best_index = i
individual = pop[best_index]
return individual,max_fit
def chsegrop(pop,group_fit):
sumrate = sum(group_fit)
pop_len = len(pop)
ms = []
for i in range(pop_len):
ms.append(random.random())
ms.sort()
msindex = 0
fitindex = 0
popnew = [[]]
for i in range(pop_len):
if sumrate[i]>=ms[i]:
fitindex = i
popnew.append(pop[fitindex])
return popnew[1:]
#是否交换,以及交换的位置
def crossover(popnew,js):
pop_len = len(popnew)
pop = popnew
for i in range(pop_len-1):
if random.random()<js:
temp1 = []
temp2 = []
cpoint = random.randint(0,len(popnew[i]))
temp1.extend(popnew[i][0:cpoint])
temp1.extend(popnew[i+1][cpoint:len(popnew[i+1])])
temp2.extend(popnew[i+1][0:cpoint])
temp2.extend(popnew[i][cpoint:len(popnew[i])])
pop[i] = temp1
pop[i+1] = temp2
return pop
#是否变异,以及变异的位置
def mutation(pop,bs):
py = len(pop[1])
for i in range(len(pop)):
if random.random()<bs:
print('i:%s'%i)
cpoint = random.randint(0,py-1)
print('**%s**'%len(pop[i]))
print('88-%s-88'%len(pop))
print('cpoint=%s'%cpoint)
if pop[i][cpoint]==1:
pop[i][cpoint]=0
else:
pop[i][cpoint]=1
return pop
def main():
#启发式,评价,交叉,变异
lenth = DeciBina(3,0.01)
pop = genegroup(500,lenth)
result = []
episode = 0
while episode<500:
print(episode)
popvalue = calobjvalue(pop, lenth)
group_fit = calfitvalue(popvalue, 0.1)
individual, max_fit = best(pop, group_fit)
pop = chsegrop(pop, group_fit)
print(len(pop))
pop = crossover(pop, 0.3)
print(len(pop))
pop = mutation(pop, 0.25)
print(len(pop))
episode+=1
print(individual)
print(max_fit)
main()