Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python遗传和进化算法框架(一)Geatpy快速入门[通俗易懂]

Python遗传和进化算法框架(一)Geatpy快速入门[通俗易懂]

作者头像
全栈程序员站长
发布于 2022-08-31 00:59:51
发布于 2022-08-31 00:59:51
3.3K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

Geatpy是一个高性能实用型的Python遗传算法工具箱,提供一个面向对象的进化算法框架,经过全面改版后,新版Geatpy2目前由华南农业大学、暨南大学、华南理工等本硕博学生联合团队开发及维护。

Geatpy提供了许多已实现的遗传和进化算法相关算子的库函数,如初始化种群、选择、交叉、变异、重插入、多目标优化非支配排序等,并且提供诸多已实现的进化算法模板来实现多样化的进化算法。其执行效率高于Matlab、Java和Python编写的一些知名工具箱、平台或框架等,学习成本低、模块高度脱耦、扩展性高。

Geatpy支持二进制/格雷码编码种群、实数值种群、整数值种群、排列编码种群。支持轮盘赌选择、随机抽样选择、锦标赛选择。提供单点交叉、两点交叉、洗牌交叉、部分匹配交叉(PMX)、顺序交叉(OX)、线性重组、离散重组、中间重组等重组算子。提供简单离散变异、实数值变异、整数值变异、互换变异等变异算子。支持随机重插入、精英重插入。支持awGA、rwGA、nsga2、快速非支配排序等多目标优化的库函数、提供进化算法框架下的常用进化算法模板等。

关于遗传算法、进化算法的学习资料,在官网中https://www.geatpy.com 有详细讲解以及相关的学术论文链接。同时网上也有很多资料。

闲话少说……下面讲一下怎么安装和使用:

先说一下安装方法:

首先是要windows系统,Python要是3.5,3.6或3.7版本 ,并且安装了pip。只需在控制台执行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install geatpy

即可安装成功。或者到github上下载源码进行编译安装:https://github.com/geatpy-dev/geatpy 。推荐是直接用pip的方式安装。因为这样方便后续的更新。我为了方便运行demo代码以及查看源码和官方教程文档,因此另外在github上也下载了(但仍用pip方式安装)。

有些初学Python的读者反映还是不知道怎么安装,或者安装之后不知道怎么写代码。这里推荐安装Anaconda,它集成了Python的许多常用的运行库,比如Numpy、Scipy等。其内置的Spyder开发软件的风格跟Matlab类似,给人熟悉的感觉,更容易上手。

再说一下更新方法:

Geatpy在持续更新。可以通过以下命令使电脑上的版本与官方最新版保持一致:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install --upgrade geatpy

若在更新过程中遇到”–user”错误的问题,这是用pip进行安装时遇到的常见问题之一。意味着需要以管理员方式运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install --user --upgrade geatpy

Geatpy提供2种方式来使用进化算法求解问题。先来讲一下第一种最基本的实现方式:编写编程脚本。

1. 编写脚本实现遗传算法:

以一个非常简单的单目标优化问题为例:求f(x)=x*sin(10*pi*x)+2.0 在 x∈[-1,2] 上的最大值。

直接编写脚本如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"""demo.py"""
import numpy as np
import geatpy as ea # 导入geatpy库
import matplotlib.pyplot as plt
import time

"""============================目标函数============================"""
def aim(x):                    # 传入种群染色体矩阵解码后的基因表现型矩阵
    return x * np.sin(10 * np.pi * x) + 2.0
