在Geatpy的官方文档中并没有多目标+多染色体进化算法的demo,在我实际写代码时也出现了一些问题。本篇博客补充一个调用moea_psy_NSGA2_templet的demo:
目标函数:
max f1 = x1 * x2 + x3
min f2 = x1 + x2 - x3
s.t.
2*x1 + x2 - 1 <= 0
x1 + 2*x3 - 2 <= 0
x1 + x2 + x3 - 1 == 0
1 <= x1 <= 4
-10 <= x2 <= 1
0 < x3 < 2
Myproblem.py:
# -*- coding: utf-8 -*-
import numpy as np
import geatpy as ea
"""
max f1 = x1 * x2 + x3
min f2 = x1 + x2 - x3
s.t.
2*x1 + x2 - 1 <= 0
x1 + 2*x3 - 2 <= 0
x1 + x2 + x3 - 1 == 0
1 <= x1 <= 4
-10 <= x2 <= 1
0 < x3 < 2
"""
class MyProblem(ea.Problem): # 继承Problem父类
def __init__(self):
name = "MyProblem"
M = 2 # f的数量
maxormins = [-1, 1] # (目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标)
Dim = 3 # x的个数
# x的上下界与定义边界是开区间还是闭区间
var_types = [0] * Dim # 元素为0表示对应的变量是连续的;1表示是离散的
lb = [1, -10, 0] # 决策变量下界
ub = [4, 1, 2] # 决策变量上界
lbin = [1, 1, 0] # 决策变量下边界(0表示不包含该变量的下边界,1表示包含)
ubin = [1, 1, 0] # 决策变量上边界(0表示不包含该变量的上边界,1表示包含)
ea.Problem.__init__(self, name, M, maxormins, Dim, var_types, lb, ub, lbin, ubin)
def aimFunc(self, pop): # 目标函数
Vars = pop.Phen # 得到决策变量矩阵
x1 = Vars[:, [0]]
x2 = Vars[:, [1]]
x3 = Vars[:, [2]]
# 目标函数:
f1 = x1 * x2 + x3
f2 = x1 + x2 - x3
pop.ObjV = np.hstack([f1, f2])
# 约束条件:(要全部化为 <= )
c1 = 2 * x1 + x2 - 1
c2 = x1 + 2 * x3 - 2 # 约束条件 <= 0
c3 = np.abs(x1 + x2 + x3 - 1) # 约束条件 = 0
pop.CV = np.hstack([c1, c2, c3])
Main函数中:
注意Encoding与Field都要是数组的结构,否则报错
# -*- coding: utf-8 -*-
import numpy as np
import geatpy as ea # import geatpy
from MyProblem import MyProblem # 导入自定义问题接口
if __name__ == '__main__':
"""================================实例化问题对象==========================="""
problem = MyProblem() # 生成问题对象
"""==================================种群设置==============================="""
NIND = 50 # 种群规模
Encoding = ['RI']
Field = [ea.crtfld(Encoding[0], problem.varTypes, problem.ranges, problem.borders)] # 创建区域描述器
population = ea.PsyPopulation(Encoding, Field, NIND) # 实例化种群对象(此时种群还没被初始化,仅仅是完成种群对象的实例化)
"""================================算法参数设置============================="""
myAlgorithm = ea.moea_psy_NSGA2_templet(problem, population) # 实例化一个算法模板对象
myAlgorithm.MAXGEN = 5 # 最大进化代数
"""===========================调用算法模板进行种群进化======================="""
ndset = myAlgorithm.run()
ndset.save()
print('用时:%s 秒' % (myAlgorithm.passTime))
print('非支配个体数:%s 个' % (ndset.sizes))
print('单位时间找到帕累托前沿点个数:%s 个' % (int(ndset.sizes // myAlgorithm.passTime)))
其他问题:
因为我是在deepin系统中编程,在使用Geapy框架时导出图像时会调用matplotlib,而常见的中文方块会出现,还会有“黑体”字体找不到报错,在代码中添加matplotlib的配置也会被覆盖,希望新版能修正这个问题。