目录
一、单目标优化使用实例
1、数学模型
2、定义决策变量/目标函数/约束条件
3、调用算法求解优化问题
二、多目标优化使用实例
1、数学模型
2、定义决策变量/目标函数/约束条件
3、调用算法求解优化问题
Geatpy是一个高性能实用型的Python遗传算法工具箱,提供一个面向对象的进化算法框架,经过全面改版后,新版Geatpy2目前由华南农业大学、暨南大学、华南理工等本硕博学生联合团队开发及维护。
Geatpy2整体上看由工具箱内核函数(内核层)和面向对象进化算法框架(框架层)两部分组成。其中面向对象进化算法框架主要有四个大类:Problem问题类、Algorithm算法模板类、Population种群类和PsyPopulation多染色体种群类。
该案例展示了一个带等式约束的连续型决策变量最大化目标的单目标优化问题。
该函数存在多个欺骗性很强的局部最优点。
MyProblem.py
# -*- coding: utf-8 -*-
import numpy as np
import geatpy as ea
class MyProblem(ea.Problem): # 继承Problem父类
def __init__(self):
name = 'MyProblem' # 初始化name(函数名称,可以随意设置)
M = 1 # 初始化M(目标维数)
maxormins = [-1] # 初始化maxormins(目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标)
Dim = 3 # 初始化Dim(决策变量维数)
varTypes = [0] * Dim # 这是一个list,初始化varTypes(决策变量的类型,元素为0表示对应的变量是连续的;1表示是离散的)
lb = [0,0,0] # 决策变量下界
ub = [1,1,2] # 决策变量上界
lbin = [1,1,0] # 决策变量下边界(0表示不包含该变量的下边界,1表示包含)
ubin = [1,1,0] # 决策变量上边界(0表示不包含该变量的上边界,1表示包含)
# 调用父类构造方法完成实例化
ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin)
def aimFunc(self, pop): # 目标函数
Vars = pop.Phen # 得到决策变量矩阵
x1 = Vars[:, [0]] # 取出第一列得到所有个体的x1组成的列向量
x2 = Vars[:, [1]] # 第二列
x3 = Vars[:, [2]] # 第三列
pop.ObjV = 4*x1 + 2*x2 + x3 # 计算目标函数值,赋值给pop种群对象的ObjV属性
# 采用可行性法则处理约束,numpy的hstack()把x1、x2、x3三个列向量拼成CV矩阵
pop.CV = np.hstack([2*x1 + x2 - 1,x1 + 2*x3 - 2, np.abs(x1 + x2 + x3 - 1)])
'''
约束条件1,即2*x1 + x2 - 1<= 0或者2*x1 + x2 <= 1,如果是2*x1 + x2 >= 1,则取负写作(-2*x1-x2+1)
'''
def calReferObjV(self): # 设定目标数参考值(本问题目标函数参考值设定为理论最优值),这个函数其实可以不要
referenceObjV = np.array([[2.5]])
return referenceObjV
main.py
# * - coding: utf - 8 -*-
import numpy as np
import geatpy as ea # import geatpy
from MyProblem import MyProblem # 导入自定义问题接口
if __name__ == '__main__':
"""================================实例化问题对象==========================="""
problem = MyProblem() # 生成问题对象
"""==================================种群设置==============================="""
Encoding = 'RI' # 编码方式
NIND = 100 # 种群规模
Field = ea.crtfld(Encoding, problem.varTypes, problem.ranges, problem.borders) # 创建区域描述器
population = ea.Population(Encoding, Field, NIND) # 实例化种群对象(此时种群还没被初始化,仅仅是完成种群对象的实例化)
"""================================算法参数设置============================="""
myAlgorithm = ea.soea_DE_rand_1_L_templet(problem, population) # 实例化一个算法模板对象
myAlgorithm.MAXGEN = 500 # 最大进化代数
myAlgorithm.mutOper.F = 0.5 # 差分进化中的参数F
myAlgorithm.recOper.XOVR = 0.7 # 重组概率
"""===========================调用算法模板进行种群进化======================="""
[population, obj_trace, var_trace] = myAlgorithm.run() # 执行算法模板
population.save() # 把最后一代种群的信息保存到文件中
# 输出结果
best_gen = np.argmin(problem.maxormins * obj_trace[:, 1]) # 记录最优种群个体是在哪一代
best_ObjV = obj_trace[best_gen, 1]
print('最优的目标函数值为:%s' % (best_ObjV))
print('最优的决策变量值为:')
for i in range(var_trace.shape[1]):
print(var_trace[best_gen, i])
print('有效进化代数:%s' % (obj_trace.shape[0]))
print('最优的一代是第 %s 代' % (best_gen + 1))
print('评价次数:%s' % (myAlgorithm.evalsNum))
print('时间已过 %s 秒' % (myAlgorithm.passTime))
待续。
作者简介:国内顶尖高校控制专业毕业,专注于智能优化算法及其应用,运筹优化调度,各类求解器求解,人工智能机器学习、深度学习算法及应用等方向的研究,擅长各类算法的改进、各类数学模型的建模求解,熟悉各类求解器的使用。