GEATPY算法总览

一、涉及算法

Geatpy提供已实现的一些经典进化算法,可以有效解决单目标优化、多目标优化、组合优化、约束优化等问题,其中以“soea”开头的表示单目标进化优化算法;以“moea”开头的表示多目标进化优化算法;“soea”或“moea”字符串后面紧接着带一个“psy”字符串的表示该算法模板支持多染色体、复杂混合编码;带一个“multi”字符串的表示该算法模板支持多种群进化优化。查看详细代码

模块名功能
soea_DE_best_1_bin_templet差分进化DE/best/1/bin算法模板
soea_DE_best_1_L_templet差分进化DE/best/1/L算法模板
soea_DE_rand_1_bin_templet差分进化DE/rand/1/bin算法模板
soea_DE_rand_1_L_templet差分进化DE/rand/1/L算法模板
soea_DE_currentToBest_1_bin_templet差分进化DE/current-to-best/1/bin算法模板
soea_DE_currentToBest_1_L_templet差分进化DE/current-to-best/1/L算法模板
soea_DE_currentToRand_1_templet差分进化DE/current-to-rand/1算法模板
soea_DE_targetToBest_1_bin_templet差分进化DE/target-to-best/1/bin算法模板
soea_DE_targetToBest_1_L_templet差分进化DE/target-to-best/1/L算法模板
soea_ES_1_plus_1_templet(1+1)进化策略模板
soea_EGA_templet精英保留的遗传算法模板
soea_SEGA_templet增强精英保留的遗传算法模板
soea_SGA_templet最简单、最经典的遗传算法模板
soea_GGAP_SGA_templet带代沟的遗传算法模板
soea_steadyGA_templet稳态遗传算法模板
soea_studGA_templet种马遗传算法模板
soea_psy_EGA_templet精英保留的多染色体遗传算法模板
soea_psy_SEGA_templet增强精英保留的多染色体遗传算法模板
soea_psy_SGA_templet最简单、最经典的多染色体遗传算法模板
soea_psy_GGAP_SGA_templet带代沟的多染色体简单遗传算法模板
soea_psy_steadyGA_templet多染色体稳态遗传算法模板
soea_psy_studGA_templet多染色体种马遗传算法模板
moea_awGA_templet多目标优化awGA算法模板
moea_MOEAD_archive_templet带全局存档的多目标进化MOEA/D算法模板
moea_MOEAD_templet基于MOEA/D算法的多目标进化算法模板
moea_MOEAD_DE_templet基于MOEA/D-DE算法的多目标进化算法模板
moea_NSGA2_archive_templet带全局存档的多目标NSGA-II算法模板
moea_NSGA2_DE_templet多目标优化NSGA-II-DE算法模板
moea_NSGA2_templet多目标优化NSGA-II算法模板
moea_NSGA3_DE_templet多目标优化NSGA-III-DE算法模板
moea_NSGA3_templet多目标优化NSGA-III算法模板
moea_PPS_MOEAD_DE_archive_templetPPS-MOEA/D-DE算法模板
moea_RVEA_templet多目标优化RVEA算法模板
moea_RVEA_RES_templet多目标优化RVEA*算法模板
moea_psy_awGA_templet多染色体多目标优化awGA算法模板
moea_psy_NSGA2_archive_templet带存档的多染色体多目标NSGA-II算法模板
moea_psy_NSGA2_templet多染色体多目标优化NSGA-II算法模板
moea_psy_NSGA3_templet多染色体多目标优化NSGA-III算法模板
moea_psy_RVEA_templet多染色体多目标优化RVEA算法模板
moea_psy_RVEA_RES_templet多染色体多目标优化RVEA*算法模板
soea_multi_SEGA_templet增强精英保留的多种群协同遗传算法模板

二、测试问题及自定义问题 

多目标测试问题单目标测试问题旅行商测试问题
moea_test_BNHsoea_test_Ackleya280
moea_test_C-DTLZsoea_test_Bealeatt48
moea_test_CONsoea_test_Goldsteinch130
moea_test_DTLZsoea_test_Griewangkeil51
moea_test_Fonsecasoea_test_Pathologicaleil76
moea_test_OSYsoea_test_RastrigrinkroD100
moea_test_SRNsoea_test_Rosenbrockrand400
moea_test_UFsoea_test_Schwefelrat195
moea_test_WFGsoea_test_Shubertst70
moea_test_ZDTsoea_test_Spherets225

自定义问题:

可通过继承问题类(Problem)来完成对问题的相关设置,例如:

 自定义问题类用于描述待优化的问题,自定义了问题类后,便可以编写执行脚本调用进化算法模板来完成问题的求解。具体用法可详见“Geatpy快速入门”。