x = np.linspace(-1, 2, 200)
plt.plot(x, aim(x)) # 绘制目标函数图像
"""============================变量设置============================"""
x1 = [-1, 2]                   # 自变量范围
b1 = [1, 1]                    # 自变量边界
varTypes = np.array([0])       # 自变量的类型,0表示连续,1表示离散
Encoding = 'BG'                # 'BG'表示采用二进制/格雷编码
codes = [1]                    # 变量的编码方式,2个变量均使用格雷编码
precisions =[4]                # 变量的编码精度
scales = [0]                   # 采用算术刻度
ranges=np.vstack([x1]).T       # 生成自变量的范围矩阵
borders=np.vstack([b1]).T      # 生成自变量的边界矩阵
"""=========================遗传算法参数设置========================="""
NIND = 40;                     # 种群个体数目
MAXGEN = 25;                   # 最大遗传代数
FieldD = ea.crtfld(Encoding,varTypes,ranges,borders,precisions,codes,scales) # 调用函数创建区域描述器
Lind = int(np.sum(FieldD[0, :]))          # 计算编码后的染色体长度
obj_trace = np.zeros((MAXGEN, 2))         # 定义目标函数值记录器
var_trace = np.zeros((MAXGEN, Lind))      # 定义染色体记录器,记录每一代最优个体的染色体
"""=========================开始遗传算法进化========================"""
start_time = time.time()                             # 开始计时
Chrom = ea.crtbp(NIND, Lind)                         # 生成种群染色体矩阵
variable = ea.bs2ri(Chrom, FieldD)                 # 对初始种群进行解码
ObjV = aim(variable)                                 # 计算初始种群个体的目标函数值
best_ind = np.argmax(ObjV)                           # 计算当代最优个体的序号
# 开始进化
for gen in range(MAXGEN):
    FitnV = ea.ranking(-ObjV)                        # 根据目标函数大小分配适应度值(由于遵循目标最小化约定,因此最大化问题要对目标函数值乘上-1)
    SelCh=Chrom[ea.selecting('rws', FitnV, NIND-1), :] # 选择,采用'rws'轮盘赌选择
    SelCh=ea.recombin('xovsp', SelCh, 0.7)           # 重组(采用两点交叉方式,交叉概率为0.7)
    SelCh=ea.mutbin(Encoding, SelCh)                 # 二进制种群变异
    # 把父代精英个体与子代合并
    Chrom = np.vstack([Chrom[best_ind, :], SelCh])
    variable = ea.bs2ri(Chrom, FieldD)             # 对育种种群进行解码(二进制转十进制)
    ObjV = aim(variable)                             # 求育种个体的目标函数值
    # 记录
    best_ind = np.argmax(ObjV)                       # 计算当代最优个体的序号
    obj_trace[gen, 0] = np.sum(ObjV) / NIND          # 记录当代种群的目标函数均值
    obj_trace[gen, 1] = ObjV[best_ind]               # 记录当代种群最优个体目标函数值
    var_trace[gen, :] = Chrom[best_ind, :]           # 记录当代种群最优个体的变量值
# 进化完成
end_time = time.time() # 结束计时
"""============================输出结果及绘图================================"""
best_gen = np.argmax(obj_trace[:, [1]])
print('目标函数最大值:', obj_trace[best_gen, 1]) # 输出目标函数最大值
variable = ea.bs2ri(var_trace[[best_gen], :], FieldD) # 解码得到表现型
print('对应的决策变量值为:')
print(variable[0][0]) # 因为此处variable是一个矩阵,因此用[0][0]来取出里面的元素
print('用时:', end_time - start_time)
plt.plot(variable, aim(variable),'bo')
ea.trcplot(obj_trace, [['种群个体平均目标函数值', '种群最优个体目标函数值']])

运行结果如下:

目标函数最大值: 3.850272716105895 对应的决策变量值为: 1.8505813776055176 用时: 0.02496051788330078

仔细查看上述代码,我们会发现Geatpy的书写风格与Matlab大同小异,有Matlab相关编程经验的基本上可以无缝转移到Python上利用Geatpy进行遗传算法程序开发。

Geatpy提供了详尽的API文档,比如要查看上面代码中的”ranking”函数是干什么的,可以在python中执行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import geatpy as ga
help(ga.ranking)

即可看到”ranking”函数的相关使用方法。

另外官网上也有更多详尽的Geatpy教程:文档 – Geatpy

2. 利用框架实现遗传算法。

Geatpy提供开放的面向对象进化算法框架。即“问题类”+“进化算法模板类+种群类”。对于一些复杂的进化算法,如多目标进化优化、改进的遗传算法等,按照上面所说的编写脚本代码是非常麻烦的,而用框架的方法可以极大提高编程效率。

这里给出一个利用框架实现NSGA-II算法求多目标优化函数ZDT-1的帕累托前沿面的例子:

第一步:首先编写ZDT1的问题类,写在“MyProblem.py”文件中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
"""MyProblem.py"""
import numpy as np
import geatpy as ea

