当前位置:

首页 > 编程开发 > 如何在Python中安装和使用遗传算法库geatpy?

如何在Python中安装和使用遗传算法库geatpy?

1.geatpy的安装首先是安装geatpy,使用pip3命令进行安装即可:pip3installgeatpy出现如下提示即安装成功:2.geatpy的基础数据结构geatpy中的大部分数据都是都是使用numpy的数组进行存储和计算的,下面我将介绍遗传算法中的概念是如何用numpy数据表示,以及行和列的含义。2.1种群染色体遗传算法中最重要的就是个体的染色体表示,在geatpy中种群染色体用Chrom表示,这是一个二维数组,其中每一行对应一个个体的染色体编码,Chrom的结构如下:其中lind表示编码的长

本文目录

      1. geatpy的安装

      首先是安装geatpy,使用pip3命令进行安装即可:

      pip3 install geatpy

      出现如下提示即安装成功:

      如何在Python中安装和使用遗传算法库geatpy?

      2. geatpy的基础数据结构

      geatpy中的大部分数据都是都是使用numpy的数组进行存储和计算的,下面我将介绍遗传算法中的概念是如何用numpy数据表示,以及行和列的含义。

      2.1 种群染色体

      遗传算法中最重要的就是个体的染色体表示,在geatpy中种群染色体用Chrom表示,这是一个二维数组,其中每一行对应一个个体的染色体编码,Chrom的结构如下:其中lind表示编码的长度,Nind表示的是种群的规模(个体数量)。

      如何在Python中安装和使用遗传算法库geatpy?

      2.2 种群表现型

      种群表现型是是指种群染色体矩阵Chrom经过解码后得到的基因表现型矩阵Phen,每一行对应一个个体,每一列对应一个决策变量,Phen的结构如下:其中Nvar表示变量的个数

      如何在Python中安装和使用遗传算法库geatpy?

      Phen的值与采用的解码方式有关。Geatpy提供二进制/格雷码编码转十进制整数或实数的解码方式。另外,在Geatpy也可以使用不需要解码的“实值编码”种群,这种种群的染色体的每一位就对应着决策变量的实际值,即这种编码方式下Phen等价Chrom。

      2.3 目标函数值

      Geatpy采用numpy的array类型矩阵来存储种群的目标函数值。一般命名为ObjV,每一行对应每一个个体,因此它拥有与Chrom相同的行数;每一列对应一个目标函数,因此对于单目标函数,ObjV会只有1列;而对于多目标函数,ObjV会有多列, ObjV的表示形式如下:

      如何在Python中安装和使用遗传算法库geatpy?

      2.4 个体适应度

      Geatpy采用列向量来存储种群个体适应度(适应度函数计算而来)。一般命名为FitnV,它同样是numpy的array类型,每一行对应种群矩阵的每一个个体。因此它拥有与Chrom相同的行数,FitnV的格式如下:

      如何在Python中安装和使用遗传算法库geatpy?

      注意:Geatpy中的适应度遵循“最小适应度为0”的约定。

      2.5 违反约束程度矩阵

      Geatpy采用numpy的array类型的矩阵CV(Constraint Violation Value)来存储种群个体违反各个约束条件的程度。命名为CV,它的每一行对应种群的每一个个体,因此它拥有与Chrom相同的行数;每一列对应一个约束条件,因此若有一个约束条件,那么CV矩阵就会只有一列,如有多个约束条件,CV矩阵就会有多列。如果设有num个约束,则CV矩阵的结构如下图所示:

      如何在Python中安装和使用遗传算法库geatpy?

      CV矩阵的某个元素若小于或等于0,则表示该元素对应的个体满足对应的约束条件。若大于0,则表示违反约束条件,在大于0的条件下值越大,该个体违反该约束的程度就越高。Geatpy提供两种处理约束条件的方法,一种是罚函数法,另一种是可行性法则。在使用可行性法则处理约束条件时,需要用到CV矩阵。

      2.6 译码矩阵

      所谓的译码矩阵,只是用来描述种群染色体特征的矩阵,如染色体中的每一位元素所表达的决策变量的范围、是否包含范围的边界、采用二进制还是格雷码、是否使用对数刻度、染色体解码后所代表的决策变量的是连续型变量还是离散型变量等等。

      在只使用工具箱的库函数而不使用Geatpy提供的面向对象的进化算法框架时,译码矩阵可以单独使用。若采用Geatpy提供的面向对象的进化算法框架时,译码矩阵可以与一个存储着种群染色体编码方式的字符串Encoding来配合使用。

      目前Geatpy中有三种Encoding,分别为:

      • BG:(二进制/格雷码)

      • RI:((实整数编码,即实数和整数的混合编码)

      • P:(排列编码,即染色体每一位的元素都是互异)

      注:’RI’和’P’编码的染色体都不需要解码,染色体上的每一位本身就代表着决策变量的真实值,因此“实整数编码”和“排列编码”可统称为“实值编码”

      以BG编码为例,我们展示一下编译矩阵FieldD。FieldD的结构如下:

      如何在Python中安装和使用遗传算法库geatpy?

      其中,lens,lb,ub,codes,scales,lbin,ubin,varTypes都是行向量,其长度等于决策变量的个数。

      • lens:代表以条染色体中,每个子染色体的长度。

      • lb:代表每个变量的上界

      • ub:代表每个变量的下界

      • codes:代表染色体字串用的编码方式,[1,0,1]代表第一个变量用的格雷编码,第二个变量用的二进制编码,第3个变量用的格雷编码。

      • scales:指明每个子串用的是算术刻度还是对数刻度。scales[i] = 0为算术刻度,scales[i] = 1为对数刻度(对数刻度很少用,可以忽略。)

      • lbin:代表变量上界是否包含其范围边界。0代表不包含,1代表包含。‘[ ’和 ‘(’ 的区别

      • ubin:代表变量下界是否包含其范围边界。0代表不包含,1代表包含。

      • varTypes:代表决策变量的类型,元素为0表示对应位置的决策变量是连续型变量;1表示对应的是离散型变量。

      例如:有以下一个译码矩阵

      如何在Python中安装和使用遗传算法库geatpy?

      它表示待解码的种群染色体矩阵Chrom解码后可以表示成3个决策变量,每个决策变量的取值范围分别是[1,10], [2,9], [3,15]。其中第一第二个变量采用的是二进制编码,第三个变量采用的是格雷编码,且第一、第三个决策变量为连续型变量;第二个为离散型变量。

      #通过种群染色体chrom和译码矩阵FieldD,可解码成种群表现型矩阵。
      import geatpy as ea
      Phen = ea.bs2ri(Chrom, FieldD)

      2.7 进化追踪器

      在使用Geatpy进行进化算法编程时,常常建立一个进化追踪器(如pop_trace)来记录种群在进化的过程中各代的最优个体,尤其是采用无精英保留机制时,进化追踪器帮助我们记录种群在进化过程中的最优个体。待进化完成后,再从进化追踪器中挑选出“历史最优”的个体。这种进化记录器有多种,其中一种是numpy的array类型的,结构如下:其中MAXGEN是种群进化的代数(迭代次数)。

      如何在Python中安装和使用遗传算法库geatpy?

      trace的每一列代表不同的指标,比如第一列记录各代种群的最佳目标函数值,第二列记录各代种群的平均目标函数值…trace的每一行对应每一代,如第一行代表第一代,第二行代表第二代…另外一种进化记录器是一个列表,列表中的每一个元素都是一个拥有相同数据类型的数据。比如在Geatpy的面向对象进化算法框架中的pop_trace,它是一个列表,列表中的每一个元素都是历代的种群对象。

      3. geatpy的种群结构

      3.1 Population类

      在Geatpy提供的面向对象进化算法框架中,种群类(Population)是一个存储着与种群个体相关信息的类。它有以下基本属性:

      • sizes : int -种群规模,即种群的个体数目。

      • ChromNum : int -染色体的数目,即每个个体有多少条染色体。

      • Encoding : str -染色体编码方式。

      • Field : array -译码矩阵,可以是FieldD或FieldDR。

      • Chrom : array -种群染色体矩阵,每一行对应一个个体的一条染色体。

      • Lind : int -种群染色体长度。

      • ObjV : array -种群目标函数值矩阵。

      • FitnV : array -种群个体适应度列向量。

      • CV : array -种群个体违反约束条件程度的矩阵。

      • Phen : array -种群表现型矩阵。

      可以直接对种群对象进行提取个体、个体合并等操作,比如pop1和pop2是两个种群对象,则通过语句“pop3 = pop1 + pop2”,即可把两个种群的个体合并,得到一个新的种群。在合并的过程中,实际上是把种群的各个属性进行合并,然后用合并的数据来生成一个新的种群(详见Population.py)。又比如执行语句“pop3 = pop1[[0]]”,可以把种群的第0号个体抽取出来,得到一个新的只有一个个体的种群对象pop3。值得注意的是,种群的这种个体抽取操作要求下标必须为列表或是Numpy array类型的行向量,不能是标量(详见Population.py)

      3.2 PsyPopulation类

      PsyPopulation类是Population的子类,它提供Population类所不支持的多染色体混合编码。它有以下基本属性:

      • sizes : int -种群规模,即种群的个体数目。

      • ChromNum : int -染色体的数目,即每个个体有多少条染色体。

      • Encodings : list -存储各染色体编码方式的列表。

      • Fields : list -存储各染色体对应的译码矩阵的列表。

      • Chroms : list -存储种群各染色体矩阵的列表。

      • Linds : list -存储种群各染色体长度的列表。

      • ObjV : array -种群目标函数值矩阵。

      • FitnV : array -种群个体适应度列向量。

      • CV : array -种群个体违反约束条件程度的矩阵。

      • Phen : array -种群表现型矩阵。

      可见PsyPopulation类基本与Population类一样,不同之处是采用Linds、Encodings、Fields和Chroms分别存储多个Lind、Encoding、Field和Chrom。

      PsyPopulation类的对象往往与带“psy”字样的进化算法模板配合使用,以实现多染色体混合编码的进化优化。

      4. 求解标准测试函数——McCormick函数

      遗传算法求解以下函数的最小值: 

      如何在Python中安装和使用遗传算法库geatpy?

      代码实现:

      #-*-coding:utf-8-*-
      import numpy as np
      import geatpy as ea#导入geatpy库
      import time
      """============================目标函数============================"""
      def aim(Phen):#传入种群染色体矩阵解码后的基因表现型矩阵
          x1 = Phen[:, [0]]#取出第一列,得到所有个体的第一个自变量
          x2 = Phen[:, [1]]#取出第二列,得到所有个体的第二个自变量
          return np.sin(x1 + x2) + (x1 - x2) ** 2 - 1.5 * x1 + 2.5 * x2+1
      """============================变量设置============================"""
      x1 = [-1.5, 4]#第一个决策变量范围
      x2 = [-3, 4]#第二个决策变量范围
      b1 = [1, 1]#第一个决策变量边界,1表示包含范围的边界,0表示不包含
      b2 = [1, 1]#第二个决策变量边界,1表示包含范围的边界,0表示不包含
      #生成自变量的范围矩阵,使得第一行为所有决策变量的下界,第二行为上界
      ranges=np.vstack([x1, x2]).T
      #生成自变量的边界矩阵
      borders=np.vstack([b1, b2]).T
      varTypes = np.array([0, 0])#决策变量的类型,0表示连续,1表示离散
      """==========================染色体编码设置========================="""
      Encoding ='BG'#'BG'表示采用二进制/格雷编码
      codes = [1, 1]#决策变量的编码方式,两个1表示变量均使用格雷编码
      precisions =[6, 6]#决策变量的编码精度,表示解码后能表示的决策变量的精度可达到小数点后6位
      scales = [0, 0]#0表示采用算术刻度,1表示采用对数刻度#调用函数创建译码矩阵
      FieldD =ea.crtfld(Encoding,varTypes,ranges,borders,precisions,codes,scales)
      
      """=========================遗传算法参数设置========================"""
      NIND     = 20#种群个体数目
      MAXGEN   = 100#最大遗传代数
      maxormins = np.array([1])#表示目标函数是最小化,元素为-1则表示对应的目标函数是最大化
      selectStyle ='sus'#采用随机抽样选择
      recStyle ='xovdp'#采用两点交叉
      mutStyle ='mutbin'#采用二进制染色体的变异算子
      Lind =int(np.sum(FieldD[0, :]))#计算染色体长度
      pc= 0.9#交叉概率
      pm= 1/Lind#变异概率
      obj_trace = np.zeros((MAXGEN, 2))#定义目标函数值记录器
      var_trace = np.zeros((MAXGEN, Lind))#染色体记录器,记录历代最优个体的染色体
      
      """=========================开始遗传算法进化========================"""
      start_time = time.time()#开始计时
      Chrom = ea.crtpc(Encoding,NIND, FieldD)#生成种群染色体矩阵
      variable = ea.bs2ri(Chrom, FieldD)#对初始种群进行解码
      ObjV = aim(variable)#计算初始种群个体的目标函数值
      best_ind = np.argmin(ObjV)#计算当代最优个体的序号
      
      #开始进化
      for gen in range(MAXGEN):
          FitnV = ea.ranking(maxormins * ObjV)#根据目标函数大小分配适应度值
          SelCh = Chrom[ea.selecting(selectStyle,FitnV,NIND-1),:]#选择
          SelCh = ea.recombin(recStyle, SelCh, pc)#重组
          SelCh = ea.mutate(mutStyle, Encoding, SelCh, pm)#变异
          # #把父代精英个体与子代的染色体进行合并,得到新一代种群
          Chrom = np.vstack([Chrom[best_ind, :], SelCh])
          Phen = ea.bs2ri(Chrom, FieldD)#对种群进行解码(二进制转十进制)
          ObjV = aim(Phen)#求种群个体的目标函数值
          #记录
          best_ind = np.argmin(ObjV)#计算当代最优个体的序号
          obj_trace[gen,0]=np.sum(ObjV)/ObjV.shape[0]#记录当代种群的目标函数均值
          obj_trace[gen,1]=ObjV[best_ind]#记录当代种群最优个体目标函数值
          var_trace[gen,:]=Chrom[best_ind,:]#记录当代种群最优个体的染色体
          # 进化完成
          end_time = time.time()#结束计时
          ea.trcplot(obj_trace, [['种群个体平均目标函数值','种群最优个体目标函数值']])#绘制图像
      
      """============================输出结果============================"""
      best_gen = np.argmin(obj_trace[:, [1]])
      print('最优解的目标函数值:', obj_trace[best_gen, 1])
      variable = ea.bs2ri(var_trace[[best_gen], :], FieldD)#解码得到表现型(即对应的决策变量值)
      print('最优解的决策变量值为:')
      for i in range(variable.shape[1]):
          print('x'+str(i)+'=',variable[0, i])
          print('用时:', end_time - start_time,'秒')

      效果图:

      如何在Python中安装和使用遗传算法库geatpy?

      结果如下:

      如何在Python中安装和使用遗传算法库geatpy?

      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发 Python
      相关文章 更多
      python删除一个列表里的重复元素的方法与代码示例
      python删除一个列表里的重复元素的方法与代码示例

      学习如何使用Python高效删除列表中的重复元素。本文提供5种常见方法的代码示例,涵盖保持顺序与不保持顺序的场景,适合初学者和进阶开发者参考。

      Python写接口的步骤及完整代码示例
      Python写接口的步骤及完整代码示例

      详细讲解使用Python编写Web接口的核心步骤与完整代码示例,涵盖环境准备、路由定义、数据校验、服务启动及调试测试方法。

      codex怎么读取word文档及docx文件操作教程
      codex怎么读取word文档及docx文件操作教程

      介绍如何利用编程工具读取和解析Word文档(docx格式),涵盖基础文本提取代码示例、结构化数据处理逻辑,以及处理复杂排版时的技术局限与替代方案。

      怎么在Python中调用C语言代码提升性能
      怎么在Python中调用C语言代码提升性能

      详细讲解在Python中调用C语言代码提升性能的完整实践指南,包含原理分析、编译步骤、ctypes与CFFI具体实现、性能对比及常见陷阱。

      Python与C语言的性能差异及底层原理
      Python与C语言的性能差异及底层原理

      深入解析Python与C语言在执行效率上的数量级差异,从编译机制、变量内存布局、动态类型推断到GIL锁,系统阐明底层核心原理。

      Python和C语言哪个更适合编程入门
      Python和C语言哪个更适合编程入门

      客观对比Python与C语言在心智负担、底层机制与学习反馈上的核心差异,提供清晰有据的选择标准与切实的入门学习路径。

      selenium上传文件教程本地文件路径设置方法
      selenium上传文件教程本地文件路径设置方法

      深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

      针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

      langgraph python guide中文入门教程详解
      langgraph python guide中文入门教程详解

      本篇LangGraph Python中文入门教程详解,系统梳理StateGraph状态机定义、节点编写、边与条件路由、检查点持久化(MemorySaver)等核心机制,提供从环境安装到完整循环智能体构建的代码示例与实操指导。

      Windows 安装 Python:从官方入口到虚拟环境的可复现实践
      Windows 安装 Python:从官方入口到虚拟环境的可复现实践

      面向后端开发者,基于 Python 官方文档说明如何在 Windows 上安装 Python、创建 venv 虚拟环境及使用 pip 管理依赖。包含可复制命令、验证方法及工具选择边界,避免常见配置误区。

      查看更多
      精品专题 更多
      装机必备
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows
      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程
      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      Mac软件 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      Aperty macOS版
      Aperty macOS版
      macOS

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      WINDOWS 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      PixTV 网页版
      PixTV 网页版
      Windows

      PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。