两点注意
1.上面代码里的calReferObjV()是用于计算或读取目标函数参考值,常常用待优化问题的理论全局最优解作为该参考值,用于后续进行评价进化结果的好坏。如果并不知道理论全局最优解是什么,可以不设置calReferObjV()函数。
2.编写目标函数值时要时刻注意满足Geatpy数据结构(详见“Geatpy数据结构”文档),上面代码中执行了Vars = pop.Phen后,得到的Vars为种群所有个体的决策变量组成的矩阵,即每一行对应一个个体的所有决策变量。随后,通过计算得到种群的目标函数值矩阵,赋值给ObjV。然后生成违反约束程度矩阵赋值给CV。Geatpy数据结构中要求种群对象的ObjV和CV都是Numpy array类型的二维数组(这里称之为矩阵),如果自定义aimFunc时ObjV和CV的格式有误,则会导致后面程序抛出异常及相关提示。

上面代码其实是采用了矩阵化的方法“同时”求出所有个体的目标函数值;而在某些时候,无法矩阵化计算,只能单独求出每个个体的目标函数值。此时,需要写一个循环遍历决策变量矩阵Vars的每一行,取出各个个体的决策变量,然后以之求出各个个体的目标函数值。待循环求解完所有个体的目标函数值后,把这些目标函数值拼合成ObjV矩阵即可

三、选择算子

可在Python中通过import geatpy as ea; 然后help(ea.模块名)查看各模块的用法。

模块名功能
dupDuplication,基于适应度排序的直接复制选择
ecsElite Copy Selection,精英复制选择
etour精英保留锦标赛选择
otosOne-to-One Survivor Selection,一对一生存者选择
rcsRandom Compensation Selection,随机补偿选择
rpsRandom Permutation Selection,随机排列选择
rwsRoulette Wheel Selection,轮盘赌选择
susStochastic Universal Sampling,随机抽样选择
tourTournament,锦标赛选择
ursUncommitted Random Selection,无约束随机选择

四、 重组算子

可在Python中通过import geatpy as ea; 然后help(ea.模块名)查看各重组算子模块的用法。

模块名功能
recdis离散重组
recint中间重组
reclin线性重组
recndx正态分布交叉
recsbx模拟二进制交叉
xovbd二项式分布交叉
xovdp两点交叉
xovexp指数交叉
xovox顺序交叉
xovpmx部分匹配交叉
xovsec洗牌指数交叉
xovsh洗牌交叉
xovsp单点交叉
xovud均匀分布交叉

注意:不同于变异算子的是,所有重组算子都不会检查重组结果是否满足所设边界范围。因此如果在进化算法中要让重组结果满足所设的染色体元素范围,则需要调用“ea.boundfix”函数进行边界修复,详见help(ea.boundfix)。

2.2.2版之后,Geatpy新增面向对象的重组算子类来进行重组。重组算子类见下表: 

模块名功能
Recdis离散重组算子类
Recint中间重组算子类
Reclin线性重组算子类
Recndx正态分布交叉算子类
Recsbx模拟二进制交叉算子类
Xovbd二项式分布交叉算子类
Xovdp两点交叉算子类
Xovexp指数交叉算子类
Xovmp多点交叉算子类
Xovox顺序交叉算子类
Xovpmx部分匹配交叉算子类
Xovsec洗牌指数交叉算子类
Xovsh洗牌交叉算子类
Xovsp单点交叉算子类
Xovud均匀分布交叉算子类

所有上述的重组算子类的文件均在“operators/recombination”文件夹中,每个重组算子类都直接继承“Recombination”重组算子类,有以下三个成员函数:

__init__()构造函数
do()执行函数,用于调用内核中同名(首字母小写)的重组函数执行重组
getHelp()查看对应内核中的重组算子的API文档

以“Recdis”离散重组算子类为例,其源码如下: 

# -*- coding: utf-8 -*-
from operators.recombination.Recombination import Recombination
from recdis import recdis
class Recdis(Recombination):
    """
    Recdis - class : 一个用于调用内核中的函数recdis(离散重组)的类,
                     该类的各成员属性与内核中的对应函数的同名参数含义一致,
                     可利用help(recdis)查看各参数的详细含义及用法。
    """
    def __init__(self, RecOpt = 0.7, Half = False, GeneID = None):
        self.RecOpt = RecOpt # 发生重组的概率
        self.Half = Half # 表示是否只保留一半重组结果
        self.GeneID = GeneID # 基因ID,是一个行向量,若设置了该参数,则该函数会对具有相同基因ID的染色体片段进行整体离散重组。
   
    def do(self, OldChrom): # 执行内核函数
        return recdis(OldChrom, self.RecOpt, self.Half, self.GeneID)
   
    def getHelp(self): # 查看内核中的重组算子的API文档
        help(recdis)

 在进行进化算法的过程中,如果需要调用离散重组算子,那么可以实例化一个离散重组算子类的对象,然后调用该对象的“do()”函数执行重组。例如:

