Geatpy

The Genetic and Evolutionary Algorithm Toolbox for Python

Introduction

推荐一个博客:https://blog.csdn.net/qq_33353186 写的很详细!!

Geatpy提供了许多已实现的遗传和进化算法相关算子的库函数,如初始化种群、选择、交叉、变异、重插入、多种群迁移、多目标优化非支配排序等,并且提供开放式的进化算法框架来实现多样化的进化算法。其执行效率高于Matlab遗传算法工具箱和Matlab第三方遗传算法工具箱Gaot、gatbx、GEATbx,学习成本低。
Geatpy支持二进制/格雷码编码种群、实数值种群、整数值种群、排列编码种群。支持轮盘赌选择、随机抽样选择、锦标赛选择。提供单点交叉、两点交叉、洗牌交叉、部分匹配交叉(PMX)、线性重组、离散重组、中间重组等重组算子。提供简单离散变异、实数值变异、整数值变异、互换变异等变异算子。支持随机重插入、精英重插入。支持awGA、rwGA、nsga2、快速非支配排序等多目标优化的库函数、提供进化算法框架下的常用进化算法模板等。
 
看了tutorials之后,我选择了sga_new_code_templet 这个模板库

输入的控制变量可以自己选择是实数或整数(后面会提到这个参数)。以下面的例子为例,Phen为传入的控制变量矩阵,它本身不需要定义具体数值。因为自变量的范围在main.py里会定义。

 -*- coding: utf-8 -*-
"""
aimfc.py - 目标函数demo
描述:
Geatpy的目标函数遵循本案例的定义方法, 传入种群表现型矩阵Phen, 以及可行性
列向量LegV
若没有约束条件, 也需要返回LegV(种群个体的可行性列向量,若未定义惩罚函数,则可以不定义)
若要改变目标函数的输入参数、 输出参数的格式, 则需要修改或自定义算法模板
"""
import numpy as np
def aimfuc(Phen, LegV):
x1 = Phen[:, [0]]
x2 = Phen[:, [1]]
f = 21.5 + x1 * np.sin(4 * np.pi * x1) + x2 * np.sin(20 * np.pi *
x2)
return [f, LegV]
# -*- coding: utf-8 -*-
"""
执行脚本main.py
描述:
该demo是展示如何计算无约束的单目标优化问题
本案例通过调用sga_new_code_templet算法模板来解决该问题
其中目标函数写在aimfuc.py文件中
本案例调用了“sga_new_code_templet” 这个算法模板, 其详细用法可利用help命
令查看, 或是在github下载并查看源码
调用算法模板时可以设置drawing=2, 此时算法模板将在种群进化过程中绘制动画,
但注意执行前要在Python控制台执行命令matplotlib qt5。
"""
import numpy as np
import geatpy as ga
# 获取函数接口地址
AIM_M = __import__('aimfuc')
# 变量设置
x1 = [-3, 12.1] # 自变量1的范围
x2 = [4.1, 5.8] # 自变量2的范围
b1 = [1, 1] # 自变量1是否包含下界和上界(0:不包括,1:包括)
b2 = [1, 1] # 自变量2是否包含上界
codes = [0, 0] # 自变量的编码方式, 0表示采用标准二进制编码
precisions = [4, 4] #自变量的精度(精度不宜设置太高, 否则影响搜索性能和效果)
scales = [0, 0] # 是否采用对数刻度
ranges=np.vstack([x1, x2]).T # 生成自变量的范围矩阵
borders = np.vstack([b1, b2]).T # 生成自变量的边界矩阵
# 生成区域描述器
FieldD = ga.crtfld(ranges, borders, precisions, codes, scales)
# 调用编程模板
[pop_trace, var_trace, times] = ga.sga_new_code_templet(AIM_M,
'aimfuc', None, None, FieldD, problem = 'R', maxormin = -1, MAXGEN
= 1000, NIND = 100, SUBPOP = 1, GGAP = 0.8, selectStyle = 'sus',
recombinStyle = 'xovdp', recopt = None, pm = None, distribute =
True, drawing = 1)

在github上找到这个模板的代码如下:

https://github.com/geatpy-dev/geatpy/blob/master/geatpy/source-code/templets/sga_new_code_templet.py

它的一些参数,里面有定义,可以在main.py里修改。

