geatpy icon indicating copy to clipboard operation
geatpy copied to clipboard

老师您好,我想请问一下为什么连续决策变量的多目标约束规划问题求解结果中,等式约束的条件都没有满足?约束已经放宽约束处理了,如代码所示,原本应该x1+x2=18,x3+x4=x2,但结果并不满足,有什么好的解决方法吗?

Open mercycrybetty opened this issue 1 year ago • 4 comments

import numpy as np import geatpy as ea np.set_printoptions(suppress=True) # 取消科学计数法 """ 问题类定义 """ class MyProblem(ea.Problem): # 继承Problem父类 def init(self): name = 'MyProblem' # 初始化name(函数名称,可以随意设置) M = 2 # 初始化M(目标维数) maxormins = [1,-1] # 初始化maxormins(目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标) Dim = 7 # 初始化Dim(决策变量维数) varTypes = [1] * Dim # 初始化varTypes(决策变量的类型,元素为0表示对应的变量是连续的;1表示是离散的) lb = [0]* Dim # 决策变量下界 ub = [18,18,18,18,100,100,15] # 决策变量上界 lbin = [1] * Dim # 决策变量下边界 ubin = [1] * Dim # 决策变量上边界 # 调用父类构造方法完成实例化 ea.Problem.init(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin) def aimFunc(self, pop): # 目标函数 x1 = pop.Phen[:, [0]] x2 = pop.Phen[:, [1]] x3 = pop.Phen[:, [2]] x4 = pop.Phen[:, [3]] x5 = pop.Phen[:, [4]] x6 = pop.Phen[:, [5]] x7 = pop.Phen[:, [6]] CV = np.hstack([(x7-7-3x6-x2), x7-2-5x3+x6, x7-3x4-3x6, np.abs(x4 + x3 -x2)-1e-3, np.abs(x1 + x2 - 18)-1e-3]) pop.ObjV = np.zeros((pop.Phen.shape[0], self.M)) pop.ObjV[:,[0]] = 16x1 + 7x2 + x22 + 2x3 + 5x32 + 3x4**2 pop.ObjV[:,[1]] = 20x1-x5*x1 return pop.ObjV,CV """ 执行脚本 """ if name == 'main': problem = MyProblem() # 生成问题对象 # 构建算法 algorithm = ea.moea_NSGA2_templet(problem, ea.Population(Encoding='RI', NIND=1000), MAXGEN=100, # 最大进化代数。 logTras=0) # 表示每隔多少代记录一次日志信息,0表示不记录。 # 求解 res = ea.optimize(algorithm, verbose=False, drawing=1, outputMsg=True, drawLog=False, saveFlag=False, dirName='result') print(res)

#------------------------------------------main------------------------------------------ from Case111 import MyProblem # 导入自定义问题接口

import geatpy as ea # import geatpy

if name == 'main': # 实例化问题对象 problem = MyProblem() # 构建算法 algorithm = ea.moea_NSGA2_templet( problem, ea.Population(Encoding='BG', NIND=10), MAXGEN=200, # 最大进化代数 logTras=0) # 表示每隔多少代记录一次日志信息,0表示不记录。 algorithm.mutOper.Pm = 0.25 # 修改变异算子的变异概率 algorithm.recOper.XOVR = 0.8 # 修改交叉算子的交叉概率 # 求解 res = ea.optimize(algorithm, verbose=True, drawing=1, outputMsg=True, drawLog=False, saveFlag=False) print(res)

mercycrybetty avatar Mar 15 '23 08:03 mercycrybetty