小白001---第二天:遗传算法---接第一天

本文概述了在主程序中逐步导入geatpy库进行算法设置,包括种群规模定义、编码方式选择,以及使用ea.crtfld函数创建译码矩阵。重点讲解了soea_SEGA_templet算法模板的实例化和关键参数配置。通过实例化算法并执行,展示了优化过程的监控和结果输出。
摘要由CSDN通过智能技术生成

今天看主程序,进度比较慢,希望今天能加油干呐~

import geatpy as ea  # import geatpy
from MyProblem import MyProblem  # 导入自定义问题接口

这一步还是先在main.py主程序导入算法库geatpy,这里from---import的用法:from会把变量名复制到另一个作用域,所以它就可以直接在脚本中使用复制后的变量名,而不用通过模块。

if __name__ == '__main__':

python的一个经典入口语句(可能类似c++里面的int main())

problem = MyProblem()  # 生成问题对象

调用之前写好的problem类生成一个新的对象

 Encoding = 'BG'  # 编码方式

使用二进制编码

 NIND = 40  # 种群规模

定义种群规模

Field = ea.crtfld(Encoding, problem.varTypes, problem.ranges, problem.borders)  # 创建区域描述器

这里要展开了解一下了,关于ea.crtfld()函数了

crtfld-译码矩阵生成函数

描述:该函数根据输入的参数生成译码FieldD或者FiedlDR

语法:
        当Encoding为'RI'或'P'时:
        FieldDR = crtfld(Encoding, varTypes, ranges, borders)
        FieldDR = crtfld(Encoding, varTypes, ranges, borders, precisions)
        当Encoding为'BG'时:
        FieldD = crtfld(Encoding, varTypes, ranges, borders, precisions)
        FieldD = crtfld(Encoding, varTypes, ranges, borders, precisions, codes)
        FieldD = crtfld(Encoding, varTypes, ranges, borders, precisions, codes, scales)

输入参数:
        Encoding : str   - 染色体编码方式,
                           'BG':二进制/格雷编码;
                           'RI':实整数编码,即实数和整数的混合编码;
                           'P':排列编码。
                           相关概念:“实值编码”包含实整数编码和排列编码,
                           它们共同的特点是染色体不需要解码即可直接表示对应的决策变量。
                           "实整数"指的是种群染色体既包含实数的小数,也包含实数的整数。
    
        varTypes : list/array  - 连续或离散标记,0表示该种群染色体解码后的对应的决策变量是连续的;
                           1表示该种群染色体解码后的变量是离散的。
                           当变量是离散时,该函数会对borders标记为0的变量的范围往里收缩并取整,
                           同时对其他非整数范围进行向里取整,最后把borders元素全设为1。例如:
                           若varTypes=[0, 1, 1],表示有3个变量,第1个变量是实数,第2、3个变量是整数。
                           此时若有:
                           ranges=[[1.1, 2, 3.1],
                                   [3,   4, 5]]
                           borders = [[1, 0, 1],
                                      [1, 1, 1]]
                           则ranges会被修正为[[1.1, 3, 4],
                                            [3, 4, 5]]
                           borders会被修正为:[[1, 1, 1],
                                             [1, 1, 1]]
                           注意:'P'(排列编码)时,会无条件地会把varTypes的元素设置成全为1。
    
        ranges  : array  - 代表自变量的范围矩阵,要求上界必须大于下界。
                          例如:[[1, 2, 3],
                                [3, 4, 5]]
                          表示有3个决策变量,其范围分别是1-3, 2-4, 3-5。
    
        borders : array  - (可选参数)代表是否包含变量范围的边界,为1代表决策变量的范围包含该边界,
                          当为None时,默认设置为全是1的矩阵。
                          例如:[[1, 0, 1],
                                [0, 1, 1]]
                          表示上面的三个决策变量的范围分别是:[1, 3)、(2, 4]、[3, 5]。
    
        precisions : list - (可选参数)缺省或为None时,默认它为元素全为4的列表。
                             1.当Encoding为'RI'时,precisions代表决策变量的“边界收缩率”,
                               其元素必须不小于1。当不含边界时,
                               变量范围会往里收缩0.1^precisions,最后把borders元素全设为1,
                               例如:ranges=[[1, 2, 3],
                                            [3, 4, 5]]
                                    borders = [[1, 0, 1],
                                               [0, 1, 1]]
                                    此时若precisions为[1, 1, 1],
                                    则ranges会被修正为[[1, 2.1, 3],
                                                     [2.9, 4, 5]]
                                    borders会被修正为:[[1, 1, 1],
                                                      [1, 1, 1]]
                              2.当Encoding为'BG'时,precisions代表决策变量的二进制/格雷编码精度,
                              (并不是指变量的显示结果保留到多少位),其的元素必须不小于0。
                              例如等于4,表示对应的决策变量的编码可以精确到小数点后4位。
                              当对应的决策变量为整数时,即便传入precisions,也不会产生作用,
                              这是因为整数的二进制/格雷码编码不需要用到精度。
                              例如:varTypes=[0, 1, 1],表示有3个变量,第1个变量是实数,第2、3个变量是整数,
                                   此时若precisions=[4,5,5],则precisions仅第1位是起作用的。
    
        codes  : list  -(可选参数)代表变量的编码方式,(0:binary | 1:gray),默认采用二进制编码。
                         该参数仅在Encoding为'BG'时有效。
    
        scales : list  - (可选参数)指明每个变量在解码时使用对数还是算术刻度(仅在Encoding为'BG'时有效),
                         0为使用算术刻度,1为使用对数刻度,默认采用算术刻度,
                         当采用对数刻度时,决策变量的范围不能包含0。
                         类似于precisions,scales仅对于varTypes中元素为0对应的变量起作用,
                         这同样是因为整数的二进制/格雷码编码不需要采用对数刻度进行变换。