import geatpy as ea
recOper = ea.Xovdp(XOVR = 1)
xxx = recOper.do(...)

具体调用方法可详见各算法模板的源码。
如果在进化过程中需要动态修改该重组算子的相关参数,可直接对其进行修改。

五、变异算子

可在Python中通过import geatpy as ea; 然后help(ea.模块名)查看各变异算子模块的用法。

模块名功能
mutbgaBreeder GA算法突变算子
mutbinMutation for Binary Chromosomes,二进制变异算子
mutdeMutation for Differential Evolution,差分变异算子
mutgauGaussian Mutation,高斯突变算子
mutinvInvertion Mutation,染色体片段逆转变异算子
mutmoveMutation by Moving,染色体片段移位变异算子
mutpolynPolynomial Mutation,多项式变异
mutppMutation of Permutation Chromosomes,排列编码变异算子
mutswapTwo Point Swapping Mutation,染色体两点互换变异算子
mutuniUniform Mutation,均匀变异算子

注意:对于mutbga、mutde、mutgau、mutpolyn、mutuni,变异是先按实数值来变异,然后对于标记了是离散型变量进行四舍五入。因此结果往往会是浮点“float”类型的,此时如果要把这些离散值用作其他变量的索引,需要对其进行强制类型转换。
2.2.2版之后,Geatpy新增面向对象的变异算子类来进行变异。变异算子类见下表: 

模块名功能
MutbgaBreeder GA算法突变算子类
MutbinMutation for Binary Chromosomes,二进制变异算子类
MutdeMutation for Differential Evolution,差分变异算子类
MutgauGaussian Mutation,高斯突变算子类
MutinvInvertion Mutation,染色体片段逆转变异算子类
MutmoveMutation by Moving,染色体片段移位变异算子类
MutpolynPolynomial Mutation,多项式变异类
MutppMutation of Permutation Chromosomes,排列编码变异算子类
MutswapTwo Point Swapping Mutation,染色体两点互换变异算子类
MutuniUniform Mutation,均匀变异算子类

所有上述的变异算子类的文件均在“operators/mutation”文件夹中,每个变异算子类都直接继承“Mutation”变异算子类,有以下三个成员函数: 

__init__()构造函数
do()执行函数,用于调用内核中同名(首字母小写)的变异函数执行变异
getHelp()查看对应内核中的变异算子的API文档

以“Mutpolyn”多项式变异算子类为例,其源码如下: 

# -*- coding: utf-8 -*-
from operators.mutation.Mutation import Mutation
from mutpolyn import mutpolyn
class Mutpolyn(Mutation):
    """
    Mutpolyn - class : 一个用于调用内核中的变异函数mutpolyn(多项式变异)的变异算子类,
    该类的各成员属性与内核中的对应函数的同名参数含义一致,
    可利用help(mutpolyn)查看各参数的详细含义及用法。
    """
def __init__(self, Pm = None, DisI = 20, FixType = 1, Parallel = False):
    self.Pm = Pm # 表示染色体上变异算子所发生作用的最小片段发生变异的概率
    self.DisI = DisI # 多项式变异中的分布指数
    self.FixType = FixType # 表示采用哪种方式来修复超出边界的染色体元素,可取值1,2,3,4,详细含义见help()帮助文档
    self.Parallel = Parallel # 表示是否采用并行计算,缺省时默认为False

def do(self, Encoding, OldChrom, FieldDR, *args): # 执行变异
    return mutpolyn(Encoding, OldChrom, FieldDR, self.Pm, self.DisI, self.FixType, self.Parallel)

def getHelp(self): # 查看内核中的变异算子的API文档
    help(mutpolyn)

在进行进化算法的过程中,如果需要调用多项式变异算子,那么可以实例化一个多项式变异算子类的对象,然后调用该对象的“do()”函数执行变异。例如:

import geatpy as ea
mutOper = ea.Mutpolyn(Pm = 0.01, DisI = 20)
xxx = mutOper.do(...)

具体调用方法可详见各算法模板的源码。
如果在进化过程中需要动态修改该变异算子的相关参数,如变异概率等,可直接对其进行修改。

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值