Python遗传算法Geatpy工具箱使用介绍

目录
  • 一、 什么是遗传算法?
  • 二、 遗传算法库Geatpy
    • 2.1 遗传算法工具箱Geatpy参数介绍
  • 三、最佳实践
    • 3.1 代码示例 | 参数模板
    • 3.2 最佳实践

一、 什么是遗传算法?

遗传算法是仿真生物遗传学和自然选择机理,通过人工方式所构造的一类搜索算法,从某种程度上说遗传算法是对生物进化过程进行的数学方式仿真。生物种群的生存过程普遍遵循达尔文进化准则,群体中的个体根据对环境的适应能力而被大自然所选择或淘汰。进化过程的结果反映在个体的结构上,其染色体包含若干基因,相应的表现型和基因型的联系体现了个体的外部特性与内部机理间逻辑关系。通过个体之间的交叉、变异来适应大自然环境。生物染色体用数学方式或计算机方式来体现就是一串数码,仍叫染色体,有时也叫个体;适应能力是对应着一个染色体的一个数值来衡量;染色体的选择或淘汰则按所面对的问题是求最大还是最小来进行。

二、 遗传算法库Geatpy

2.1 遗传算法工具箱Geatpy参数介绍

API官方参考文档

population参数【重要属性:Chrom,Phen,Objv,CV,FitnV】

  • sizes : int - 种群规模,即种群的个体数目。
  • ChromNum : int - 染色体的数目,即每个个体有多少条染色体。
  • Encoding : str - 染色体编码方式, 'BG':二进制/格雷编码; 'RI':实整数编码,即实数和整数的混合编码; 'P':排列编码
  • Field : array - 译码矩阵
  • Chrom : array - 种群染色体矩阵,每一行对应一个个体的一条染色体。
  • Lind : int - 种群染色体长度。
  • ObjV : array - 种群目标函数值矩阵,每一行对应一个个体的目标函数值,每一列对应一个目标
  • FitnV : array - 种群个体适应度列向量,每个元素对应一个个体的适应度,最小适应度为0
  • CV : array - CV(Constraint Violation Value)是用来定量描述违反约束条件程度的矩阵,每行对应一个个体,每列对应一个约束
  • Phen : array - 种群表现型矩阵(即种群各染色体解码后所代表的决策变量所组成的矩阵)。
  • 如果通过CV矩阵基于可行性法则进行约束的设置,那么 不等式约束需要 ≤,等式约束 需要传入abs( ) (因为遵循值越大,适应度越小的原则)

  • ea.Problem.init()中的lbin与ubin(决策变量范围边界矩阵)表示范围区间的开闭,1闭合0开区间

Geatpy 结果参数介绍

success: True or False, 表示算法是否成功求解。

stopMsg: 存储着算法停止原因的字符串。

optPop: 存储着算法求解结果的种群对象。如果无可行解,则optPop.sizes=0。optPop.Phen为决策变量矩阵,optPop.ObjV为目标函数值矩阵。

lastPop: 算法进化结束后的最后一代种群对象。

Vars: 等于optPop.Phen,此处即最优解。若无可行解,则Vars=None。

ObjV: 等于optPop.ObjV,此处即最优解对应的目标函数值。若无可行解,ObjV=None。

CV: 等于optPop.CV,此处即最优解对应的违反约束程度矩阵。若无可行解,CV=None。

startTime: 程序执行开始时间。

endTime: 程序执行结束时间。

executeTime: 算法 所用时间。

nfev: 算法评价次数

gd: (多目标优化且给定了理论最优解时才有) GD指标值。

igd: (多目标优化且给定了理论最优解时才有) IGD指标值。

hv: (多目标优化才有) HV指标值。

spacing: (多目标优化才有) Spacing指标值。

三、最佳实践

3.1 代码示例 | 参数模板

解集:

header_regex = '|'.join(['{}'] * len(headers))
header_str = header_regex.format(*[str(key).center(width) for key, width in zip(headers, widths)])
print("=" * len(header_str))
            print(header_str)
            print("-" * len(header_str))

