二、Geatpy实现遗传算法(二):采用面向对象的进化算法框架

本文介绍了如何利用Geatpy的面向对象进化算法框架解决带约束的优化问题。通过案例展示了差分进化算法的原理和代码实现,强调了这种框架在简化代码和提高算法适用性方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

  上一篇文章中,脚本编程法虽然可以很深入到进化算法的每个步骤,但代码量确实是太大了。虽然它也具备一定的通用性,比如当需要求解另一个优化问题时,可以通过修改aim()目标函数以及修改变量范围设置等来适应新的问题,但会比较容易出错。此外,上述编程脚本所实现的仅仅是简单的带精英保留的遗传算法,当需要修改算法、采用新的更好的进化算法进行问题的求解时,所需要改动的代码就非常大了。因此,更好、更简便的方式是采用Geatpy提供的面向对象进化算法框架。

二、案例实现

2.1 案例说明

  待优化的问题模型如下:
max ⁡ f ( x 1 , x 2 , x 3 ) = 4 x 1 + 2 x 2 + x 3  s.t.  2 x 1 + x 2 ≤ 1 x 1 + 2 x 3 ≤ 2 x 1 + x 2 + x 3 = 1 x 1 ∈ [ 0 , 1 ] , x 2 ∈ [ 0 , 1 ] , x 3 ∈ ( 0 , 2 ) \begin{array}{l} \max f\left(x_{1}, x_{2}, x_{3}\right)=4 x_{1}+2 x_{2}+x_{3} \\ \text { s.t. } 2 x_{1}+x_{2} \leq 1 \\ x_{1}+2 x_{3} \leq 2 \\ x_{1}+x_{2}+x_{3}=1 \\ x_{1} \in[0,1], x_{2} \in[0,1], x_{3} \in(0,2) \end{array} maxf(x1,x2,x3)=4x1+2x2+x3 s.t. 2x1+x21x1+2x32x1+x2+x3=1x1[0,1],x2[0,1],x3(0,2)
  这是一个带不等式约束和等式约束的单目标最大化优化问题, 存在多个局部最优解, 对进化算法具有一定的挑战性。全局最优解为: f ( 0.5 , 0 , 0.5 ) = 2.5 f(0.5,0,0.5)=2.5 f(0.5,0,0.5)=2.5 。这里拟采用差分进 化算法 来求解该问题, 此时只需要进行编写问题子类和编写执行脚本两个步骤即可完成问题的求解。

2.2 进化差分算法原理

  差分进化算法(Differential Evolution Algorithm,DE)是通过采用浮点矢量进行编码生成种群个体。在DE算法寻优的过程中,首先,从父代个体间选择两个个体进行向量做差生成差分矢量;其次,选择另外一个个体与差分矢量求和生成实验个体;然后,对父代个体与相应的实验个体进行交叉操作,生成新的子代个体;最后在父代个体和子代个体之间进行选择操作,将符合要求的个体保存到下一代群体中去。

2.3 代码实现

#-*-coding:utf-8-*-

import numpy as np
import geatpy as ea
#继承Problem父类
class MyProblem(ea.Problem):
    def __init__(self):
        #初始化name(函数名称,可以随意设置)
        name ='MyProblem'
        #初始化M(目标维数)
        M = 1
        #初始化目标最小最大化标记列表,1:min;-1:max
        maxormins = [-1]
        #初始化Dim(决策变量维数)
        Dim = 3
        #初始化决策变量类型,0:连续;1:离散
        varTypes = [0] * Dim
        #决策变量下界
        lb = [0,0,0]
        #决策变量上界
        ub = [1,1,2]
        #决策变量下边界
        lbin = [1,1,0]
        #决策变量上边界
        ubin = [1,1,0]
        #调用父类构造方法完成实例化
        ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin)

    #目标函数,pop为传入的种群对象
    def aimFunc(self, pop):
        #得到决策变量矩阵
        Vars = pop.Phen
        #取出第一列得到所有个体的x1组成的列向量
        x1 = Vars[:, [0]]
        #取出第二列得到所有个体的x2组成的列向量
        x2 = Vars[:, [1]]
        #取出第三列得到所有个体的x3组成的列向量
        x3 = Vars[:, [2]]
        #计算目标函数值,赋值给pop种群对象的ObjV属性
        pop.ObjV = 4*x1 + 2*x2 + x3
        #采用可行性法则处理约束,生成种群个体违反约束程度矩阵
        pop.CV = np.hstack([2*x1 + x2 - 1,
                            x1 + 2*x3 - 2,
                            np.abs(x1 + x2 + x3 - 1)])

"""============================实例化问题对象========================"""
#实例化问题对象
problem = MyProblem()
"""==============================种群设置==========================="""
#编码方式
Encoding ='RI'
#种群规模
NIND = 50
#创建区域描述器
Field = ea.crtfld(Encoding, problem.varTypes, problem.ranges, problem.borders)
#实例化种群对象(此时种群还没被真正初始化,仅仅是生成一个种群对象)
population = ea.Population(Encoding, Field, NIND)
"""===========================算法参数设置=========================="""
#实例化一个算法模板对象
myAlgorithm = ea.soea_DE_best_1_L_templet(problem, population)
#最大进化代数
myAlgorithm.MAXGEN = 1000
#差分进化中的参数
myAlgorithm.mutOper.F = 0.5
#设置交叉概率
myAlgorithm.recOper.XOVR = 0.7
#设置每隔多少代记录日志,若设置成0则表示不记录日志
myAlgorithm.logTras = 1
#设置是否打印输出日志信息
myAlgorithm.verbose = False
#设置绘图方式(0:不绘图;1:绘制结果图;2:绘制目标空间过程动画;3:绘制决策空间过程动画)
myAlgorithm.drawing = 1
"""==========================调用算法模板进行种群进化==============="""
#执行算法模板,得到最优个体以及最后一代种群
[BestIndi, population] = myAlgorithm.run()
#把最优个体的信息保存到文件中
BestIndi.save()
"""=================================输出结果======================="""
print('评价次数:%s'% myAlgorithm.evalsNum)
print('时间已过%s秒'% myAlgorithm.passTime)
if BestIndi.sizes != 0:
    print('最优的目标函数值为:%s'% BestIndi.ObjV[0][0])
    print('最优的控制变量值为:')
    for i in range(BestIndi.Phen.shape[1]):
        print(BestIndi.Phen[0, i])
else:
    print('没找到可行解。')

在这里插入图片描述

三、Tips

  至此,你已经可以模仿着上面的例子来用进化算法求解一些问题了。使用Geatpy提供的面向对象的进化算法框架可以让你轻松地把Geatpy的进化算法与实际问题或是一些项目代码进行融合。另外Geatpy文件中还提供了大量的demo(案例)以及testbed(实验平台),当中涵盖了单目标优化、多目标优化、组合优化、约束优化的案例。在后面的章节我们将会来剖析Geatpy进化算法模板的架构,让你可以快速深度掌握Geatpy的进化算法模板,以便可以自己设计出能够更好求解实际问题的进化算法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白银时代_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值