python geatpy,Python 遗传算法

  python geatpy,Python 遗传算法

  本文主要介绍了对python遗传算法geatpy的深入理解,主要是从geatpy中的各种数据结构一步步学习,有一定的参考价值。有兴趣的可以看看。

  00-1010 1.geatpy 2的安装。geatpy的基本数据结构2.1群体染色体2.2群体表型2.3目标函数值2.4个体适应度2.5违反度矩阵2.6解码矩阵2.7进化跟踪器3。全球人口结构3.1人口类别3.2心理人口类别4。求解标准测试函数——McCormick函数5。参考文章今天我们要学习遗传算法在python中的使用。我们在这里使用geatpy的包来学习。这个博客主要是一步步学习geatpy中的各种数据结构。请耐心看完。

  其实我之前学过遗传算法,但主要是用matlab编程。后来觉得matlab太麻烦,用python更方便,就开始学习。

  

目录

 

  第一步是安装geatpy,这可以通过使用pip3命令来完成:

  pip3安装geatpy

  出现以下提示时,安装成功:

  

1. geatpy的安装

 

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

  

2. geatpy的基础数据结构

 

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

  

2.1 种群染色体

 

  群体表型是指通过解码群体的染色体矩阵chrom得到的基因表型矩阵phen。每行对应一个人,每列对应一个决策变量。phen的结构如下:Nvar代表变量个数。

  Phen的值与所采用的解码方法有关。Geatpy提供了二进制/格雷码编码到十进制整数或实数的解码方法。另外,不需要解码的“实值编码”人群也可以用在Geatpy中。该群体染色体的每一位对应决策变量的实际值,即该编码模式下的Phen等价chrom。

  

2.2 种群表现型

 

  Geatpy使用numpy的数组类型矩阵来存储群体的目标函数值。一般命名为ObjV,每一行对应每一个个体,所以和Chrom有相同的行数;每一列对应一个目标函数,所以对于单个目标函数,ObjV中只会有一列;但是对于多目标函数,会有多列ObjV,ObjV的表达式如下:

  

2.3 目标函数值

 

  Geatpy使用列向量存储种群的个体适应度(由适应度函数计算)。一般命名为FitnV,也是numpy的数组类型,每行对应人口矩阵的每个个体。所以它的行数和Chrom一样,FitnV的格式如下:

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

  

2.4 个体适应度

 

  Geatpy使用numpy的数组CV(约束违反值)来存储个体种群违反每个约束条件的程度。它被命名为CV,它的每一行都对应一个物种。

  群的每一个个体,因此它拥有与Chrom相同的行数;每一列对应一个约束条件,因此若有一个约束条件,那么CV矩阵就会只有一列,如有多个约束条件,CV矩阵就会有多列。如果设有num个约束,则CV矩阵的结构如下图所示:

  

 

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

  

 

  

2.6 译码矩阵

 

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

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

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

  

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

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

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

 

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

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

  

 

  其中,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表示对应的是离散型变量。

 

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

  

 

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

  

#通过种群染色体chrom和译码矩阵FieldD,可解码成种群表现型矩阵。

 

  

 

  

2.7 进化追踪器

 

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

  

 

  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函数

 

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

  

 

  代码实现:

  

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

 

  效果图:

  

 

  结果如下:

  

 

  

 

  

5.参考文章

 

  链接: geatpy说明文档.

  到此这篇关于python遗传算法之geatpy的深入理解的文章就介绍到这了,更多相关python遗传算法之geatpy内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: