python遗传算法之单/多目标规划问题
在上一篇文章里开元棋官方正版下载,我们了解了python的遗传算法库geatpy,还用它演示了一个无约束的单目标优化案例,对之前内容感兴趣的朋友可以查阅:
链接: python遗传算法之geatpy学习.
先前讲解遗传算法时,我们运用了类似matlab的非面向对象编程方法,致使每步操作都极为复杂,现在我们转而使用面向对象编程,旨在简化整个求解流程。
1. 运行环境
这里先介绍一下运行环境
2. 面向对象的原理
先前的部分里开元ky888棋牌官网版,我们阐述了遗传算法大体可以分成模板算法,以及种群,还有混合编码的种群,并且还有问题的类型。Population 类与 PsyPopulation 类可以直接创建对象实例;Algorithm 类和 Problem 类属于基类,必须通过其派生类来运用。接下来我们借助实例来展示具体操作。
3. 带约束的单目标优化问题
3.1 继承 Problem 问题类完成对问题模型的描述
这一阶段的核心任务是开yun体育官网入口登录app,清晰地将我们的议题依照范例进行表述,具体涵盖目标值与限制条款。
import numpy as np
import geatpy as ea
创建名为MyProblem的新类,该类基于ea.Problem父类进行扩展
def __init__(self):
name赋值为'MyProblem',代表一个函数的名称,具体名称可以自由设定
M = 1 # 初始化M(目标维数)
目标列表初始为负一,代表最大最小化符号,其中负一表示最大,正一表示最小
Dim = 3 # 初始化Dim(决策变量维数)
决策变量种类设定为零,每个维度都是连续的,种类列表长度等于维度数,离散的种类标记为一
lb = [0, 0, 0] # 决策变量下界
ub = [1, 1, 2] # 决策变量上界
lbin = [1, 1, 0] # 决策变量下边界
ubin = [1, 1, 0] # 决策变量上边界
# 调用父类构造方法完成实例化
ea问题类初始化自身,接收参数名称,规模M,目标类型,维度数量,变量类型,下界范围,
ub, lbin, ubin)
计算群体目标值,依据输入的种群实例
Vars = pop.Phen # 得到决策变量矩阵
x1从矩阵中提取第一列,得到所有个体的x1值构成的列向量
x2从Vars中选取第二列,形成由所有个体x2值构成的列向量
并将计算结果赋给pop种群对象的ObjV属性
pop.目标值等于四倍第一个变量,加上两倍第二个变量,再加上第三个变量
# 采用可行性法则处理约束,生成种群个体违反约束程度矩阵
pop.CV = np.hstack([2 * x1 + x2 - 1, 第一个限制条件, 其他约束条件])
x1 + 2 * x3 - 2, # 第二个约束
绝对值函数作用于x1与x2之和,再加上x3,然后整体减去1的结果,这个值的非负性作为第三个限制条件
3.2 调用算法模板进行求解
在下一阶段,我们着重编写的是能够针对初始阶段提出的问题给出解答的算法框架,这一过程涉及按顺序设定种群规模、调整算法参数、执行种群迭代优化以及最终输出计算结果。
"""main_solve.py"""
导入名为geatpy的库,作为ea使用
在from myaim模块中获取MyProblem类,作为特定问题的实现方案
"""============================创建问题实体========================"""
对象实例化为问题类,命名为problem
"""=====================生物群体参数配置===================="""
Encoding = 'RI' # 编码方式
NIND = 50 # 种群规模
区域描述器 ea.crtfld 通过编码方式,结合问题变量类型,问题范围,问题边界来构建
种群对象 ea通过调用Population函数创建,该函数接收三个参数,分别是编码方式,领域范围,以及种群规模数量,此时种群尚未完成初始化过程,仅完成了对象的生成步骤
"""===========================程序配置项=========================="""
算法模板对象被创建,命名为myAlgorithm,通过ea.soea_DE_best_1_L_templet函数实现,该函数接收problem和population作为参数
该算法的最大迭代次数设定为一千次
该算法的变异算子系数F设为0.5
该算法的交叉几率设定为0.7
该算法的日志记录间隔设定为1代,若将其值设为0,则意味着将停止记录日志信息
该算法的详细模式开启,将显示运行过程中的记录信息
该算法的绘图参数被设定为1, 这表示将生成结果图像, 不进行绘制, 也不展示目标或决策空间的过程动画, 只有结果图会被呈现出来
开始运用算法范例开展种群迭代,接着实施进化操作
最优个体和最终种群通过算法模板运算得出,结果赋值给BestIndi和population变量
最优个体的数据已写入文档,文件名为BestIndi。
"""=====================呈现内容===================="""
输出评估次数,其值为myAlgorithm的evalsNum属性
输出时间消耗,单位为秒,数值为算法运行时长
if BestIndi.sizes != 0:
输出最佳目标函数值,其数值为BestIndi的ObjV列表中第一个元素的第一个值
print('最优的控制变量值为:')
对于BestIndi.Phen的每一列,依次进行遍历
print(BestIndi.Phen[0, i])
else:
print('此次未找到可行解。')
3.3 结果
种群进化的结果为:
最终的结果为:
4. 带约束的多目标优化问题
4.1 继承 Problem 问题类完成对问题模型的描述
对于多目标的问题,依旧是先编写目标规划问题。
import numpy as np
import geatpy as ea
class MyProblem(ea.Problem): # 继承Problem父类
def __init__(self):
name赋值为'BNH,代表一个函数的名称,这个名称是可以任意设定的
M = 2 # 初始化M(目标维数)
maxormins列表包含M个元素,每个元素的值都设为1
Dim = 2 # 初始化Dim(决策变量维数)
varTypes列表长度等于Dim, 所有元素初始值为0, 该列表用于记录决策变量类型, 其中0代表实数类型, 1代表整数类型
lb = [0] * Dim # 决策变量下界
ub = [5, 3] # 决策变量上界
lbin = [1] * Dim # 决策变量下边界
ubin等于一个列表,列表的长度为Dim,每个元素都设置为1,这表示决策变量的上界,接着通过调用父类的构造方法来创建实例
ea问题类构造函数调用自身,参数包含名称,目标函数数量,优化目标类型,变量维度,变量类型,下界,上界,固定下界,固定上界
计算群体目标值,依据特定规则进行评估,返回对应分数结果
Vars = pop.Phen # 得到决策变量矩阵
x1从Vars中选取第一列数据,形成列向量,该列向量包含了全部个体的x1值
x2 = Vars[:, [1]]
f1 = 4*x1**2 + 4*x2**2
f2等于x1减去五的平方,加上x2减去五的平方
# 采用可行性法则处理约束
pop.CV = np.hstack([(x1 - 5)的平方加上x2的平方减去25,负的(x1 - 8)的平方减去(x2 - 3)的平方加上7.7])
# 把求得的目标函数值赋值给种群pop的ObjV
pop.对象变量等于数组拼接后的结果,这个数组由两个子数组组成,第一个子数组是f1,第二个子数组是f2
## 目标函数主要需要计算出CV和ObjV
4.2 调用算法模板进行求解
模板求解,和单目标规划类似。
import geatpy as ea # import geatpy 在 ga_more_aim 模块中获取 MyProblem 接口,完成自定义问题的引用 import numpy as np ,其目的是为了详细探讨 problem = MyProblem() # 实例化问题对象 """=========================群体参数配置======================""" Encoding = 'RI' # 编码方式 NIND = 100 # 种群规模 Field = ea.crtfld(Encoding, problem.varTypes, problem.ranges,problem.borders) # 创建区域描述器 population = ea.Population(Encoding, Field, NIND) # 实例化种群对象(此时种群还没被真正初始化,仅仅是生成一个种群对象) """=========================程序配置项============================""" 算法模板对象创建为myAlgorithm,采用ea.moea_NSGA2_templet函数,参数为problem和population进行实例化 该算法的变异操作概率设定为0.2 该算法的交叉操作概率设定为九十百分之九,交叉算子的相关参数值被调整 该算法的最大迭代次数设定为两百次 该算法的日志记录代数被设定为1, 若将其值设为0, 则意味着不会保存任何日志信息 该算法的详细模式被关闭,不再显示运行过程中的记录数据 myAlgorithm.drawing = 1 # 设置绘图方式(0:不绘图;1:绘制结果图;2:绘制目标空间过程动画;3:绘制决策空间过程动画) 启动算法方案实施物种迭代过程,依照既定框架执行种群演化步骤,采用程序范例引导物种改良流程,遵循模板规范开展种群繁殖活动,运用算法范例推动物种优化进程,通过方案范例执行物种繁殖任务,依照模式范例实施种群改良作业,采用程序规范推动物种进化操作,遵循框架范例开展种群繁殖工作,运用方案规范促进物种迭代活动 执行算法模板中的run指令,可获得最优解集NDSet,同时得到最终一代种群。 NDSet是一个种群类Population的对象。 NDSet的ObjV代表最佳解体的目标函数数值;NDSet的Phen代表相应的决策变量数值。 详见Population.py中关于种群类的定义。 """ 算法模板运行后,获得非支配子集,同时得到最终世代群体 将非支配类群数据写入文档,以便后续查阅 经过仔细的重新组织,这段文字被彻底重塑,保留了核心信息,同时确保了表达方式的显著差异,每个部分都用逗号分隔,句末保留了必要的标点符号。 显示经过的时间,单位为秒,数值为myAlgorithm的passTime属性值 当非支配个体数量不为零时,显示具体数目,否则,表明未寻得有效方案。 我的算法日志不是空值,并且数据集尺寸不为零 输出GD, 我的方法记录中最新的一条GD值 输出IGD值,该值为算法日志中igd记录的最后一个数值 输出 HV, 我的方法记录中的最后一个 hv 值 输出字符串Spacing,内容为算法记录中spacing字段的最后一个值 """======================演变进程参数监测评估====================""" 度量名称包含两个部分,分别是 igd 和 hv 指标值等于将指标名称列表中的每个名称转换为对应的日志值后,再进行转置操作的结果 # 绘制指标追踪分析图 ea.trcplot这些指标,它们的标签是指标名称,标题也是指标名称
4.3 结果
初学者或许对多目标规划的评价标准GD、IGD、HV等不够明晰,现提供相关资料供参考:多目标进化算法性能评估指标归纳。
帕累托前沿结果:
hv的趋势:
最后结果:
5. 参考资料
geatpy官方网站提供教学资源,网址是https://geatpy.com。
多目标规划评价指标: 多目标进化算法的性能评价指标总结.
这篇讲述python遗传算法在单目标及多目标规划中应用的文档到此结束,若想了解更多关于python单目标或多目标规划的信息,可以查阅脚本之家往期内容,或者继续探索后续相关文章,感谢各位读者今后对脚本之家的关注。