一、涉及算法
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_templet | PPS-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_BNH | soea_test_Ackley | a280 |
moea_test_C-DTLZ | soea_test_Beale | att48 |
moea_test_CON | soea_test_Goldstein | ch130 |
moea_test_DTLZ | soea_test_Griewangk | eil51 |
moea_test_Fonseca | soea_test_Pathological | eil76 |
moea_test_OSY | soea_test_Rastrigrin | kroD100 |
moea_test_SRN | soea_test_Rosenbrock | rand400 |
moea_test_UF | soea_test_Schwefel | rat195 |
moea_test_WFG | soea_test_Shubert | st70 |
moea_test_ZDT | soea_test_Sphere | ts225 |
自定义问题:
可通过继承问题类(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.模块名)查看各模块的用法。
模块名 | 功能 |
dup | Duplication,基于适应度排序的直接复制选择 |
ecs | Elite Copy Selection,精英复制选择 |
etour | 精英保留锦标赛选择 |
otos | One-to-One Survivor Selection,一对一生存者选择 |
rcs | Random Compensation Selection,随机补偿选择 |
rps | Random Permutation Selection,随机排列选择 |
rws | Roulette Wheel Selection,轮盘赌选择 |
sus | Stochastic Universal Sampling,随机抽样选择 |
tour | Tournament,锦标赛选择 |
urs | Uncommitted 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.模块名)查看各变异算子模块的用法。
模块名 | 功能 |
mutbga | Breeder GA算法突变算子 |
mutbin | Mutation for Binary Chromosomes,二进制变异算子 |
mutde | Mutation for Differential Evolution,差分变异算子 |
mutgau | Gaussian Mutation,高斯突变算子 |
mutinv | Invertion Mutation,染色体片段逆转变异算子 |
mutmove | Mutation by Moving,染色体片段移位变异算子 |
mutpolyn | Polynomial Mutation,多项式变异 |
mutpp | Mutation of Permutation Chromosomes,排列编码变异算子 |
mutswap | Two Point Swapping Mutation,染色体两点互换变异算子 |
mutuni | Uniform Mutation,均匀变异算子 |
注意:对于mutbga、mutde、mutgau、mutpolyn、mutuni,变异是先按实数值来变异,然后对于标记了是离散型变量进行四舍五入。因此结果往往会是浮点“float”类型的,此时如果要把这些离散值用作其他变量的索引,需要对其进行强制类型转换。
2.2.2版之后,Geatpy新增面向对象的变异算子类来进行变异。变异算子类见下表:
模块名 | 功能 |
Mutbga | Breeder GA算法突变算子类 |
Mutbin | Mutation for Binary Chromosomes,二进制变异算子类 |
Mutde | Mutation for Differential Evolution,差分变异算子类 |
Mutgau | Gaussian Mutation,高斯突变算子类 |
Mutinv | Invertion Mutation,染色体片段逆转变异算子类 |
Mutmove | Mutation by Moving,染色体片段移位变异算子类 |
Mutpolyn | Polynomial Mutation,多项式变异类 |
Mutpp | Mutation of Permutation Chromosomes,排列编码变异算子类 |
Mutswap | Two Point Swapping Mutation,染色体两点互换变异算子类 |
Mutuni | Uniform 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(...)
具体调用方法可详见各算法模板的源码。
如果在进化过程中需要动态修改该变异算子的相关参数,如变异概率等,可直接对其进行修改。