python geatpy,遗传算法的python代码

  python geatpy,遗传算法的python代码

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

  Website (including documentation):http://www.geatpy.comDemo:https://github.com/geatpy-dev/geatpy/tree/master/geatpy/DemoPypi page:GEAT PY pypiContact us:AboutGEAT PYBug reports:issues . GEAT PY-dev/GEAT PY GitHubNotice:Announcement-GEAT PYFAQ:常见问题GEAT PY GEAT PY提供了许多遗传和进化算法相关算子的库函数,如,并提供了许多已实现的进化算法模板来实现多样化的进化算法。其执行效率高于一些知名的Matlab、Java、Python编写的工具箱、平台或框架,学习成本低,模块解耦度高,扩展性强。

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

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

  废话少说.以下是安装和使用它的方法:

  先说安装方法:

  首先windows系统,Python版本3.5,3.6或者3.7,安装pip。只需在控制台执行它。

  安装pip齿轮py可以成功安装。或者从github下载源代码进行编译安装:https://github.com/geatpy-dev/geatpy.建议直接用pip安装。因为方便后续更新。为了方便运行演示代码和查看源代码及官方教程文档,我也在github上下载了(不过还是用pip安装的)。

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

  先说更新方法:

  Geatpy持续更新。您可以通过以下命令使您计算机上的版本与最新的官方版本一致:

  Pip-升级GEAT PY如果在更新过程中遇到- user 错误的问题,这是用PIP安装时遇到的常见问题之一。意味着您需要以管理员身份运行:

  Pip-user-upgrade Geat Py Geat Py提供了两种使用进化算法解决问题的方法。先说第一个基础实现:写编程脚本。

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

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

  直接编写脚本,如下所示:

   demo . py Import numpy as NP Import geat py as ea # Import the geat py lib importmatplotlib . py plot as PLT Import time =======================目标函数======================传入群体染色体矩阵解码后的基因表型矩阵return x * NP.sin (10 * NP.pi * x) 2.0x=NP.linspace (-1,2,200) PLT.plot (x,Aim(x)) #绘制目标函数图像 ================================================1]#自变量边界varTypes=np.array([0]) #自变量类型,0表示连续,1表示离散编码=BG # BG 表示二进制/drddx编码代码=[1] #变量编码方式,两个变量由drddx编码。 precisions=[4] #变量的编码精度scales=[0] #使用算术标度ranges=np.vstack([x1])。T #生成自变量的极差矩阵borders=np.vstack([b1])。T #生成自变量的边界矩阵 =====================遗传算法的参数设置=================================== nind #种群中的个体数MAXGEN=25#最大遗传代数fieldd=ea.crtfld (encoding,vartypes,ranges,borders,precision,codes,scales) #调用函数创建区域描述符Lind=int(np.sum(FieldD[0,))#计算编码的染色体长度obj _ trace=NP . zeros((maxgen,2)) #定义目标函数值记录器var _ trace=NP . zeros((maxgen,lind)) #定义染色体记录器, 记录每一代中最优秀个体的染色体 ====================启动遗传算法进化================================================ Start _ Lind)# 生成种群染色体矩阵variable=ea.bs2ri(Chrom,D) #解码初始种群ObjV=aim(variable) #计算初始种群中个体的目标函数值best_ind=np.argmax(ObjV) #计算当代最优秀个体的序号#开始进化为gen in range(MAXGEN):FitnV=ea . ranking(-ObjV)#根据目标函数的大小分配适应度值(因为遵循目标最小化约定, 最大化问题目标函数值要乘以-1)selch=chrom[ea . selecting( RWS ,fitnv,nine-1),] # Select,采用 RWS 轮盘赌轮盘选择selch=ea。 recombun( XO VSP ,selch,0.7) #重组(采用两点杂交法,杂交概率为0.7) SelCh=ea.mutbin(编码,Sel) #二进制群体变异#结合父代与子代的精英个体chrom=NP . v stack([chrom[best _ ind,selch]) variable=ea.bs2ri (chrom,D) #解码繁殖群体(二进制到十进制)ObjV=aim(variable) #求繁殖个体的目标函数值#记录best_ind=npsum (objv)/nine #记录当代人口的平均目标函数obj _ trace [gen,1]=objv [best _ ind] #记录当代人口的最优个体目标函数值var _ trace [gen,]=chrom [best _ ind,] #记录当代种群中最优秀个体的变量值#进化完成end_time=time.time() #结束时间 ========================输出结果和图纸===================================Obj _ trace[best _ gen, 1]) #输出目标函数最大变量=ea.bs2ri (var _ trace [[best _ gen],],D) #解码得到表型print(对应的决策变量值为:)print(variable[0][0]) #因为这里的variable是一个矩阵,所以用[0][0]取出元素print (time:,end _ time-start _ time)PLT . plot(variable)AIM(variable), bo) EA . TRC Plot (obj _ trace,[[种群个体平均目标函数值,种群个体最优目标函数值]])运行结果如下:

  目标函数的最大值:3.3000000000001

  相应的决策变量值为:

  1.8505813776055176

  时间:0.2000000000005

  仔细看上面的代码,我们会发现Geatpy的写法和Matlab很像。有Matlab相关编程经验的基本可以无缝转移到Python来使用Geatpy进行遗传算法程序开发。

  Geatpy提供了详细的API文档。例如,要查看上面代码中的‘ranking’函数是做什么的,可以在python中执行。

  将gear py作为gahelp (ga。排名)以查看“排名”功能的相关用法。

  此外,官网上还有更详细的Geatpy教程:DocumentationGEAT PY。

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

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

  这里给出一个用NSGA-算法求解多目标优化函数ZDT-1的gxdxlc前沿的例子:

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

  #-*-编码:UTF-8-*- my problem . py import numpy as NP import geat py as ea class my problem(ea . problem):#继承问题的父类def __init__(self)。name=ZDT1 #初始化名称(函数名,可以随意设置)M=2 #初始化M(目标维度)maxormins=[1] * M #初始化maxormins(目标最小最大化标记列表,1:最小化目标;-1:最大化这个目标)Dim=30 # initialize Dim(决策变量的维数)varTypes=[0]* Dim # initialize varTypes(决策变量的类型,0:实数;1: integer) 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 aim func (self,pop): #目标函数Vars=pop。Phen #获取决策变量矩阵ObjV1=Vars[:0] gx=1 9 * np.mean(Vars[:1:30],1)hx=1-NP . sqrt(obj v1/GX)obj v2=GX * hx pop。ObjV=np.array([ObjV1,Obv2])。T #将结果赋值给ObjV def calReferObjV(self): #计算全局最优解作为目标函数参考值N=10000 #生成10000个参考点ObjV1=np.linspace(0,1,N)obj v2=1-NP . sqrt(obj v1)globalbestobjv=NP . array([obj v1,objv2])。treturn globalbestobjv在上面的代码中,question类的构造函数__init__()用于定义一些与ZDT1试题相关的参数,比如决策变量的范围、类型、边界等。AimFunc()是要优化的目标函数。CalReferObjV()用于计算理论的全局最优解。这个理论上的最优解可以通过计算或者从外部文件导入数据得到。如果要解决的问题没有或者不知道理论最优解是什么,这个calReferObjV()函数可以省略,不写。

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

  #-*-编码:utf-8-*-import geart py as ea # import geart py from my problem import my problem if _ _ name _ _= _ _ main _ :problem=my problem()# Generate problem object # The algorithm algorithm=ea。moea _ nsga2 _ template(问题,ea。种群(编码= ri ,nind=50),maxgen=200,#最大进化代数。LogTras=1) #表示记录多少代日志信息,0表示不记录。# Solve res=ea.optimize(算法,verbose=true,drawing=1,output msg=true,drawlog=false,saveflag=false,dirname= result )。运行结果如下:

  在上面的代码中已经对每个过程做了详细的注释。其中进化算法的核心逻辑写在进化算法的模板里,可以查看相应的源代码。此外,我们还可以参考Geatpy进化算法模板的源代码,定制算法模板,实现多种进化算法,如各种改进的进化算法等。

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

  这意味着群体中有3个个体和2个待优化的目标。

  下面的博客将深入了解Geatpy的数据结构,进化算法框架的使用和扩展,并讨论框架的核心————进化算法模板的实现。我们还会讲一些使用Geatpy解决问题的案例。欢迎跟进~谢谢!

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

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