Geatpy框架使用基于NSGA-II算法的多染色体多目标进化算法案例(moea_psy_NSGA2_templet)

在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的配置也会被覆盖,希望新版能修正这个问题。

你可能感兴趣的:(数据分析,算法,geatpy)