代码
求解问题:
max = x+10sin(5x)+7cos(4x)
0<=x<=10
import numpy as np
import geatpy as ga
import time
def aimfunc(Phen, LegV):
x = np.array([Phen[:,0]]).T #取第一列解码后的值,即变量1的解码值
f = x + 10*np.sin(5*x) + 7*np.cos(4*x)
return [f,LegV]
x=[0,10]
b=[1,1]
ranges=np.vstack([x]).T #变量范围,两行,第一行下界,第二行上界
border=np.vstack([b]).T #变量是否包含边界,两行,第一行下界,第二行上界
precesion=[4] #精度,小数点后6位
codes=[0] #编码方式,标准二进制编码
scales=[0] #刻度,算数刻度
NIND=50 # 种群规模
MAXGEN=100 # 最大遗传代数
GGAP=0.5 # 代沟,子代与父代个体不相同的概率为0.5
selectStyle='rws' # 轮盘赌选
recombinStyle='xovsp' # 单点杂交
recopt=0.65 # 交叉概率
pm=0.05 # 变异概率
SUBPOP=1 # 设置种群数为1,即保持不变
maxormin=-1 # 设置最大最小化目标,1表示是最小化目标,-1则表示最大化目标
FieldD=ga.crtfld(ranges,border,precesion,codes,scales) #区域描述器,第一行是各变量的编码长度,生成处理后的变量范围
#区域描述器返回的最后四行的含义,分别是编码方式、刻度、是否包含下边界、是否包含上边界
#区域描述器返回的第一行的含义,变量的编码长度
Lind=np.sum(FieldD[0,:]) #计算编码后染色体的长度
Chrom=ga.crtbp(NIND,Lind) #生成二进制种群
Phen=ga.bs2rv(Chrom,FieldD) #根据区域描述器解码
LegV=np.ones((NIND,1)) #初始化可行性解向量
[ObjV,LegV]=aimfunc(Phen, LegV) #计算初始种群的目标值,解的可行性
pop_trace=(np.zeros((MAXGEN,2))*np.nan) #进化记录器,初始值为nan
ind_trace=(np.zeros((MAXGEN,Lind))*np.nan) #最优个体记录器,记录每一代最优个体染色体,初始值nan
start_time = time.time()
for gen in range(MAXGEN):
FitnV = ga.ranking(maxormin * ObjV, LegV) # 根据目标函数大小分配适应度值
SelCh=ga.selecting(selectStyle, Chrom, FitnV, GGAP, SUBPOP) # 选择
SelCh=ga.recombin(recombinStyle, SelCh, recopt, SUBPOP) # 交叉
SelCh=ga.mutbin(SelCh, pm) # 二进制种群变异
Phen = ga.bs2rv(SelCh, FieldD) # 对育种种群进行解码(二进制转十进制)
LegVSel = np.ones((SelCh.shape[0], 1)) # 初始化育种种群的可行性列向量
[ObjVSel,LegVSel] = aimfunc(Phen, LegVSel) # 求育种个体的目标函数值
[Chrom,ObjV,LegV] = ga.reins(Chrom,SelCh,SUBPOP,1,1,maxormin*ObjV,maxormin*ObjVSel
,ObjV,ObjVSel,LegV,LegVSel) # 重插入得到新一代种群
pop_trace[gen, 1] = np.sum(ObjV) / ObjV.shape[0] # 记录当代种群的目标函数均值
if maxormin == 1:
best_ind = np.argmin(ObjV) # 计算当代最优个体的序号
elif maxormin == -1:
best_ind = np.argmax(ObjV)
pop_trace[gen, 0] = ObjV[best_ind] # 记录当代种群最优个体目标函数值
ind_trace[gen, :] = Chrom[best_ind, :] # 记录当代种群最优个体的变量值
end_time = time.time()
ga.trcplot(pop_trace, [['最优个体目标函数值','种群的目标函数均值']], ['简单遗传算法'])
best_gen = np.argmax(pop_trace[:, 0]) # 计算最优种群是在哪一代
print('最优的目标函数值为:', np.max(pop_trace[:, 0]))
print('最优的控制变量值为:')
variables = ga.bs2rv(ind_trace, FieldD)
for i in range(variables.shape[1]):
print(variables[best_gen, i])
print('最优的一代是第',best_gen + 1,'代')
print('用时:', end_time - start_time, '秒')
结果