geatpy icon indicating copy to clipboard operation
geatpy copied to clipboard

在使用《快速入门》文档中,涉及多目标规划那一部分,算法设置完成后,在调用run方法后,为什么返回两个种群,并且后面代码中均出现错误

Open zhaozhao626 opened this issue 1 year ago • 2 comments

涉及到的代码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) ` image

zhaozhao626 avatar Sep 03 '22 01:09 zhaozhao626

Thank you. Your email is received and will be handled as soon as possible

zeroraiser avatar Sep 03 '22 01:09 zeroraiser

看情况是你装的版本和代码不一致的问题。

geatpy-dev avatar Sep 03 '22 12:09 geatpy-dev