#初始化种群
from random import *
import copy
import random
def population(N,L):
ls=[]
while len(ls)<N:
ls.append([random.randint(0,1) for i in range(20)])
return ls
#二进制到十进制
def decode(n):
n.reverse()
sum=0
for i in range(len(n)):
sum+=int(n[i])*pow(2,i)
# sum+=int(n[len(n)-1-i])*pow(2,i)
result=sum*(10/(pow(2,len(n))-1))
return result
import numpy as np
#求个体适度值(就是将自变量带入函数求出的y值)
def moderaty(x):
# x=int(x)
# print(type(x))
return x+10*np.sin(5*x)+7*np.cos(4*x)
#交叉
def crossover(a1,a2):
a,b=np.random.choice(len(a1),2)
# print(a1,a2)
# print(a,b)
if a<b:
a1_1 = a1[0:a] + a2[a:b-1] + a1[b-1:]
a2_1 = a2[0:a] + a1[a:b-1] + a2[b-1:]
elif a>b:
a1_1 = a1[0:b] + a2[b:a-1] + a1[a-1:]
a2_1 = a2[0:b] + a1[b:a-1] + a2[a-1:]
elif a == b:
a1_1 = a1[0:a] + a2[a:a+1] + a1[b+1:]
a2_1 = a2[0:a] + a1[a:a+1] + a2[b+1:]
return a1_1,a2_1
#变异
def mutate(pop):
a=np.random.choice(len(pop))
if pop[a]==0:
pop_new= pop[0:a] + [1] + pop[a+1:]
else:
pop_new= pop[0:a] + [0] + pop[a+1:]
return pop_new
#排序
def Asort(pop):
for i in range(len(pop)-1):
for j in range(i+1,len(pop)):
# print(i,j)
# print(type(pop[i]))
# print(pop[j])
# print(pop[i])
if moderaty(decode(pop[j]))>moderaty(decode(pop[i])):
pop[i],pop[j]=pop[j],pop[i]
return pop
if __name__=='__main__':
NP=40 #初始化种群数目
L=20 #染色体二进制编码长度
POP=population(NP,L)
# print(POP)
POP_all=copy.deepcopy(POP)
G=100 #最大进化代数(就是最大迭代次数)
Pc=0.8 #交叉概率
Pm=0.1 #变异概率
#交叉
for i in range(G):
for j in range(len(POP)):
# print(i,j)
if np.random.random()<Pc:
if j%2==0:
pop=crossover(POP[j],POP[j+1])
POP_all.append(pop[0])
POP_all.append(pop[1])
else:
pop=crossover(POP[j],POP[j-1])
POP_all.append(pop[0])
POP_all.append(pop[1])
else:
continue
# print('交叉',len(POP_all))
# print(POP_all)
#变异
# POP0=copy.deepcopy(POP_all)
POP_end=copy.deepcopy(POP_all)
for q in range(len(POP_all)):
# print(POP0[q],type(POP0[q]))
if np.random.random()<Pm:
POP_end.append(mutate(POP_all[q]))
# print('变异',len(POP_all))
# for e in range(len(POP_end)):
# POP_end[e]=decode(POP_end[e])
# print(POP_end)
POP_end=Asort(POP_end)
# print(POP_end)
POP=POP_end[0:40]
# for r in range(len(POP)):
# POP[r]=decode0(POP[r])
POP_all=copy.deepcopy(POP)
# print(POP)
for i in range(len(POP)):
print(decode(POP[i]))
print(moderaty(decode(POP[i])))
import matplotlib.pyplot as plt
x=np.linspace(0,10,10000)
y=moderaty(x)
scatter_x = np.array([decode(POP[0])])
scatter_y = np.array([moderaty(decode(POP[0]))])
plt.plot(x,y)
plt.scatter(scatter_x, scatter_y, c='r')
plt.show()
python遗传算法求解一元一次函数极值
最新推荐文章于 2024-01-27 21:26:33 发布
本文详细介绍了如何运用遗传算法来求解一元一次函数的极值问题,通过Python实现遗传算法的编码、交叉、变异等操作,有效搜索函数最优解。

1425

被折叠的 条评论
为什么被折叠?



