import geatpy as ea
import numpy as np
class MyProblem(ea.Problem): # 继承Problem父类
def __init__(self):
name = 'NSGA2算法' # 初始化name(函数名称,可以随意设置)
M = 2 # 优化目标个数(两个x)
maxormins = [1] * M # 初始化maxormins(目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标)
Dim = 1 # 初始化Dim(决策变量维数)
varTypes = [0] # 初始化varTypes(决策变量的类型,0:实数;1:整数)
lb = [-10] # 决策变量下界(自定义个上下界搜索)
ub = [10] # 决策变量上界
lbin = [1] # 决策变量下边界(0表示不包含该变量的下边界,1表示包含)
ubin = [1] # 决策变量上边界(0表示不包含该变量的上边界,1表示包含)
# 调用父类构造方法完成实例化
ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin)
def evalVars(self, Vars): # 目标函数
f1 = Vars ** 2 # 第一个目标函数
f2 = (Vars - 2) ** 2 # 第二个目标函数
ObjV = np.hstack([f1, f2]) # 计算目标函数值矩阵
CV = -Vars ** 2 + 2.5 * Vars - 1.5 # 构建违反约束程度矩阵(需要转换为小于,反转一下)
return ObjV, CV
# 实例化问题对象
problem = MyProblem()
# 构建算法
algorithm = ea.moea_NSGA2_templet(problem,
# RI编码,种群个体50
ea.Population(Encoding='RI', NIND=50),
MAXGEN=200, # 最大进化代数
logTras=1) # 表示每隔多少代记录一次日志信息,0表示不记录。
# 求解
res = ea.optimize(algorithm, seed=1, verbose=False, drawing=1, outputMsg=True, drawLog=False, saveFlag=False, dirName='result')
运行结果:
Execution time: 0.12531709671020508 s
Evaluation number: 10000
The number of non-dominated solutions is: 50
hv: 0.83020
spacing: 0.03503
Execution time: 0.12531709671020508 s
:代码的执行时间为0.125秒,表示运行该段代码所花费的时间。Evaluation number: 10000
:评估次数为10000次,表示优化算法在优化过程中对问题进行了10000次的评估。The number of non-dominated solutions is: 50
:非支配解的数量为50,表示在优化过程中找到了50个非支配解。非支配解是指在多目标优化中,没有其他解能够同时优于它们的解。hv: 0.83020
:hv值为0.83020,可能是指用于衡量多目标优化算法性能的指标之一,即超体积指标(hypervolume indicator)。较高的hv值表示算法找到的解更好。spacing: 0.03503
:spacing值为0.03503,可能是另一个用于衡量多目标优化算法性能的指标,即分布度指标(spacing indicator)。较高的spacing值表示算法找到的解更均匀分布。