输出参数:
        FieldD : array  - 二进制/格雷码种群译码矩阵,Encoding为'BG'时返回的是这种结构的译码矩阵。
            它是描述种群每个个体的染色体长度和如何解码的矩阵,它有以下结构:
            [lens;           每个决策变量编码后在染色体中所占的长度。
             lb;             指明每个变量使用的下界。
             ub;             指明每个变量使用的上界。
             codes;  (0:binary     | 1:gray) 指明子串是怎么编码的,
                                               0为标准二进制编码,1为格雷编码。
             scales;   (0: rithmetic | 1:logarithmic) 指明每个子串是否使用对数或算术刻度,
                                                      1为使用对数刻度,0为使用算术刻度。
             lbin;           (0:excluded   | 1:included)。
             ubin;           (0:excluded   | 1:included)。
             varTypes] (0:continued  | 1:discrete)。
            lbin和ubin指明范围中是否包含每个边界。
            lbin=0或ubin=0,表示范围中不包含相应边界。
            lbin=1或ubin=1,表示范围中包含相应边界。
    
        或FieldDR : array - 实值编码种群的译码矩阵,Encoding为'RI'或'P'时返回的是这种结构的译码矩阵。
            [lb;             指明每个变量使用的下界。
             ub;             指明每个变量使用的上界。
             varTypes] (0:continued | 1:discrete)。

population = ea.Population(Encoding, Field, NIND)  # 实例化种群对象(此时种群还没被初始化,仅仅是完成种群对象的实例化)

再建立好上面的译码矩阵后,调用geatpy库里面的Population去创建种群,这个类在昨天也遇到过,不过还是把官方的注释给出来一下

