NSGA3进行目标优化
import random
import numpy as np
import geatpy as ea # import geatpy
class MyProblem(ea.Problem): # 继承Problem父类
def __init__(self, M=2, Dim=2): # M : 目标维数;Dim : 决策变量维数
name = 'MyProblem' # 初始化name(函数名称,可以随意设置)
maxormins = [1] * M # 初始化maxormins(目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标)
varTypes = np.array([1] * Dim) # 初始化varTypes(决策变量的类型,0:实数;1:整数)
# 0<=x1<=13,0<=x2<=13
lb = [0] * Dim # 决策变量下界 或者 [0, 0]
ub = [12] * Dim # 决策变量上界 或者 [13, 13]
lbin = [1] * Dim # 决策变量下边界(0表示不包含该变量的下边界,1表示包含)
ubin = [1] * Dim # 决策变量上边界(0表示不包含该变量的上边界,1表示包含)
# 调用父类构造方法完成实例化
ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin)
def evalVars(self, Vars): # 目标函数
x1 = Vars[:, [0]]
x2 = Vars[:, [1]]
squarer = lambda t: fun1[t]
vfunc = np.vectorize(squarer)
f1 = vfunc(x1)
squarer = lambda t: fun2[t]
vfunc = np.vectorize(squarer)
f2 = vfunc(x2)
ObjV = np.hstack((f1, f2))
return ObjV
if __name__ == '__main__':
fun1 = []
fun2 = []
for i in range(13):
fun1.append(random.randint(100, 200))
fun2.append(random.randint(100, 200))
problem = MyProblem() # 生成问题对象
# 构建算法
algorithm = ea.moea_NSGA3_templet(problem,
ea.Population(Encoding='RI', NIND=10), # NIND种群规模
MAXGEN=500, # 最大进化代数。
logTras=10) # 表示每隔多少代记录一次日志信息,0表示不记录。
# 求解
res = ea.optimize(algorithm, verbose=False, drawing=1, outputMsg=True, drawLog=False,
saveFlag=False, dirName='result')
多种群线程实现
import random
from threading import Thread
import numpy as np
import geatpy as ea # import geatpy
class MyProblem(ea.Problem): # 继承Problem父类
def __init__(self, M=2, Dim=1): # M : 目标维数;Dim : 决策变量维数,即x的个数
name = 'MyProblem' # 初始化name(函数名称,可以随意设置)
maxormins = [1] * M # 初始化maxormins(目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标)
varTypes = np.array([1] * Dim) # 初始化varTypes(决策变量的类型,0:实数;1:整数)
# 0<=x1<=13,0<=x2<=13
lb = [0] * Dim # 决策变量下界 或者 [0, 0]
ub = [12] * Dim # 决策变量上界 或者 [13, 13]
lbin = [1] * Dim # 决策变量下边界(0表示不包含该变量的下边界,1表示包含)
ubin = [1] * Dim # 决策变量上边界(0表示不包含该变量的上边界,1表示包含)
# 调用父类构造方法完成实例化
ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin)
def evalVars(self, Vars): # 目标函数
# 一个维度两个目标函数
x1 = Vars[:, [0]]
x2 = x1
squarer = lambda t: myEveryMidUseMemory[t]
vfunc = np.vectorize(squarer)
f1 = vfunc(x1)
squarer = lambda t: TotalTime[t]
vfunc = np.vectorize(squarer)
f2 = vfunc(x2)
ObjV = np.hstack((f1, f2))
return ObjV
def MyNSGA3(NIND):
problem = MyProblem() # 生成问题对象
# 构建算法
algorithm = ea.moea_NSGA3_templet(problem,
ea.Population(Encoding='RI', NIND=NIND), # NIND种群规模
MAXGEN=500, # 最大进化代数。
logTras=10) # 表示每隔多少代记录一次日志信息,0表示不记录。
# 求解
res = ea.optimize(algorithm, verbose=False, drawing=1, outputMsg=True, drawLog=False,
saveFlag=False, dirName='result')
# print(res.values())
# print(res["Vars"])
# print(res["ObjV"])
print(len(res["Vars"]))
for i in res["Vars"]:
myres.append(i)
if __name__ == '__main__':
NIND = [25, 50, 75, 100]
myres = []
Th = []
myEveryMidUseMemory = [-3485722214.4, -10897686528.0, -12103699660.800001, -12401436262.400002, -13585927372.800001, -13740343296.0, -13845423718.400002, -13946578534.400002, -14049784627.2, -14080140902.400002, -14083443916.800001, -14096655974.400002, -14096655974.400002]
TotalTime = [32002.266541228128, 14.171754922008173, 14.171758541127243, 4.785062513566434, 4.462556160542926, 4.462559779661995, 2.8758911573678465, 3.4765193198607336, 4.0106433886084645, 4.544767457356196, 4.697702993530382, 4.9385615147852535, 4.862216407583745]
for i in NIND:
t = Thread(target=MyNSGA3, args=(i,), name= "task" + str(i))
Th.append(t)
for i in Th:
i.start()
for i in Th:
i.join()
print(len(myres))
print(int(min(myres)))