gen: 进化代数      
eval:记录评价次数        
f\_opt: 当代最优个体的目标函数值           
f\_max=当代种群最大函数值          
f\_min 最小   f\_avg : 平均水平          
f\_std: 标准约束水平

3.2 最佳实践

使用geatpy库求解有向无环图最短路

代码【最短路】一:使用geatpy库

import numpy as np
import geatpy as ea
class MyProblem(ea.Problem):  # 继承Problem父类
    def __init__(self):
        name = 'Shortest_Path'  # 初始化name(函数名称,可以随意设置)
        M = 1  # 初始化M(目标维数)
        maxormins = [1]  # 初始化maxormins(目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标)
        Dim = 10  # 初始化Dim(决策变量维数)
        varTypes = [1] * Dim  # 初始化varTypes(决策变量的类型,元素为0表示对应的变量是连续的;1表示是离散的)
        lb = [0] * Dim  # 决策变量下界
        ub = [9] * Dim  # 决策变量上界
        lbin = [1] * Dim  # 决策变量下边界 1表示闭合区间,0表示开区间
        ubin = [1] * Dim  # 决策变量上边界
        # 调用父类构造方法完成实例化
        ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin)
        # 设置每一个结点下一步可达的结点(结点从1开始数,因此列表nodes的第0号元素设为空列表表示无意义)
        self.nodes = [[], [2, 3], [3, 4, 5], [5, 6], [7, 8], [4, 6], [7, 9], [8, 9], [9, 10], [10]]
        # 设置有向图中各条边的权重
        self.weights = {'(1, 2)': 36, '(1, 3)': 27, '(2, 4)': 18, '(2, 5)': 20, '(2, 3)': 13, '(3, 5)': 12,
                        '(3, 6)': 23,
                        '(4, 7)': 11, '(4, 8)': 32, '(5, 4)': 16, '(5, 6)': 30, '(6, 7)': 12, '(6, 9)': 38,
                        '(7, 8)': 20,
                        '(7, 9)': 32, '(8, 9)': 15, '(8, 10)': 24, '(9, 10)': 13}
    def decode(self, priority):  # 将优先级编码的染色体解码得到一条从节点1到节点10的可行路径
        edges = []  # 存储边
        path = [1]  # 结点1是路径起点
        while not path[-1] == 10:  # 开始从起点走到终点
            currentNode = path[-1]  # 得到当前所在的结点编号
            nextNodes = self.nodes[currentNode]  # 获取下一步可达的结点组成的列表
            chooseNode = nextNodes[np.argmax(
                priority[np.array(nextNodes) - 1])]  # 从NextNodes中选择优先级更高的结点作为下一步要访问的结点,因为结点从1数起,而下标从0数起,因此要减去1
            path.append(chooseNode)
            edges.append((currentNode, chooseNode))
        return path, edges
    def aimFunc(self, pop):  # 目标函数
        pop.ObjV = np.zeros((pop.sizes, 1))  # 初始化ObjV
        for i in range(pop.sizes):  # 遍历种群的每个个体,分别计算各个个体的目标函数值
            priority = pop.Phen[i, :]
            path, edges = self.decode(priority)  # 将优先级编码的染色体解码得到访问路径及经过的边
            pathLen = 0
            for edge in edges:
                key = str(edge)  # 根据路径得到键值,以便根据键值找到路径对应的长度
                if not key in self.weights:
                    raise RuntimeError("Error in aimFunc: The path is invalid. (当前路径是无效的。)", path)
                pathLen += self.weights[key]  # 将该段路径长度加入
            pop.ObjV[i] = pathLen  # 计算目标函数值,赋值给pop种群对象的ObjV属性
## 执行脚本
if __name__ == "__main__":
    # 实例化问题对象
    problem = MyProblem()
    # 构建算法
    algorithm = ea.soea_EGA_templet(problem,
                                    ea.Population(Encoding='RI', NIND=4),
                                    MAXGEN=10,  # 最大进化代数
                                    logTras=1)  # 表示每隔多少代记录一次日志信息
    # 求解
    res = ea.optimize(algorithm, verbose=True, drawing=1, outputMsg=False, drawLog=False, saveFlag=True,
                      dirName='result')
    print('最短路程为:%s' % (res['ObjV'][0][0]))
    print('最佳路线为:')
    best_journey, edges = problem.decode(res['Vars'][0])
    for i in range(len(best_journey)):
        print(int(best_journey[i]), end=' ')
    print()