class MyProblem(ea.Problem): # 继承Problem父类
    def __init__(self):
        name = 'ZDT1' # 初始化name(函数名称,可以随意设置)
        M = 2 # 初始化M(目标维数)
        maxormins = [1] * M # 初始化maxormins(目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标)
        Dim = 30 # 初始化Dim(决策变量维数)
        varTypes = [0] * Dim # 初始化varTypes(决策变量的类型,0:实数;1:整数)
        lb = [0] * Dim # 决策变量下界
        ub = [1] * Dim # 决策变量上界
        lbin = [1] * Dim # 决策变量下边界
        ubin = [1] * Dim # 决策变量上边界
        # 调用父类构造方法完成实例化
        ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin)
    
    def aimFunc(self, pop): # 目标函数
        Vars = pop.Phen # 得到决策变量矩阵
        ObjV1 = Vars[:, 0]
        gx = 1 + 9 * np.mean(Vars[:, 1:30], 1)
        hx = 1 - np.sqrt(ObjV1 / gx)
        ObjV2 = gx * hx
        pop.ObjV = np.array([ObjV1, ObjV2]).T # 把结果赋值给ObjV
    
    def calReferObjV(self): # 计算全局最优解作为目标函数参考值
        N = 10000 # 生成10000个参考点
        ObjV1 = np.linspace(0, 1, N)
        ObjV2 = 1 - np.sqrt(ObjV1)
        globalBestObjV = np.array([ObjV1, ObjV2]).T
        
        return globalBestObjV

上面代码中,问题类的构造函数__init__()是用于定义与ZDT1测试问题相关的一些参数,如决策变量范围、类型、边界等等。aimFunc()是待优化的目标函数。calReferObjV()用来计算理论的全局最优解,这个理论最优解可以是通过计算得到的,也可以是通过导入外部文件的数据得到的,如果待求解的问题没有或尚不知道理论最优解是多少,则这个calReferObjV()函数可以省略不写。

第二步:在同一个文件夹下编写执行脚本,实例化上述问题类的对象,然后调用Geatpy提供的nsga2算法的进化算法模板(moea_NSGA2_templet),最后结合理论全局最优解PF(即俗称的“真实前沿点”)通过计算GD、IGD、HV等指标来分析优化效果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
import geatpy as ea  # import geatpy
from MyProblem import MyProblem

if __name__ == '__main__':
    problem = MyProblem()  # 生成问题对象
    # 构建算法
    algorithm = ea.moea_NSGA2_templet(problem,
                                      ea.Population(Encoding='RI', NIND=50),
                                      MAXGEN=200,  # 最大进化代数。
                                      logTras=1)  # 表示每隔多少代记录一次日志信息,0表示不记录。
    # 求解
    res = ea.optimize(algorithm, verbose=True, drawing=1, outputMsg=True, drawLog=False, saveFlag=False, dirName='result')

运行结果如下:

。。。

上述代码中已经对各个流程进行了详细的注释。其中进化算法的核心逻辑是写在进化算法模板内部的,可前往查看对应的源代码。此外,我们还可以参考Geatpy进化算法模板的源代码来自定义算法模板,以实现丰富多样的进化算法,如各种各样的改进的进化算法等:

最后值得注意的是:目标函数aimFunc()那一块地方最容易写错。aimFunc()的输入参数pop是一个种群对象(有关种群对象可以查看工具箱中的Population.py类源码,或者查看Geatpy数据结构)。pop.Phen是种群的表现型矩阵,意思是种群染色体解码后得到的表现型矩阵,它对应的即为问题类中的决策变量。Phen是一个矩阵,每一行对应种群中的一个个体的表现型。在计算目标函数时,可以把这个Phen拆成一行一行,即逐个逐个个体地计算目标函数值,然后再拼成一个矩阵赋值给pop对象的ObjV属性。也可以利用Numpy的矩阵化计算来“一口气”把种群所有个体的目标函数值计算出来。无论采用的是哪种计算方法,最后得到的目标函数值是要保存在pop对象的ObjV属性中的,这个ObjV是“种群目标函数值矩阵”,每一行对应一个个体的所有目标函数值,每一列对应一个目标。比如:

它表示有种群3个个体,待优化目标有2个。