Population(Encoding, Field, NIND, Chrom=None, ObjV=None, FitnV=None, CV=None, Phen=None)
 |  
 |  Population : class - 种群类
 |  
 |  描述:
 |      种群类是用来存储种群相关信息的一个类。
 |  
 |  属性:
 |      sizes    : int   - 种群规模,即种群的个体数目。
 |      
 |      ChromNum : int   - 染色体的数目,即每个个体有多少条染色体。
 |      
 |      Encoding : str   - 染色体编码方式,
 |                         'BG':二进制/格雷编码;
 |                         'RI':实整数编码,即实数和整数的混合编码;
 |                         'P':排列编码。
 |                         相关概念:术语“实值编码”包含实整数编码和排列编码,
 |                         它们共同的特点是染色体不需要解码即可直接表示对应的决策变量。
 |                         "实整数"指的是种群染色体既包含实数的小数,也包含实数的整数。
 |                         特殊用法:
 |                         设置Encoding=None,此时种群类的Field,Chrom成员属性将被设置为None,
 |                         种群将不携带与染色体直接相关的信息,可以减少不必要的数据存储,
 |                         这种用法可以在只想统计非染色体直接相关的信息时使用,
 |                         尤其可以在多种群进化优化过程中对个体进行统一的适应度评价时使用。
 |      
 |      Field    : array - 译码矩阵,可以是FieldD或FieldDR(详见Geatpy数据结构)。
 |      
 |      Chrom    : array - 种群染色体矩阵,每一行对应一个个体的一条染色体。
 |      
 |      Lind     : int   - 种群染色体长度。
 |      
 |      ObjV     : array - 种群目标函数值矩阵,每一行对应一个个体的目标函数值,每一列对应一个目标。
 |      
 |      FitnV    : array - 种群个体适应度列向量,每个元素对应一个个体的适应度,最小适应度为0。
 |      
 |      CV       : array - CV(Constraint Violation Value)是用来定量描述违反约束条件程度的矩阵,每行对应一个个体,每列对应一个约束。
 |                         注意:当没有设置约束条件时,CV设置为None。
 |      
 |      Phen     : array - 种群表现型矩阵(即种群各染色体解码后所代表的决策变量所组成的矩阵)。
 |      
 |  函数:
 |   
 |  
 |  Methods defined here:
 |  
 |  __add__(self, pop)
 |      描述: 种群个体合并。
 |      
 |      用法: 假设pop1, pop2是两个种群,它们的个体数可以相等也可以不相等,此时
 |           pop = pop1 + pop2,即可完成对pop1和pop2两个种群个体的合并。
 |      
 |      注意:
 |          进行种群合并后,该函数不会对适应度进行主动重置,
 |          如果因种群合并而需要重新对所有个体的适应度进行评价,则需要手写代码更新种群的适应度。
 |  
 |  __getitem__(self, index)
 |      描述: 种群的切片,即根据index下标向量选出种群中相应的个体组成一个新的种群。
 |      
 |      用法: 假设pop是一个包含多于2个个体的种群矩阵,那么:
 |           pop1 = pop[[0,1]]即可得到由pop种群的第1、2个个体组成的种群。
 |      
 |      注意: index必须为一个slice或者为一个Numpy array类型的行向量或者为一个list类型的列表或者为一个整数,
 |           该函数不对传入的index参数的合法性进行更详细的检查。
 |  
 |  __init__(self, Encoding, Field, NIND, Chrom=None, ObjV=None, FitnV=None, CV=None, Phen=None)
 |      描述: 种群类的构造函数,用于实例化种群对象,例如:
 |           import geatpy as ea
 |           population = ea.Population(Encoding, Field, NIND),
 |           NIND为所需要的个体数。
 |           此时得到的population还没被真正初始化,仅仅是完成种群对象的实例化。
 |           该构造函数必须传入Chrom,才算是完成种群真正的初始化。
 |           一开始可以只传入Encoding, Field以及NIND来完成种群对象的实例化,
 |           其他属性可以后面再通过计算进行赋值。
 |           另外还可以利用ea.Population(Encoding, Field, 0)来创建一个“空种群”,即不含任何个体的种群对象。
 |  
 |  __len__(self)
 |      描述: 计算种群规模。
 |      
 |      用法: 假设pop是一个种群,那么len(pop)即可得到该种群的个体数。
 |           实际上,种群规模也可以通过pop.sizes得到。
 |  
 |  __setitem__(self, index, pop)
 |      描述: 种群个体的赋值
 |      用法: 假设pop是一个包含多于2个个体的种群矩阵,pop1是另一个包含2个个体的种群矩阵,那么
 |           pop[[0,1]] = pop1,即可完成将pop种群的第1、2个个体赋值为pop1种群的个体。
 |      注意: index必须为一个slice或者为一个Numpy array类型的行向量或者为一个list类型的列表或者为一个整数,
 |           该函数不对传入的index参数的合法性进行更详细的检查。
 |           此外,进行种群个体替换后,该函数不会对适应度进行主动重置,
 |           如果因个体替换而需要重新对所有个体的适应度进行评价,则需要手写代码更新种群的适应度。
 |  
 |  copy(self)
 |      copy : function - 种群的复制
 |      用法:
 |          假设pop是一个种群矩阵,那么:pop1 = pop.copy()即可完成对pop种群的复制。
 |  
 |  decoding(self)
 |      描述: 种群染色体解码。
 |  
 |  initChrom(self, NIND=None)
 |      描述: 初始化种群染色体矩阵。
 |      
 |      输入参数:
 |          NIND : int - (可选参数)用于修改种群规模。
 |                       当其不缺省时,种群在初始化染色体矩阵前会把种群规模调整为NIND。
 |      
 |      输出参数:
 |          无输出参数。
 |  
 |  save(self, dirName='Result')
 |      描述: 该函数将在字符串dirName所指向的文件夹下保存种群的信息,其中:
 |      "Encoding.txt"保存种群的染色体编码;
 |      "Field.csv"保存种群染色体的译码矩阵;
 |      "Chrom.csv"保存种群的染色体矩阵;
 |      "ObjV.csv"保存种群的目标函数矩阵;
 |      "FitnV.csv"保存种群个体的适应度列向量;
 |      "CV.csv"保存种群个体的违反约束程度矩阵;
 |      "Phen.csv"保存种群染色体表现型矩阵;
 |      注意:该函数不会对种群的合法性进行检查。
 |  
 |  shuffle(self)
 |      shuffle : function - 打乱种群个体的个体顺序
 |      用法: 假设pop是一个种群矩阵,那么,pop.shuffle()即可完成对pop种群个体顺序的打乱。

myAlgorithm = ea.soea_SEGA_templet(problem, population)  # 实例化一个算法模板对象

soea_SEGA_templet(problem, population)
 |  
 |  soea_SEGA_templet : class - Strengthen Elitist GA templet(增强精英保留的遗传算法模板)
 |  
 |  算法描述:
 |      本模板实现的是增强精英保留的遗传算法。算法流程如下:
 |      1) 根据编码规则初始化N个个体的种群。
 |      2) 若满足停止条件则停止,否则继续执行。
 |      3) 对当前种群进行统计分析,比如记录其最优个体、平均适应度等等。
 |      4) 独立地从当前种群中选取N个母体。
 |      5) 独立地对这N个母体进行交叉操作。
 |      6) 独立地对这N个交叉后的个体进行变异。
 |      7) 将父代种群和交叉变异得到的种群进行合并,得到规模为2N的种群。
 |      8) 从合并的种群中根据选择算法选择出N个个体,得到新一代种群。
 |      9) 回到第2步。
 |      该算法宜设置较大的交叉和变异概率,否则生成的新一代种群中会有越来越多的重复个体。
 |  
 |  Method resolution order:
 |      soea_SEGA_templet
 |      Algorithm.SoeaAlgorithm
 |      Algorithm.Algorithm
 |      builtins.object
 |  
 |  Methods defined here:
 |  
 |  __init__(self, problem, population)
 |      描述: 
 |          在该构造函数里只初始化静态参数以及对动态参数进行定义。
 |  
 |  run(self, prophetPop=None)
 |  
 |  ----------------------------------------------------------------------
 |  Methods inherited from Algorithm.SoeaAlgorithm:
 |  
 |  draw(self, pop, EndFlag=False)
 |      描述:
 |          该函数用于在进化过程中进行绘图。该函数在stat()以及finishing函数里面被调用。
 |      
 |      输入参数:
 |          pop     : class <Population> - 种群对象。
 |          
 |          EndFlag : bool - 表示是否是最后一次调用该函数。
 |      
 |      输出参数:
 |          无输出参数。
 |  
 |  finishing(self, pop)
 |      描述:
 |          进化完成后调用的函数。
 |      
 |      输入参数:
 |          pop : class <Population> - 种群对象。
 |      
 |      输出参数:
 |          [self.BestIndi, pop],其中pop为种群类型;BestIndi的类型与pop的一致。
 |      
 |      注意:
 |          若没有找到可行解,则返回的self.BestIndi为None。
 |  
 |  initialization(self)
 |      描述: 
 |          该函数用于在进化前对算法模板的一些动态参数进行初始化操作。
 |          该函数需要在执行算法模板的run()函数的一开始被调用,同时开始计时,
 |          以确保所有这些参数能够被正确初始化。
 |  
 |  logging(self, pop)
 |      描述:
 |          用于在进化过程中记录日志。该函数在stat()函数里面被调用。
 |          如果需要在日志中记录其他数据,需要在自定义算法模板类中重写该函数。
 |      
 |      输入参数:
 |          pop : class <Population> - 种群对象。
 |      
 |      输出参数:
 |          无输出参数。
 |  
 |  stat(self, pop)
 |      描述:
 |          该函数用于分析、记录和打印当代种群的信息。
 |          该函数会在terminated()函数里被调用。
 |      
 |      输入参数:
 |          pop : class <Population> - 种群对象。
 |      
 |      输出参数:
 |          无输出参数。
 |  
 |  terminated(self, pop)
 |      描述:
 |          该函数用于判断是否应该终止进化,population为传入的种群对象。
 |          该函数会在各个具体的算法模板类的run()函数中被调用。
 |      
 |      输入参数:
 |          pop : class <Population> - 种群对象。
 |      
 |      输出参数:
 |          True / False。

 |  Methods inherited from Algorithm.Algorithm:
 |  
 |  call_aimFunc(self, pop)
 |      使用注意:
 |          本函数调用的目标函数形如:aimFunc(pop), (在自定义问题类中实现)。
 |          其中pop为种群类的对象,代表一个种群,
 |          pop对象的Phen属性(即种群染色体的表现型)等价于种群所有个体的决策变量组成的矩阵。
 |          若不符合上述规范,则请修改算法模板或自定义新算法模板。
 |      
 |      描述:
 |          该函数调用自定义问题类中自定义的目标函数aimFunc()得到种群所有个体的目标函数值组成的矩阵,
 |          以及种群个体违反约束程度矩阵(假如在aimFunc()中构造了该矩阵的话)。
 |          该函数不返回任何的返回值,求得的目标函数值矩阵保存在种群对象的ObjV属性中,
 |          违反约束程度矩阵保存在种群对象的CV属性中。
 |      例如:population为一个种群对象,则调用call_aimFunc(population)即可完成目标函数值的计算。
 |           之后可通过population.ObjV得到求得的目标函数值,population.CV得到违反约束程度矩阵。
 |      
 |      输入参数:
 |          pop : class <Population> - 种群对象。
 |      
 |      输出参数:
 |          无输出参数。
 |  
 |  check(self, pop)
 |      描述:
 |          用于检查种群对象的ObjV和CV的数据是否有误。
 |      
 |      输入参数:
 |          pop : class <Population> - 种群对象。
 |      
 |      输出参数:
 |          无输出参数。
 |  
 |  display(self)
 |      描述:
 |          该函数打印日志log中每个键值的最后一条数据。假如log中只有一条数据或没有数据,则会打印表头。
 |          该函数将会在子类中被覆盖,以便进行更多其他的输出展示。

    myAlgorithm = ea.soea_SEGA_templet(problem, population)  # 实例化一个算法模板对象
    myAlgorithm.MAXGEN = 25  # 最大进化代数
    myAlgorithm.logTras = 1  # 设置每隔多少代记录日志,若设置成0则表示不记录日志
    myAlgorithm.verbose = True  # 设置是否打印输出日志信息
    myAlgorithm.drawing = 1  # 设置绘图方式(0:不绘图;1:绘制结果图;2:绘制目标空间过程动画;3:绘制决策空间过程动画)

