geatpy icon indicating copy to clipboard operation
geatpy copied to clipboard

geatpy当目标函数个数和决策变量较多时的报错:OverflowError: integer division result too large for a float

Open xfby2016 opened this issue 1 year ago • 3 comments

目标变量201个、决策变量1077个;代码如下: 问题定义:

class ppproblem(ea.Problem): # 继承Problem父类 def init(self,marklist,marklist_iddata_dict): name = 'Trinasolar—power-predict-stage2-v2' # 初始化name(函数名称,可以随意设置) M = 3*len(marklist_iddata_dict) #优化目标个数 maxormins = [1,1,1]len(marklist_iddata_dict) # (目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标) Dim = 16len(marklist_iddata_dict) # 初始化Dim(决策变量维数)def dim(a,b,c) varTypes = [0] * Dim # 初始化varTypes(决策变量的类型,元素为0表示对应的变量是连续的;1表示是离散的) lb = [0] * Dim # 决策变量下界 ub = [1] * Dim # 决策变量上界 lbin = [1] * Dim # 决策变量下边界(0表示不包含该变量的下边界,1表示包含) ubin = [1] * Dim # 决策变量上边界(0表示不包含该变量的上边界,1表示包含) # 调用父类构造方法完成实例化 ea.Problem.init(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin)

参数设置:

import geatpy as ea # import geatpy def ppomain(marklist,marklist_iddata_dict): # 实例化问题对象 problem = ppproblem(marklist,marklist_iddata_dict) # 构建算法 algorithm = ea.moea_NSGA3_DE_templet( problem, ea.Population(Encoding='RI', NIND=300), MAXGEN=500, # 最大进化代数 logTras=2,niche=3,nichep=2) # 表示每隔多少代记录一次日志信息,0表示不记录。 # 求解 res = ea.optimize(algorithm, verbose=False, drawing=2, outputMsg=True, drawLog=False, saveFlag=False)

报错: File "D:\Anaconda\envs\pyn\lib\site-packages\geatpy\algorithms\moeas\nsga3\moea_NSGA3_DE_templet.py", line 81, in run uniformPoint, NIND = ea.crtup(self.problem.M, population.sizes) # 生成在单位目标维度上均匀分布的参考点集 File "core\crtup.py", line 85, in crtup.crtup OverflowError: integer division result too large for a float

是NIND设置的太大吗?但是小于目标函数个数的时候抛出: uniformPoint, NIND = ea.crtup(self.problem.M, population.sizes) # 生成在单位目标维度上均匀分布的参考点集 File "core\crtup.py", line 79, in crtup.crtup RuntimeError: error in crtup: The number of expected points must not be smaller than the dimension. (期望得到的点集大小不能小于空间的维数。)

xfby2016 avatar Mar 06 '23 09:03 xfby2016