后面的博客将深入理解Geatpy的数据结构、进化算法框架的用法与扩展,以及探讨框架的核心——进化算法模板的实现。还会讲一些使用Geatpy解决问题的案例。欢迎继续跟进~感谢!

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/144522.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
遗传算法工具箱约束怎么输入_遗传算法中怎么添加约束条件
网上有很多博客讲解遗传算法,但是大都只是“点到即止”,虽然给了一些代码实现,但也是“浅尝辄止”,没能很好地帮助大家进行扩展应用,抑或是进行深入的研究。
全栈程序员站长
2022/10/01
1.6K0
遗传算法工具箱约束怎么输入_遗传算法中怎么添加约束条件
人工智能算法:基于Matlab遗传算法的实现示例
作为一种进化算法,遗传算法(GA, Genetic Algorithm)的基本原理是将问题参数编码为染色体,进而利用优化迭代的方法进行选择、交叉和变异算子操作来交换种群中染色体的信息,最终生成符合优化目标的染色体。
用户1143655
2023/02/23
4K0
人工智能算法:基于Matlab遗传算法的实现示例
【优化算法】遗传算法(Genetic Algorithm) (附代码及注释)
遗传算法(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。
短短的路走走停停
2019/05/14
27.6K2
【优化算法】遗传算法(Genetic Algorithm) (附代码及注释)
智能算法之遗传算法
1. 染色体,一条染色体对应的就是你需要求的一个解,例如你需要求一个三元四次的复杂方程的极小值,那么你的一个结当然包含三个数(因为是三元嘛,当然是三个未知数啦),假设是x,y,z。那么你的一条染色体就包含三个数,类似于一个向量[x y z]。类似的如果你的一个解只有一个数,那么一条染色体就只包含一个数。
用户9831583
2022/06/16
6940
智能算法之遗传算法
用Python实现遗传算法
优化问题概述 遗传算法简介模型引入:函数寻优问题形象理解数学原理/实现过程一些概念编制袋鼠的染色体----基因的编码方式二进制编码法浮点数编码只编码主要特征物竞天择--适应性评分与及选择函数物竞――适应度函数(fitness function)天择――选择函数(selection)轮盘赌(Roulette Wheel Selection)选择法——选择繁衍的袋鼠遗传变异――基因重组(交叉)与基因突变基因重组/交叉(recombination/crossover)二进制编码浮点数编码基因突变(Mutation)二进制编码浮点数编码遗传算法案例代码求解完整代码
用户3577892
2020/06/12
2.8K0
用Python实现遗传算法
数学建模暑期集训26:遗传算法
遗传算法是优化类问题的经典智能算法。本篇将介绍遗传算法的基本概念以及利用遗传算法来求解单目标规划模型。
zstar
2022/06/14
3910
数学建模暑期集训26:遗传算法
基于遗传算法(GA)的TSP(Python实现)
基于遗传算法(GA)求解TSP问题是一种常见且有效的方法,它通过模拟进化过程中的选择、交叉和变异等操作,逐步优化解的质量,最终找到较优的旅行路径。在GA算法中,候选解被看作是个体的染色体,并通过适应度函数对每个个体进行评估。在TSP中,适应度函数通常是路径长度的计算,即评估候选解的旅行路径质量。
不去幼儿园
2024/12/03
2010
基于遗传算法(GA)的TSP(Python实现)
遗传算法工具箱安装(一)
今天我给大家讲一讲如何安装matlab的遗传算法工具箱。大家都知道,遗传算法是matlab一个非常经典的智能算法。它通过模仿自然界生物的进化来实现优化效果。在很多问题上,这都是一种非常有效的解决方式。
巴山学长
2019/07/15
3.4K0
遗传算法工具箱安装(一)
差分进化算法(DE)的详述
之前对一篇和本文类似的生物进化优化算法——遗传算法做了一些解释,本文所述的差分进化算法和遗传算法本身有相通的地方当然也有较多的差异。差分进化算法也是基于群体智能理论的优化算法,它是通过群体内个体间的合作与竞争而产生的智能优化算法,字面意思即可看出它有别于遗传算法的自由组合自然选择,它更侧重的是个体与个体和个体与自身间的关系,包括合作与竞争。
用户7506105
2021/08/09
3.8K0
遗传算法(二)
在上一节中我给大家讲解了如何安装遗传算法工具箱,并给出了代码,今天我就给大家讲解一下如何使用工具箱,并且讲解一下遗传算法的使用。还是按照上次的代码。
巴山学长
2019/07/15
1.2K0
遗传算法(二)
多目标优化算法(一)NSGA-Ⅱ(NSGA2)[通俗易懂]
注:没有想到这篇博客竟然有很多人查看,这是我去年写的算法,里面难免会有一些错误,大家可以看看评论区,这里的matlab代码写的不太好,是以C语言思维写的,基本上没有并行,初学者建议可以看看platEMO上的源代码,提前培养好写代码的习惯!
全栈程序员站长
2022/07/21
9.2K0
多目标优化算法(一)NSGA-Ⅱ(NSGA2)[通俗易懂]
《毕业设计》基于遗传算法的旅游路程和资金需求最优规划方案
随着社会经济的蓬勃发展,民众对于旅游的热爱与追求持续升温,展现出不断增长的热情与渴望。本文提出了一种基于遗传算法的旅游路程和资金需求最优规划方案。该方法旨在解决旅游者在规划行程时面临的关键问题,即如何在满足旅游需求的同时,实现旅行路程最短和资金需求最低。通过引入遗传算法,本文能够将这一复杂问题转化为一个优化问题,并在给定的约束条件下寻找最优解。本文首先构建了旅游路程和资金需求的数学模型,该模型综合考虑了旅游者的出行距离、住宿费用、餐饮费用等多个因素。然后,利用遗传算法通过不断迭代和进化,能够找到满足旅游者需求的最优行程规划方案。
不去幼儿园
2024/12/03
1810
《毕业设计》基于遗传算法的旅游路程和资金需求最优规划方案
MATLAB智能算法30个案例分析(3-1)
遗传算法部分 clc clear close all %% 加载神经网络的训练样本 测试样本每列一个样本 输入P 输出T %样本数据就是前面问题描述中列出的数据 load data % 初始隐层神经
万木逢春
2018/04/18
1.3K0
MATLAB智能算法30个案例分析(3-1)
遗传算法的应用实例python实现_python遗传算法库
遗传算法是用于解决最优化问题的一种搜索算法。从名字来看,遗传算法借用了生物学里达尔文的进化理论:”适者生存,不适者淘汰“,将该理论以算法的形式表现出来就是遗传算法的过程。
全栈程序员站长
2022/11/09
1.7K0
遗传算法的应用实例python实现_python遗传算法库
遗传算法python(含例程代码与详解)「建议收藏」
遗传算法简称GA(Genetic Algorithms)模拟自然界生物遗传学(孟德尔)和生物进化论(达尔文)通过人工方式所构造的一类 并行随机搜索最优化方法,是对生物进化过程**“优胜劣汰,适者生存”**这一过程进行的一种数学仿真。
全栈程序员站长
2022/09/30
3.3K0
遗传算法python(含例程代码与详解)「建议收藏」
遗传算法可视化项目(4):遗传算法
遗传算法是一种进化算法,其基本原理是模仿自然界中的生物“物竞天择,适者生存”的进化法则,把问题参数编码为染色体,再利用迭代的方式进行选择、交叉、变异等运算法则来交换种群中染色体的信息,最终生成符合优化目标的染色体。
不可言诉的深渊
2019/07/26
1.6K0
遗传算法求解混合流水车间调度问题(HFSP)二:算法实现一
上图中,第1、2行是第1工序的2台设备,第3、4行是第2工序的2台设备,第5、6行是第3工序的两台设备,纵轴代表时间。按照最优序列[ 3 4 6 2 1 5]赋予每个零件优先级,一共用时25.
mwangblog
2018/12/25
2K0
遗传算法求解混合流水车间调度问题(HFSP)二:算法实现一
遗传算法详解(LINGO及MatlabGA工具箱求解实现)
遗传算法 1.前言 遗传算法是一种基于生物界自然群体遗传进化机制的自适应全局优化概率搜索算法。它与传统算法不同,不依赖梯度信息,而是通过模拟自然进化过程来搜索最优解。 例子:兔子的遗传进化      
Angel_Kitty
2018/04/17
6.6K1
遗传算法详解(LINGO及MatlabGA工具箱求解实现)
遗传算法(python版)
遗传算法(GA)是最早由美国Holland教授提出的一种基于自然界的“适者生存,优胜劣汰”基本法则的智能搜索算法。该法则很好地诠释了生物进化的自然选择过程。遗传算法也是借鉴该基本法则,通过基于种群的思想,将问题的解通过编码的方式转化为种群中的个体,并让这些个体不断地通过选择、交叉和变异算子模拟生物的进化过程,然后利用“优胜劣汰”法则选择种群中适应性较强的个体构成子种群,然后让子种群重复类似的进化过程,直到找到问题的最优解或者到达一定的进化(运算)时间。
py3study
2020/01/06
1.7K0
数学建模启发式算法篇(一)---遗传算法
最近在准备本月亚太赛,第一个学习的是这个模拟退火,但是今天想要更新的不是模拟退火,而是遗传算法;
阑梦清川
2025/02/24
1310
数学建模启发式算法篇(一)---遗传算法
推荐阅读
相关推荐
遗传算法工具箱约束怎么输入_遗传算法中怎么添加约束条件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验