本模板实现改进单目标编程模板(二进制/格雷编码),将父子两代合并进行选择,增加了精英保留机制
语法:
该函数除了参数drawing外,不设置可缺省参数。当某个参数需要缺省时,在调用函数时传入None即可。
比如当没有罚函数时,则在调用编程模板时将第3、4个参数设置为None即可,如:
sga_new_code_templet(AIM_M, 'aimfuc', None, None, ..., maxormin)
输入参数:
AIM_M - 目标函数的地址,由AIM_M = __import__('目标函数所在文件名')语句得到
目标函数规范定义:[f,LegV] = aimfuc(Phen,LegV)
其中Phen是种群的表现型矩阵, LegV为种群的可行性列向量,f为种群的目标函数值矩阵 AIM_F : str - 目标函数名 PUN_M - 罚函数的地址,由PUN_M = __import__('罚函数所在文件名')语句得到
罚函数规范定义: newFitnV = punishing(LegV, FitnV)
其中LegV为种群的可行性列向量, FitnV为种群个体适应度列向量
一般在罚函数中对LegV为0的个体进行适应度惩罚,返回修改后的适应度列向量newFitnV PUN_F : str - 罚函数名 FieldD : array - 二进制/格雷码种群区域描述器,
描述种群每个个体的染色体长度和如何解码的矩阵,它有以下结构: [lens; (int) 每个控制变量编码后在染色体中所占的长度
lb; (float) 指明每个变量使用的下界
ub; (float) 指明每个变量使用的上界
codes; (0:binary | 1:gray) 指明子串是怎么编码的,
0为标准二进制编码,1为各类编码
scales; (0: rithmetic | 1:logarithmic) 指明每个子串是否使用对数或算术刻度,
1为使用对数刻度,2为使用算术刻度
lbin; (0:excluded | 1:included)
ubin] (0:excluded | 1:included) lbin和ubin指明范围中是否包含每个边界。
选择lbin=0或ubin=0,表示范围中不包含相应边界。
选择lbin=1或ubin=1,表示范围中包含相应边界。 problem : str - 表明是整数问题还是实数问题,'I'表示是整数问题,'R'表示是实数问题 maxormin int - 最小最大化标记,1表示目标函数最小化;-1表示目标函数最大化 MAXGEN : int - 最大遗传代数 NIND : int - 种群规模,即种群中包含多少个个体 SUBPOP : int - 子种群数量,即对一个种群划分多少个子种群 GGAP : float - 代沟,本模板中该参数为无用参数,仅为了兼容同类的其他模板而设 selectStyle : str - 指代所采用的低级选择算子的名称,如'rws'(轮盘赌选择算子) recombinStyle: str - 指代所采用的低级重组算子的名称,如'xovsp'(单点交叉) recopt : float - 交叉概率 distribute : bool - 是否增强种群的分布性(可能会造成收敛慢) pm : float - 重组概率 drawing : int - (可选参数),0表示不绘图,1表示绘制最终结果图。默认drawing为1
输出参数:
pop_trace : array - 种群进化记录器(进化追踪器),
第0列记录着各代种群最优个体的目标函数值
第1列记录着各代种群的适应度均值
第2列记录着各代种群最优个体的适应度值 var_trace : array - 变量记录器,记录着各代种群最优个体的变量值,每一列对应一个控制变量 times : float - 进化所用时间
模板使用注意:
1.本模板调用的目标函数形如:[ObjV,LegV] = aimfuc(Phen,LegV),
其中Phen表示种群的表现型矩阵, LegV为种群的可行性列向量(详见Geatpy数据结构)
2.本模板调用的罚函数形如: newFitnV = punishing(LegV, FitnV),
其中FitnV为用其他算法求得的适应度
若不符合上述规范,则请修改算法模板或自定义新算法模板
3.关于'maxormin': geatpy的内核函数全是遵循“最小化目标”的约定的,即目标函数值越小越好。
当需要优化最大化的目标时,需要设置'maxormin'为-1。
本算法模板是正确使用'maxormin'的典型范例,其具体用法如下:
当调用的函数传入参数包含与“目标函数值矩阵”有关的参数(如ObjV,ObjVSel,NDSetObjV等)时,
查看该函数的参考资料(可用'help'命令查看,也可到官网上查看相应的教程),
里面若要求传入前对参数乘上'maxormin',则需要乘上。
里面若要求对返回参数乘上'maxormin'进行还原,
则调用函数返回得到的相应参数需要乘上'maxormin'进行还原,否则其正负号就会被改变。
"""

最后,实验室师兄一开始给我安利了 Jmetal 这个库(Java和Python两个版本),下面是文档网站链接,也可以在github上找到源码,然后安装。但是文档写的实在是不清晰,搞得我对它定义得参数一头雾水。后面就放弃用它了。

https://jmetalpy.readthedocs.io/en/latest/examples/ea.html#moea-d

最近看论文发现有作者用的是pymoo这个库和 pymop : This framework provides a collection of test problems in Python.

据说deap这个遗传算法库也不错,不过我没用过 :)

geatpy - 遗传和进化算法相关算子的库函数(python)的更多相关文章

  1. Python遗传和进化算法框架(一)Geatpy快速入门

    https://blog.csdn.net/qq_33353186/article/details/82014986 Geatpy是一个高性能的Python遗传算法库以及开放式进化算法框架,由华南理工 ...

  2. 【Python Deap库】遗传算法/遗传编程 进化算法基于python DEAP库深度解析讲解

    目录 前言 概述 启发式的理解(重点) 优化问题的定义 个体编码 初始族群的创建 评价 配种选择 锦标赛 轮盘赌选择 随机普遍抽样选择 变异 单点交叉 两点交叉 均匀交叉 部分匹配交叉 突变 高斯突变 ...

  3. [Evolutionary Algorithm] 进化算法简介

    进化算法,也被成为是演化算法(evolutionary algorithms,简称EAs),它不是一个具体的算法,而是一个“算法簇”.进化算法的产生的灵感借鉴了大自然中生物的进化操作,它一般包括基因编 ...

  4. 标准差分进化算法matlab程序实现(转载)

    标准差分进化算法matlab程序实现 自适应差分演化算法方面的Matlab和C++代码及论文 差分进化算法 DE-Differential Evolution matlab练习程序(差异演化DE) [ ...

  5. CARS: 华为提出基于进化算法和权值共享的神经网络结构搜索,CIFAR-10上仅需单卡半天 | CVPR 2020

    为了优化进化算法在神经网络结构搜索时候选网络训练过长的问题,参考ENAS和NSGA-III,论文提出连续进化结构搜索方法(continuous evolution architecture searc ...

  6. 差分进化算法介绍及matlab实现

    引言 差分进化算法是基于群体智能理论的优化算法,是通过群体内个体间的合作与竞争而产生的智能优化搜索算法,它保留了基于种群的全局搜索策略,采用实数编码.基于差分的简单变异操作和"一对一&quo ...

  7. 差分进化算法 DE-Differential Evolution

    差分进化算法 (Differential Evolution)   Differential Evolution(DE)是由Storn等人于1995年提出的,和其它演化算法一样,DE是一种模拟生物进化 ...

  8. Control算法相关

    Control算法相关 添加新的control算法官方指导教程. 创建一个控制器: 在文件control_config中添加新控制器的配置信息: 注册新控制器. 如何添加新的CAN卡. Apollo中 ...

  9. logging日志模块,hashlib hash算法相关的库,

    logging: 功能完善的日志模块 import logging #日志的级别 logging.debug("这是个调试信息")#级别10 #常规信息 logging.info( ...

随机推荐

  1. Windows环境和Linux环境下Redis主从复制配置

    Windows环境下和Linux环境下配置Redis主从复制基本上一样,都是更改配置文件.Windows环境下修改的配置文件是:redis.windows.conf.redis.windows-ser ...

  2. 关于删除MySQL Logs的一点记录

    五一前,一个DBA同事反馈,在日常环境中删除一个大的slow log文件(假设文件大小10G以上吧),然后在MySQL中执行flush slow logs,会发现mysqld hang住. 今天尝试着 ...

  3. mysql查询今天、昨天、近7天、近30天、本月、上一月的SQL语句

    mysql查询今天.昨天.近7天.近30天.本月.上一月的SQL语句 这篇文章主要介绍了mysql查询今天.昨天.近7天.近30天.本月.上一月的SQL语句,一般在一些统计报表中比较常用这个时间段,需 ...

  4. C++ 数据封装和抽象

    C++ 数据抽象 数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节. 数据抽象是一种依赖于接口和实现分离的编程(设计)技术. 让我们举一个现实生活中的真实例子 ...

  5. 从Objective-C到Swift,你必须会的(三)init的顺序

    Objective-C的构造函数吧,就最后return一个self.里头你要初始化了什么都可以.在Swift的init函数里把super.init放在前面,然后再初始化你代码里的东西就会报错了. 所以 ...

  6. 无线破解那点事(PJ)

    有一段时间没有写博客了.只能说苦逼学生党伤不起啊,还好没挂-废话不说了,近期将会讲讲无线PJ那点事,也不是啥干货,就一些先前的笔记分享把. 0.无线网卡 想要提高破解效率,一块猛一点的USB无线网卡是 ...

  7. 在MyEclipse中怎么修改Servlet模板

    原Servlet模板实例 package www.csdn.net.servlet; import java.io.IOException; import java.io.PrintWriter; i ...

  8. Python2.4+ 与 Python3.0+ 主要变化与新增内容

    Python2                          Python3print是内置命令                 print变为函数print >> f,x,y     ...

  9. WPF Path 画箭头

    代码: <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.c ...

  10. Spring @SCHEDULED(CRON = "0 0 * * * ?")实现定时任务

    Spring配置文件xmlns加入 xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocati ...