geatpy脚本编程

代码

求解问题:
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, '秒')


结果

1
2

猜你喜欢

转载自blog.csdn.net/weixin_40775077/article/details/84405481