上面调用的属性出自算法顶级父类以及次级SoeaAlgorithm

class Algorithm(builtins.object)
 |  Algorithm : class - 算法模板顶级父类
 |  
 |  描述:
 |      算法设置类是用来存储与算法运行参数设置相关信息的一个类。
 |  
 |  属性:
 |      name            : str      - 算法名称(可以自由设置名称)。
 |      
 |      problem         : class <Problem> - 问题类的对象。
 |  
 |      population      : class <Population> - 种群对象。
 |      
 |      MAXGEN          : int      - 最大进化代数。
 |      
 |      currentGen      : int      - 当前进化的代数。
 |      
 |      MAXTIME         : float    - 时间限制(单位:秒)。
 |      
 |      timeSlot        : float    - 时间戳(单位:秒)。
 |      
 |      passTime        : float    - 已用时间(单位:秒)。
 |      
 |      MAXEVALS        : int      - 最大评价次数。
 |      
 |      evalsNum        : int      - 当前评价次数。
 |      
 |      MAXSIZE         : int      - 最优个体的最大数目。
 |      
 |      logTras         : int      - Tras即周期的意思,该参数用于设置在进化过程中每多少代记录一次日志信息。
 |                                   设置为0表示不记录日志信息。
 |                                   注:此时假如设置了“每10代记录一次日志”而导致最后一代没有被记录,
 |                                       则会补充记录最后一代的信息,除非找不到可行解。
 |  
 |      log             : Dict     - 日志记录。其中包含2个基本的键:'gen'和'eval',其他键的定义由该算法类的子类实现。
 |                                   'gen'的键值为一个list列表,用于存储日志记录中的每一条记录对应第几代种群。
 |                                   'eval'的键值为一个list列表,用于存储进化算法的评价次数。
 |                                   注:若设置了logTras为0,则不会记录日志,此时log会被设置为None。
 |      
 |      verbose         : bool     - 表示是否在输入输出流中打印输出日志信息。
 |  
 |  函数:
 |      __init__()       : 构造函数,定义一些属性,并初始化一些静态参数。
 |  
 |      initialization() : 在进化前对算法模板的一些动态参数进行初始化操作,具体功能需要在继承类中实现。
 |      
 |      run()            : 执行函数,具体功能需要在继承类中实现。
 |  
 |      logging()        : 用于在进化过程中记录日志,具体功能需要在继承类中实现。
 |  
 |      stat()           : 用于分析当代种群的信息,具体功能需要在继承类中实现。
 |  
 |      terminated()     : 计算是否需要终止进化,具体功能需要在继承类中实现。
 |  
 |      finishing ()     : 进化完成后调用的函数,具体功能需要在继承类中实现。
 |  
 |      check()          : 用于检查种群对象的ObjV和CV的数据是否有误。
 |  
 |      call_aimFunc()   : 用于调用问题类中的aimFunc()进行计算ObjV和CV(若有约束)。
 |  
 |      display()        : 用于在进化过程中进行一些输出,需要依赖属性verbose和log属性。
 |  
 |  Methods defined here:
 |  
 |  __init__(self)
 |      描述: 
 |          构造函数。
 |  
 |  call_aimFunc(self, pop)
 |      使用注意:
 |          本函数调用的目标函数形如:aimFunc(pop), (在自定义问题类中实现)。
 |          其中pop为种群类的对象,代表一个种群,
 |          pop对象的Phen属性(即种群染色体的表现型)等价于种群所有个体的决策变量组成的矩阵。
 |          若不符合上述规范,则请修改算法模板或自定义新算法模板。
 |      
 |      描述:
 |          该函数调用自定义问题类中自定义的目标函数aimFunc()得到种群所有个体的目标函数值组成的矩阵,
 |          以及种群个体违反约束程度矩阵(假如在aimFunc()中构造了该矩阵的话)。
 |          该函数不返回任何的返回值,求得的目标函数值矩阵保存在种群对象的ObjV属性中,
 |          违反约束程度矩阵保存在种群对象的CV属性中。
 |      例如:population为一个种群对象,则调用call_aimFunc(population)即可完成目标函数值的计算。
 |           之后可通过population.ObjV得到求得的目标函数值,population.CV得到违反约束程度矩阵。
 |      
 |      输入参数:
 |          pop : class <Population> - 种群对象。
 |      
 |      输出参数:
 |          无输出参数。
 |  
 |  check(self, pop)
 |      描述:
 |          用于检查种群对象的ObjV和CV的数据是否有误。
 |      
 |      输入参数:
 |          pop : class <Population> - 种群对象。
 |      
 |      输出参数:
 |          无输出参数。
 |  
 |  display(self)
 |      描述:
 |          该函数打印日志log中每个键值的最后一条数据。假如log中只有一条数据或没有数据,则会打印表头。
 |          该函数将会在子类中被覆盖,以便进行更多其他的输出展示。
 |  
 |  finishing(self, pop)
 |  
 |  initialization(self)
 |  
 |  logging(self, pop)
 |  
 |  run(self, pop)
 |  
 |  stat(self, pop)
 |  
 |  terminated(self, pop)

