geatpy
geatpy copied to clipboard
在使用《快速入门》文档中,涉及多目标规划那一部分,算法设置完成后,在调用run方法后,为什么返回两个种群,并且后面代码中均出现错误
涉及到的代码demo如下(均是文档中的代码): `# -- coding: utf-8 -- """MyProblem.py""" import numpy as np import geatpy as ea class MyProblem(ea.Problem): # 继承Problem父类 def init(self): name = 'BNH' # 初始化name(函数名称,可以随意设置) M = 2 # 初始化M(目标维数) maxormins = [1] * M # 初始化maxormins Dim = 2 # 初始化Dim(决策变量维数) varTypes = [0] * Dim # 初始化varTypes(决策变量的类型,0:实数;1:整数) lb = [0] * Dim # 决策变量下界 ub = [5, 3] # 决策变量上界 lbin = [1] * Dim # 决策变量下边界 ubin = [1] * Dim # 决策变量上边界 # 调用父类构造方法完成实例化 ea.Problem.init(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin) def aimFunc(self, pop): # 目标函数 Vars = pop.Phen # 得到决策变量矩阵 x1 = Vars[:, [0]] # 注意这样得到的x1是一个列向量,表示所有个体的x1 x2 = Vars[:, [1]] f1 = 4x1**2 + 4x2**2 f2 = (x1 - 5)**2 + (x2 - 5)**2 # 采用可行性法则处理约束 pop.CV = np.hstack([(x1 - 5)2 + x22 - 25, -(x1 - 8)2 - (x2 - 3)2 + 7.7]) # 把求得的目标函数值赋值给种群pop的ObjV pop.ObjV = np.hstack([f1, f2]) def calReferObjV(self): # 计算全局最优解 N = 10000 # 欲得到10000个真实前沿点 x1 = np.linspace(0, 5, N) x2 = x1.copy() x2[x1 >= 3] = 3 return np.vstack((4 * x12 + 4 * x22, (x1 - 5)**2 + (x2 - 5)**2)).T
-- coding: utf-8 --
"""main.py""" import geatpy as ea # import geatpy from MyProblem import MyProblem # 导入自定义问题接口 """=========================实例化问题对象===========================""" problem = MyProblem() # 实例化问题对象 """===========================种群设置==============================""" Encoding = 'RI' # 编码方式 NIND = 100 # 种群规模 Field = ea.crtfld(Encoding, problem.varTypes, problem.ranges, problem.borders) # 创建区域描述器 population = ea.Population(Encoding, Field, NIND) #
实例化种群对象(此时种群还没被真正初始化,仅仅是生成一个种群对象)
"""=========================算法参数设置============================""" myAlgorithm = ea.moea_NSGA2_templet(problem, population,logTras=100) #
实例化一个算法模板对象
myAlgorithm.MAXGEN = 200 # 最大遗传代数 myAlgorithm.drawing = 1 # 设置绘图方式 """===================调用算法模板进行种群进化======================= 调用run执行算法模板,得到帕累托最优解集NDSet。 NDSet是一个种群类Population的对象。 NDSet.ObjV为最优解个体的目标函数值;NDSet.Phen为对应的决策变量值。 详见Population.py中关于种群类的定义。 """ NDSet = myAlgorithm.run() # 执行算法模板,得到非支配种群 NDSet.save() # 把结果保存到文件中
输出
print('用时:%f 秒'%(myAlgorithm.passTime)) print('评价次数:%d 次'%(myAlgorithm.evalsNum)) print('非支配个体数:%d 个'%(NDSet.sizes)) print('单位时间找到帕累托前沿点个数:%d 个'%(int(NDSet.sizes // myAlgorithm.passTime)))
# 计算指标
PF = problem.getReferObjV() # 获取真实前沿
if PF is not None and NDSet.sizes != 0:
GD = ea.indicator.GD(NDSet.ObjV, PF) # 计算GD指标
IGD = ea.indicator.IGD(NDSet.ObjV, PF) # 计算IGD指标
HV = ea.indicator.HV(NDSet.ObjV, PF) # 计算HV指标
Spacing = ea.indicator.Spacing(NDSet.ObjV) # 计算Spacing指标
print('GD: %f'%GD)
print('IGD: %f'%IGD)
print('HV: %f'%HV)
print('Spacing: %f'%Spacing)
"""=====================进化过程指标追踪分析========================"""
if PF is not None:
metricName = [['IGD'], ['HV']]
[NDSet_trace, Metrics] =ea.indicator.moea_tracking(myAlgorithm.pop_trace, PF,
metricName, problem.maxormins)
# 绘制指标追踪分析图
ea.trcplot(Metrics, labels = metricName, titles = metricName)
`
Thank you. Your email is received and will be handled as soon as possible
看情况是你装的版本和代码不一致的问题。