# -*- coding: utf-8 -*- import geatpy as ea # import geatpy import numpy as np """==================================实例化问题对象================================""" problemName = 'Sphere' # 问题名称 fileName = problemName # 这里因为目标函数写在与之同名的文件里,所以文件名也是问题名称 MyProblem = getattr(__import__(fileName), problemName) # 获得自定义问题类 problem = MyProblem(30) # 生成问题对象 """==================================种群设置================================""" Encoding = 'RI' # 编码方式 conordis = 0 # 表示染色体解码后得到的变量是连续的 NIND = 20 # 种群规模 precisions = [50] * problem.Dim # 编码精度(适用于二进制/格雷编码) Field = ea.crtfld(Encoding, problem.varTypes, problem.ranges, problem.borders, precisions) # 创建区域描述器 population = ea.Population(Encoding, Field, NIND) # 实例化种群对象(此时种群还没被初始化,仅仅是完成种群对象的实例化) """==================================算法参数设置================================""" myAlgorithm = ea.soea_DE_rand_1_bin_templet(problem, population) # 实例化一个算法模板对象 myAlgorithm.MAXGEN = 1000 # 最大进化代数 myAlgorithm.F = 0.5 myAlgorithm.pc = 0.2 myAlgorithm.drawing = 1 # 设置绘图方式(0:不绘图;1:绘制结果图;2:绘制过程动画) """=======================调用算法模板进行种群进化==============================""" [population, obj_trace, var_trace] = myAlgorithm.run() # 执行算法模板,得到最后一代种群以及进化记录器 population.save() # 把最后一代种群的信息保存到文件中 # 输出结果 best_gen = np.argmin(obj_trace[:, 1]) # 记录最优种群是在哪一代 best_ObjV = np.min(obj_trace[:, 1]) print('最优的目标函数值为:%s'%(best_ObjV)) print('最优的控制变量值为:') for i in range(var_trace.shape[1]):
# f2[exIdx] = f2[exIdx] + np.max(f2) - np.min(f2) # 利用可行性法则处理约束条件 CV = np.hstack([ 2 - x1 - x2, x1 + x2 - 6, -2 - x1 + x2, x1 - 3 * x2 - 2, (x3 - 3)**2 + x4 - 4, 4 - (x5 - 3)**2 - x4 ]) return np.hstack([f1, f2]), CV def calBest(self): realBestObjV = None return realBestObjV problem = MyProblem() # 生成问题对象 """==================================种群设置================================""" Encoding = 'I' # 编码方式 conordis = 1 # 表示染色体解码后得到的变量是离散的 NIND = 50 # 种群规模 Field = ea.crtfld(Encoding, conordis, problem.ranges, problem.borders) # 创建区域描述器 population = ea.Population(Encoding, conordis, Field, NIND) # 实例化种群对象(此时种群还没被真正初始化) """==================================算法参数设置================================""" myAlgorithm = ea.moea_NSGA2_templet(problem, population) # 实例化一个算法模板对象 myAlgorithm.MAXGEN = 200 # 最大遗传代数 """=======================调用算法模板进行种群进化==============================""" NDSet = myAlgorithm.run() # 执行算法模板,得到帕累托最优解集NDSet # 输出 print('用时:%s 秒' % (myAlgorithm.passTime)) print('非支配个体数:%s 个' % (NDSet.sizes)) print('单位时间找到帕累托前沿点个数:%s 个' % (int(NDSet.sizes // myAlgorithm.passTime)))
import geatpy as ea # import geatpy """ 描述: 该案例是moea_demo1的另一个版本,展示了如何定义aimFunc()而不是evalVars()来计算目标函数和违反约束程度值。【见MyProblem.py】 同时展示如何定义outFunc(),用于让算法在每一次进化时调用该outFunc()函数。 """ if __name__ == '__main__': # 实例化问题对象 problem = MyProblem() # 定义outFunc()函数 def outFunc(alg, pop): # alg 和 pop为outFunc的固定输入参数,分别为算法对象和每次迭代的种群对象。 print('第 %d 代' % alg.currentGen) # 构建算法 algorithm = ea.moea_NSGA2_templet( problem, ea.Population(Encoding='RI', NIND=50), MAXGEN=200, # 最大进化代数 logTras=1, # 表示每隔多少代记录一次日志信息,0表示不记录。 outFunc=outFunc) # 求解 res = ea.optimize(algorithm, verbose=False, drawing=1, outputMsg=True, drawLog=True, saveFlag=False) print(res)
kpPole, kiPole, kdPole = Vars[i, [3]], Vars[i, [4]], Vars[i, [5]] pidController = cartPoleController(kpCart, kiCart, kdCart, kpPole, kiPole, kdPole) cartPole.run(pidController) objValues[i] = cartPole.reward() # 将目标函数值赋值给pop的ObjV属性 pop.ObjV = objValues cartPole = plant(200) problem = optimizePID() # 种群设置 Encoding = 'RI' # 格雷码 NIND = 30 # 种群数量 Field = ea.crtfld(Encoding, problem.varTypes, problem.ranges, problem.borders) population = ea.Population(Encoding, Field, NIND) #算法参数设置 myAlgorithm = ea.soea_SEGA_templet(problem, population) myAlgorithm.MAXGEN = 30 # 最大遗传代数 myAlgorithm.mutOper.F = 0.5 # 设置差分进化的变异缩放因子 myAlgorithm.recOper.XOVR = 0.5 # 设置交叉概率 myAlgorithm.drawing = 1 # 绘图方式 [population, obj_trace, var_trace] = myAlgorithm.run() # 执行优化算法 cartPole.close() best_gen = np.argmin(obj_trace[:, 1]) # 找出最优种群 best_ObjV = obj_trace[best_gen, 1] print('最优的目标函数值为:%s' % (best_ObjV)) bestSolution = [] for i in range(var_trace.shape[1]): bestSolution.append(var_trace[best_gen, i])
def __init__(self, X, y, target, model, l, u, drawing=1, maxgen=100, moea=1): '''===============================实例化问题对象==================================''' self.problem = MyProblem(target=target, X=X, y=y, model=model, l=l, u=u) '''===========================种群设置==============================''' Encoding = 'RI' # 'RI':实整数编码,即实数和整数的混合编码; NIND = 100 # 种群规模 Field = ea.crtfld(Encoding, self.problem.varTypes, self.problem.ranges, self.problem.borders) # 创建区域描述器 self.population = ea.Population(Encoding, Field, NIND) '''实例化种群对象(此时种群还没被真正初始化,仅仅是生成一个种群对象)''' """=========================算法参数设置============================""" if moea == 1: self.myAlgorithm = ea.moea_NSGA2_templet( self.problem, self.population) # 实例化一个算法模板对象 elif moea == 2: self.myAlgorithm = ea.moea_NSGA2_DE_templet( self.problem, self.population) elif moea == 3: self.myAlgorithm = moea_NSGA2_toZero(self.problem, self.population) elif moea == 4: self.myAlgorithm = moea_NSGA2_DE_toZero(self.problem, self.population) elif moea == 5: self.myAlgorithm = ea.moea_NSGA3_templet(self.problem, self.population) elif moea == 6: self.myAlgorithm = ea.moea_NSGA3_DE_templet( self.problem, self.population) elif moea == 7: self.myAlgorithm = ea.moea_awGA_templet(self.problem, self.population) elif moea == 8: self.myAlgorithm = ea.moea_RVEA_templet(self.problem, self.population) elif moea == 9: self.myAlgorithm = moea_NSGA2_10p_toZero(self.problem, self.population) elif moea == 10: self.myAlgorithm = moea_NSGA2_20p_toZero(self.problem, self.population) elif moea == 11: self.myAlgorithm = moea_NSGA2_30p_toZero(self.problem, self.population) elif moea == 12: self.myAlgorithm = moea_NSGA2_random10p_toZero( self.problem, self.population) elif moea == 13: self.myAlgorithm = moea_NSGA2_random20p_toZero( self.problem, self.population) elif moea == 14: self.myAlgorithm = moea_NSGA2_random30p_toZero( self.problem, self.population) else: print('error moea method!!') self.myAlgorithm.MAXGEN = maxgen # 设置最大遗传代数 self.myAlgorithm.drawing = drawing