class SoeaAlgorithm(Algorithm)
 |  SoeaAlgorithm(problem, population)
 |  
 |  描述:
 |      此为单目标进化优化算法模板的父类,所有单目标优化算法模板均继承自该父类。
 |  
 |  对比于父类该类新增的变量和函数:
 |  
 |      trappedValue    : int  - 进化算法陷入停滞的判断阈值。
 |  
 |      maxTrappedCount : int  - “进化停滞”计数器最大上限值。
 |  
 |      drawing         : int  - 绘图方式的参数,
 |                               0表示不绘图;
 |                               1表示绘制进化过程中种群的平均及最优目标函数值变化图;
 |                               2表示实时绘制目标空间过程动画;
 |                               3表示实时绘制决策空间动态图。
 |          
 |      ----------------- 以下为用户不需要设置的属性 -----------------
 |  
 |      BestIndi        : class <Population> - 存储算法所找到的最优的个体。
 |  
 |      trace           : dict - 进化记录器,可以看作是一个内部日志,用于记录每一代种群的一些信息。
 |                               它与算法类的log类似,它有两个键:'f_best'以及'f_avg'。
 |                               'f_best'的键值为一个list列表,存储着每一代种群最优个体的目标函数值;
 |                               'f_avg'的键值为一个list列表,存储着每一代种群所有个体的平均目标函数值。
 |  
 |      trappedCount    : int  - “进化停滞”计数器。
 |  
 |      draw()          : 绘图函数。
 |  
 |  Method resolution order:
 |      SoeaAlgorithm
 |      Algorithm
 |      builtins.object
 |  
 |  Methods defined here:
 |  
 |  __init__(self, problem, population)
 |      描述: 
 |          在该构造函数里只初始化静态参数以及对动态参数进行定义。
 |  
 |  draw(self, pop, EndFlag=False)
 |      描述:
 |          该函数用于在进化过程中进行绘图。该函数在stat()以及finishing函数里面被调用。
 |      
 |      输入参数:
 |          pop     : class <Population> - 种群对象。
 |          
 |          EndFlag : bool - 表示是否是最后一次调用该函数。
 |      
 |      输出参数:
 |          无输出参数。
 |  
 |  finishing(self, pop)
 |      描述:
 |          进化完成后调用的函数。
 |      
 |      输入参数:
 |          pop : class <Population> - 种群对象。
 |      
 |      输出参数:
 |          [self.BestIndi, pop],其中pop为种群类型;BestIndi的类型与pop的一致。
 |      
 |      注意:
 |          若没有找到可行解,则返回的self.BestIndi为None。
 |  
 |  initialization(self)
 |      描述: 
 |          该函数用于在进化前对算法模板的一些动态参数进行初始化操作。
 |          该函数需要在执行算法模板的run()函数的一开始被调用,同时开始计时,
 |          以确保所有这些参数能够被正确初始化。
 |  
 |  logging(self, pop)
 |      描述:
 |          用于在进化过程中记录日志。该函数在stat()函数里面被调用。
 |          如果需要在日志中记录其他数据,需要在自定义算法模板类中重写该函数。
 |      
 |      输入参数:
 |          pop : class <Population> - 种群对象。
 |      
 |      输出参数:
 |          无输出参数。
 |  
 |  stat(self, pop)
 |      描述:
 |          该函数用于分析、记录和打印当代种群的信息。
 |          该函数会在terminated()函数里被调用。
 |      
 |      输入参数:
 |          pop : class <Population> - 种群对象。
 |      
 |      输出参数:
 |          无输出参数。
 |  
 |  terminated(self, pop)
 |      描述:
 |          该函数用于判断是否应该终止进化,population为传入的种群对象。
 |          该函数会在各个具体的算法模板类的run()函数中被调用。
 |      
 |      输入参数:
 |          pop : class <Population> - 种群对象。
 |      
 |      输出参数:
 |          True / False。
 |  
 |  ----------------------------------------------------------------------
 |  Methods inherited from Algorithm:
 |  
 |  call_aimFunc(self, pop)
 |      使用注意:
 |          本函数调用的目标函数形如:aimFunc(pop), (在自定义问题类中实现)。
 |          其中pop为种群类的对象,代表一个种群,
 |          pop对象的Phen属性(即种群染色体的表现型)等价于种群所有个体的决策变量组成的矩阵。
 |          若不符合上述规范,则请修改算法模板或自定义新算法模板。
 |      
 |      描述:
 |          该函数调用自定义问题类中自定义的目标函数aimFunc()得到种群所有个体的目标函数值组成的矩阵,
 |          以及种群个体违反约束程度矩阵(假如在aimFunc()中构造了该矩阵的话)。
 |          该函数不返回任何的返回值,求得的目标函数值矩阵保存在种群对象的ObjV属性中,
 |          违反约束程度矩阵保存在种群对象的CV属性中。
 |      例如:population为一个种群对象,则调用call_aimFunc(population)即可完成目标函数值的计算。
 |           之后可通过population.ObjV得到求得的目标函数值,population.CV得到违反约束程度矩阵。
 |      
 |      输入参数:
 |          pop : class <Population> - 种群对象。
 |      
 |      输出参数:
 |          无输出参数。
 |  
 |  check(self, pop)
 |      描述:
 |          用于检查种群对象的ObjV和CV的数据是否有误。
 |      
 |      输入参数:
 |          pop : class <Population> - 种群对象。
 |      
 |      输出参数:
 |          无输出参数。
 |  
 |  display(self)
 |      描述:
 |          该函数打印日志log中每个键值的最后一条数据。假如log中只有一条数据或没有数据,则会打印表头。
 |          该函数将会在子类中被覆盖,以便进行更多其他的输出展示。
 |  
 |  run(self, pop)

   [BestIndi, population] = myAlgorithm.run()  # 执行算法模板,得到最优个体以及最后一代种群
    BestIndi.save()  # 把最优个体的信息保存到文件中

