NSGAII
# -*- coding: utf-8 -*-
import numpy as np
import geatpy as ea # import geatpy
if __name__ == '__main__':
problem = ea.benchmarks.ZDT1() # 生成问题对象
# 构建算法
algorithm = ea.moea_NSGA2_templet(problem,
ea.Population(Encoding='RI', NIND=100),
MAXGEN=500, # 最大进化代数。
logTras=0) # 表示每隔多少代记录一次日志信息,0表示不记录。
# 求解
res = ea.optimize(algorithm, verbose=False, drawing=1, outputMsg=True, drawLog=False, saveFlag=False, dirName='result')
使用Geatpy时可以更加专注于待优化模型的建立,即在做进化算法的应用时,不用管进化算法的细节,而专注于把待优化模型写成一个自定义问题类。
NSGAIII优化ZDT1模型
# -*- coding: utf-8 -*-
import numpy as np
import geatpy as ea # import geatpy
if __name__ == '__main__':
problem = ea.benchmarks.DTLZ1() # 生成问题对象
# 构建算法
algorithm = ea.moea_NSGA3_templet(problem,
ea.Population(Encoding='RI', NIND=91),
MAXGEN=500, # 最大进化代数。种群个体数91,进化代数500。
logTras=0) # 表示每隔多少代记录一次日志信息,0表示不记录。
# 求解
res = ea.optimize(algorithm, verbose=False, drawing=1, outputMsg=True, drawLog=False, saveFlag=False, dirName='result')
理论上MOEA/D会比NSGA2快,但由于python语言的限制,MOEA/D的算法设计在python上的执行效率会大打折扣。这种情况同样存在于Matlab中。如果是纯C/C++或者Java等,MOEA/D的高效率才能够真正展现出来。当然,假如在C/C++或Java中采用细粒度的并行来执行进化,那么MOEA/D的执行效率是远远比不上NSGA2的,这是因为MOEA/D的算法设计天然地不支持细粒度的并行。
# -*- coding: utf-8 -*-
import numpy as np
import geatpy as ea # import geatpy
if __name__ == '__main__':
problem = ea.benchmarks.ZDT1() # 生成问题对象
# 构建算法
algorithm = ea.moea_MOEAD_templet(problem,
ea.Population(Encoding='RI', NIND=40),
MAXGEN=300, # 最大进化代数。种群个体数40,进化代数300
logTras=0) # 表示每隔多少代记录一次日志信息,0表示不记录。
# 求解
res = ea.optimize(algorithm, verbose=False, drawing=1, outputMsg=True, drawLog=False, saveFlag=False, dirName='result')