遗传算法 GA—模拟自然界遗传机制和生物进化论而成的一种并行随机搜索最优化方法。它的过程分为种群初始化、计算适应度、交叉、变异,然后进行多代的迭代后得到比较好的个体。
下面是我的参考代码。
首先导入必要的库:
import numpy as np
import matplotlib.pyplot as plt
import openpyxl as xl
import pandas as pd
import random
import math
一些必要的参数:
N=100 #种群大小
Gmax=2000 #最大迭代数
all_max=0 #最优值
pm=0.02
pc=0.7
def f(x1,x2): #适应度函数
return 21.5+x1*math.sin(4*math.pi*x1)+x2*math.sin(20*math.pi*x2)
种群初始化,可以看到比较简单,只需要几句代码:
A=[]
for i in range(0,N):
A.append([random.uniform(-3, 12.1),random.uniform(4.1, 5.8)])
计算适应度,轮盘赌那里用了矩阵的where函数,比较方便:
fitness=[]
for i in range(0,N): #计算
fitness.append(f(A[i][0],A[i][1]))
fit=np.array(fitness)
ans = sum(fit)
Max_now=max(fit) #获得最大值
if Max_now>all_max:
all_max=Max_now
s=0
for i in range(0,N): #计算轮盘赌的权值
s=fit[i]/ans+s
fit[i]=s
A2=[]
for i in range(0,N): #进行轮盘赌,获得下一代
n=random.uniform(0, 1)
which=np.where(fit >n )[0][0]
A2.append(A[which])#获得下一代
交叉操作:
mating=np.random.rand(N)
select=np.where(mating<=pc)#获得能交配的下标
i=0
while i<len(select[0]): #这里是交配的过程
digit= random.randint(0, 1)
if i+1<len(select[0]):
A2[select[0][i]][digit:],A2[select[0][i+1]][digit:]=A2[select[0][i+1]][digit:],A2[select[0][i]][digit:] #互换
i=i+2
最后的变异操作;
for a in A2:
variation=np.random.rand(2)
if variation[0]<=pm:
a[0]=random.uniform(-3, 12.1)
if variation[1]<=pm:
a[1]=random.uniform(4.1, 5.8)
至此代码部分已经完毕,看看其运行结果。x轴是迭代代数,y轴是得到的最优解。
最终的运行结果如图所示,可以发现其具有比较突兀的增长,而且最终的结果也并不靠近最具最优解。还需要继续改进。