执行算法模板并且储存

print('评价次数:%s' % myAlgorithm.evalsNum)
    print('时间已过 %s 秒' % myAlgorithm.passTime)
python中print的用法
string="hello" #%s打印时结果是hello print "string=%s" % string # output: string=hello 
 if BestIndi.sizes != 0:
        print('最优的目标函数值为:%s' % BestIndi.ObjV[0][0])
        print('最优的控制变量值为:')
        for i in range(BestIndi.Phen.shape[1]):
            print(BestIndi.Phen[0, i])
    else:
        print('没找到可行解。')

判断有没有找到可行解

全部代码:main.py

# -*- coding: utf-8 -*-
import geatpy as ea  # import geatpy
from MyProblem import MyProblem  # 导入自定义问题接口

if __name__ == '__main__':
    """===============================实例化问题对象==========================="""
    problem = MyProblem()  # 生成问题对象
    """=================================种群设置=============================="""
    Encoding = 'BG'  # 编码方式
    NIND = 40  # 种群规模
    Field = ea.crtfld(Encoding, problem.varTypes, problem.ranges, problem.borders)  # 创建区域描述器
    population = ea.Population(Encoding, Field, NIND)  # 实例化种群对象(此时种群还没被初始化,仅仅是完成种群对象的实例化)
    """===============================算法参数设置============================="""
    myAlgorithm = ea.soea_SEGA_templet(problem, population)  # 实例化一个算法模板对象
    myAlgorithm.MAXGEN = 25  # 最大进化代数
    myAlgorithm.logTras = 1  # 设置每隔多少代记录日志,若设置成0则表示不记录日志
    myAlgorithm.verbose = True  # 设置是否打印输出日志信息
    myAlgorithm.drawing = 1  # 设置绘图方式(0:不绘图;1:绘制结果图;2:绘制目标空间过程动画;3:绘制决策空间过程动画)
    """==========================调用算法模板进行种群进化========================"""
    [BestIndi, population] = myAlgorithm.run()  # 执行算法模板,得到最优个体以及最后一代种群
    BestIndi.save()  # 把最优个体的信息保存到文件中
    """=================================输出结果=============================="""
    print('评价次数:%s' % myAlgorithm.evalsNum)
    print('时间已过 %s 秒' % myAlgorithm.passTime)
    if BestIndi.sizes != 0:
        print('最优的目标函数值为:%s' % BestIndi.ObjV[0][0])
        print('最优的控制变量值为:')
        for i in range(BestIndi.Phen.shape[1]):
            print(BestIndi.Phen[0, i])
    else:
        print('没找到可行解。')

 MyProblem.py