以上就是Python遗传算法Geatpy工具箱使用介绍的详细内容,更多关于Python遗传算法Geatpy的资料请关注我们其它相关文章!

(0)

相关推荐

  • python实现使用遗传算法进行图片拟合

    目录 引言 预备知识及准备工作 打开图片 随机生成生物族群 按照生物性状画图 对比生物个体和目标图片的相似度 保存图片 算法主体 交叉互换 基因突变 基因片段易位 增加基因片段 减少基因片段 变异 繁殖 淘汰 拟合 示例展示 降低图片分辨率 原图 拟合过程展示 完整代码下载(已封装成类) 引言 算法思路 假设我们有这样一个生物族群,他们的每个基因片段都是一个个三角形(即只含三个点和颜色信息),他们每个个体表现出的性状就是若干个三角形叠加在一起.假设我们有一张图片可以作为这种生物族群最适应环境的性

  • Python地图四色原理的遗传算法着色实现

    目录 1 任务需求 2 代码实现 2.1 基本思路 2.3 结果展示 总结 1 任务需求   首先,我们来明确一下本文所需实现的需求.   现有一个由多个小图斑组成的矢量图层,如下图所示:我们需要找到一种由4种颜色组成的配色方案,对该矢量图层各图斑进行着色,使得各相邻小图斑间的颜色不一致,如下下图所示.   在这里,我们用到了四色定理(Four Color Theorem),又称四色地图定理(Four Color Map Theorem):如果在平面上存在一些邻接的有限区域,则至多仅用四种颜色来

  • python实现高效的遗传算法

    遗传算法属于一种优化算法. 如果你有一个待优化函数,可以考虑次算法.假设你有一个变量x,通过某个函数可以求出对应的y,那么你通过预设的x可求出y_pred,y_pred差距与你需要的y当然越接近越好,这就需要引入适应度(fitness)的概念.假设 fitness = 1/(1+ads(y_pred - y)),那么误差越小,适应度越大,即该个体越易于存活. 设计该算法的思路如下: (1)初始化种群,即在我需要的区间如[-100,100]内random一堆初始个体[x1,x2,x3...],这些

  • python遗传算法之单/多目标规划问题

    目录 1. 运行环境 2. 面向对象的原理 3. 带约束的单目标优化问题 3.1 继承 Problem 问题类完成对问题模型的描述 3.2 调用算法模板进行求解 3.3 结果 4. 带约束的多目标优化问题 4.1 继承 Problem 问题类完成对问题模型的描述 4.2 调用算法模板进行求解 4.3 结果 5. 参考资料 在上一篇博客中,我们学习了python遗传算法包geatpy.并用它展示了一个不带约束的单目标规划问题,对往期内容感兴趣的同学可以参考: 链接: python遗传算法之geat

  • python遗传算法之geatpy的深入理解

    目录 1. geatpy的安装 2. geatpy的基础数据结构 2.1 种群染色体 2.2 种群表现型 2.3 目标函数值 2.4 个体适应度 2.5 违反约束程度矩阵 2.6 译码矩阵 2.7 进化追踪器 3. geatpy的种群结构 3.1 Population类 3.2 PsyPopulation类 4. 求解标准测试函数——McCormick函数 5.参考文章 今天我们来学习python中的遗传算法的使用,我们这里使用的是geatpy的包进行学习,本博客主要从geatpy中的各种数据结

  • Python遗传算法Geatpy工具箱使用介绍

    目录 一. 什么是遗传算法? 二. 遗传算法库Geatpy 2.1 遗传算法工具箱Geatpy参数介绍 三.最佳实践 3.1 代码示例 | 参数模板 3.2 最佳实践 一. 什么是遗传算法? 遗传算法是仿真生物遗传学和自然选择机理,通过人工方式所构造的一类搜索算法,从某种程度上说遗传算法是对生物进化过程进行的数学方式仿真.生物种群的生存过程普遍遵循达尔文进化准则,群体中的个体根据对环境的适应能力而被大自然所选择或淘汰.进化过程的结果反映在个体的结构上,其染色体包含若干基因,相应的表现型和基因型的

  • Python 遗传算法处理TSP问题详解

    目录 前言 TSP问题 枚举 智能算法 策略 算法 数据样例 遗传算法 算法流程 繁殖 交叉 变异 选择 逆转 代码 TSP遗传算法 种群表示 交叉与变异 代码 运行结果 总结 前言 临时接到一个分支任务,那就是解决TSP问题,来作为人工智能课程的期中测试.是的这不时巧了嘛,我Hou(第三声)恰好略懂一二.那么今天的话,咱们就用好几个方案来解决这个问题吧,首先是咱们的遗传算法,之后是咱的PSO算法,最后是咱们的一个衍生想法,就是使用强化学习来做(这里选取的是DQN,我们采用3个网络并行解决问题)

  • 基于Python os模块常用命令介绍

    1.os.name---判断现在正在实用的平台,Windows返回'nt':linux返回'posix' 2.os.getcwd()---得到当前工作的目录. 3.os.listdir()--- 4.os.remove---删除指定文件 5.os.rmdir()---删除指定目录 6.os.mkdir()---创建目录(只能创建一层) 7.os.path.isfile()---判断指定对象是否为文件.是则返回True. 8.os.path.isdir()---判断指定对象是否为目录 9.os.p

  • 对于Python中RawString的理解介绍

    总结 1.'''作用: 可以表示 "多行注释" ."多行字符串" ."其内的单双引号不转义" 2.r 代表的意思是: raw 3.r 只对其内的反斜杠起作用(注意单个 \ 的问题) raw string 有什么用处呢? raw string 就是会自动将反斜杠转义. >>> print('\n') >>> print(r'\n') \n >>> (注:出现了两个空行是因为 print() 会自

  • Python 中pandas.read_excel详细介绍

    Python 中pandas.read_excel详细介绍 #coding:utf-8 import pandas as pd import numpy as np filefullpath = r"/home/geeklee/temp/all_gov_file/pol_gov_mon/downloads/1.xls" #filefullpath = r"/home/geeklee/temp/all_gov_file/pol_gov_mon/downloads/26368f3

  • Python字符串拼接六种方法介绍

    Python字符串拼接的6种方法: 1.加号 第一种,有编程经验的人,估计都知道很多语言里面是用加号连接两个字符串,Python里面也是如此直接用"+"来连接两个字符串: print 'Python' + 'Tab' 结果: PythonTab 2.逗号 第二种比较特殊,使用逗号连接两个字符串,如果两个字符串用"逗号"隔开,那么这两个字符串将被连接,但是,字符串之间会多出一个空格: print 'Python','Tab' 结果: Python Tab 3.直接连接

  • 基于Python中的yield表达式介绍

    python生成器 python中生成器是迭代器的一种,使用yield返回函数值.每次调用yield会暂停,而可以使用next()函数和send()函数可以恢复生成器. 这里可以参考Python函数式编程指南:对生成器全面讲解 注意到yield是个表达式而不仅仅是个语句,所以可以使用x = yield r 这样的语法. 这个知识点在协程中需要使用.协程的概念指的是在一个线程内,一个程序中断去执行另一个程序,有点类似于CPU中断.这样减少了切换线程带来的负担,同时不需要多线程中的锁机制,因为不存在

  • python文件绝对路径写法介绍(windows)

    python在描述路径时有两种方式: 'd:\\a.txt',转义的方式 r'd:\a.txt',声明字符串不需要转义 (使用raw string,也就是在string'前面加r,告诉python不需要转义) 推荐使用此写法"/",可以避免很多异常: C:/Users/Administrator/Desktop/python/t1.txt 以上这篇python文件绝对路径写法介绍(windows)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

随机推荐