# -*- coding: utf-8 -*-
import numpy as np
import geatpy as ea

"""
该案例展示了一个简单的连续型决策变量最大化目标的单目标优化问题。
max f = x * np.sin(10 * np.pi * x) + 2.0
s.t.
-1 <= x <= 2
"""


class MyProblem(ea.Problem):  # 继承Problem父类
    def __init__(self):
        name = 'MyProblem'  # 初始化name(函数名称,可以随意设置)
        M = 1  # 初始化M(目标维数)
        maxormins = [-1]  # 初始化maxormins(目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标)
        Dim = 1  # 初始化Dim(决策变量维数)
        varTypes = [0] * Dim  # 初始化varTypes(决策变量的类型,元素为0表示对应的变量是连续的;1表示是离散的)
        lb = [-1]  # 决策变量下界
        ub = [2]  # 决策变量上界
        lbin = [1] * Dim  # 决策变量下边界(0表示不包含该变量的下边界,1表示包含)
        ubin = [1] * Dim  # 决策变量上边界(0表示不包含该变量的上边界,1表示包含)
        # 调用父类构造方法完成实例化
        ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin)

    def aimFunc(self, pop):  # 目标函数
        x = pop.Phen  # 得到决策变量矩阵
        pop.ObjV = x * np.sin(10 * np.pi * x) + 2.0  # 计算目标函数值,赋值给pop种群对象的ObjV属性

以上代码引用的是官方网站给出的第一个案例,附上链接:geatpy/MyProblem.py at master · geatpy-dev/geatpy · GitHub

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值