本人博客食用体验更佳哦

DEAP(Distributed Evolutionary Algorithms in Python)是一个用于快速原型设计和实验的进化计算框架。它支持多种进化算法,包括遗传算法、遗传编程、进化策略、粒子群优化等。DEAP 的设计目标是灵活性和易用性,使得研究人员和开发者能够轻松地实现和测试各种进化算法。

官方文档

官方GitHub仓库

因本人主攻方向并不是Python甚至可以说之前对Python一窍不通,如有错误,还望各位读者指正。

本篇也以讲解用法为主,具体的类的继承和原理并不涉及。

这里以求 \(f(x) = (x - 5) ^ 2\) 和 \(f(x) = -x ^ 2 + 4x + 4\) 在 \([0, 31]\) 上都尽可能大为目标的,多目标优化为例。

0.载入DEAP库


import random from deap import base, creator, tools, algorithms

由于并不需要deap库所有的功能,这里仅载入要用到的几个模块。

1. 创建适应度函数


def evaluate(individual): ans = 0 for i in range(len(individual)): ans += (individual[i] << i) return ((ans - 5) ** 2, -ans ** 2 + ans * 4 + 4)

因为适应度默认是一个元组,这里选择返回一个元组。而每个整数采用二进制存储,则是因为在后面的基因交换中,要求两个基因是列表,整数无法进行交换操作。

2. 创建个体,种群


def init_individual(icls): content = [toolbox.attr_int() for _ in range(5)] individual = icls(content) individual.fitness.values = (0.0, 0.0) #初始化适应度 return individual creator.create("FitnessMulti", base.Fitness, weights=(1.0, 1.0)) #创建适应度 creator.create("Individual", list, fitness=creator.FitnessMulti) #创建个体类,个体为一个列表,并将适应度作为其中的一个属性 toolbox = base.Toolbox() toolbox.register("attr_int", random.randint, 0, 1) #随即生成0或1作为二进制的每一位 toolbox.register("individual", init_individual, creator.Individual)#注册个体生成函数 toolbox.register("population", tools.initRepeat, list, toolbox.individual)#注册种群生成函数,生成种群为一个列表

此处第六行weights是适应度,库默认为一个元组。因为此次举例是双函数得到多目标优化,因此元组有两个元素,每个元素的绝对值表示该维函数的权重,正负则表示是最大化还是最小化;为正,则表示目的是使该维元素最大化。

各个函数介绍

creator.creat基本用法

在 DEAP 库中,creator.create 是一个非常重要的函数,用于动态创建新的类型。这些类型通常用于定义个体的表示方式(如染色体)和适应度函数。creator.create 的灵活性使得 DEAP 能够适应各种不同的进化算法需求。


creator.create(name, base, **kwargs)

参数说明:

参数名 类型 说明
name 字符串 新类型的名称 。
base python内置类或自定义类 用于生成每个对象的函数(例如生成随机个体的函数)。
**kwargs 视情况而定 额外的属性,通常用于添加适应度函数或其他自定义属性 。

toolbox.register基本用法

toolbox.register 用于将函数或操作注册到 toolbox 对象中,方便在算法中调用。通常用于注册个体生成、交叉、变异、选择等操作。如所给代码中,注册后individual和population就是可以直接调用的函数。


toolbox.register(alias, method, *args, **kargs)

参数说明:

参数名 类型 说明
lias 类型 这是你为操作定义的名称,后续可以通过 toolbox.alias 调用该操作。
method 可调用对象 这是实际执行操作的函数或方法。
*args 可变位置参数 如果 method 需要若干个参数,可以通过 *args 传递。
**kargs 可变关键字参数 如果 method 需要关键字参数,可以通过 **kargs 传递。

以原代码中的为例


toolbox.register("individual", init_individual, creator.Individual)

我们注册了一个名为individual的函数,后续可通过toolbox.individual()调用,函数实际上执行的是init_individual函数的内容,creator.Individual是之前创造的个体类,作为参数传入init_individual。

tools.initRepeat基本用法

在 DEAP 库中,tools.initRepeat 是一个用于生成重复结构的工具函数。它通常用于初始化个体或种群,生成包含重复元素的列表或其他数据结构。以下是 tools.initRepeat 的详细参数及其用法:


deap.tools.initRepeat(container, func, n)

参数说明:

参数名 类型 说明
container 类型 用于存储生成对象的容器类型(例如 list、set 等)。
func 可调用对象 用于生成每个对象的函数(例如生成随机个体的函数)。
n 整数 需要生成的对象数量(例如种群大小)。

实际上是执行func函数n次,并将其存入container类型中。

以原代码中的为例


toolbox.register("population", tools.initRepeat, list, toolbox.individual)

我们注册了一个名为population的函数函数,实际上执行的是tools.initRepeat函数的内容,list表明生成的对象,也就是种群,是一个列表,作为参数传入tools.initRepeat,toolbox.individual是initRepeat重复执行的内容。注意到,此处并未写出重复执行次数n。这样我们在后续的种群生成中就可以自由选择生成种群的大小。

同时,因为此例我们的个体是一个整数,也就是一个五个元素的列表。但在某些情况下,我们的个体未必是一个元素,这时,生成个体的函数也可以通过同样的方法实现。例如:我可以定义一个个体是由五个列表构成,每个列表有五个元素(0或1)。toolbox.individual可以如此注册:


toolbox.register("individual", tools.initRepeat, list, init_individual, creator.Individual, n = 5)

注意: 此处的注册函数有误,因为此种写法会导致creator.Individual被视作tools.initRepeat的第三个参数也就是重复次数,而不会被视作init_individual的参数。因此init_individual应使用匿名函数形式,以避免这种情况。这里没做修改。

3. 创建其他需要的参数和函数


toolbox.register("evaluate", evaluate) #注册适应度函数 toolbox.register("mate", tools.cxTwoPoint) #采用两点交叉方法 toolbox.register("mutate", tools.mutFlipBit, indpb=0.1) #采用位翻转变异发,每个基因变异概率0.1 toolbox.register("select", tools.selNSGA2) # 因为是多目标优化问题,使用 NSGA-II 选择机制 population_size = 50 # 种群规模 generations = 40 # 繁殖代数 crossover_prob = 0.9 # 交叉概率 mutation_prob = 0.2# 个体变异概率 population = toolbox.population(n = population_size) #生成规模为50的种群

在这个过程中,基因交叉,变异,选择机制都有很多,各位读者可以根据需求自由选择。

4.执行遗传算法


for gen in range(generations): offspring = algorithms.varAnd(population, toolbox, cxpb = crossover_prob, mutpb = mutation_prob) fits = map(toolbox.evaluate, offspring) for fit, ind in zip(fits, offspring): ind.fitness.values = fit population = toolbox.select(offspring + population, k = population_size)

algorithms.varAnd基本用法


algorithms.varAnd(population, toolbox, cxpb, mutpb)
参数名 类型 说明
population 注册的种群类 当前种群。
toolbox Toolbox 对象 包含注册的交叉、变异和选择操作。
cxpb 浮点数 表示两个个体进行交叉的概率。
mutpb 浮点数 表示个体发生变异的概率。

varAnd 会从 toolbox 中调用注册的函数;toolbox.mate:交叉操作;toolbox.mutate:变异操作。

之后如有需要,可以输出最后的种群,也可结合matplotlib绘制图表。

使用PythonDEAP库实现简单遗传算法的更多相关文章

  1. muduo库的简单使用-echo服务的编写

    muduo库的简单使用 muduo是一个基于事件驱动的非阻塞网络库,采用C++和Boost库编写. 它的使用方法很简单,参考这篇文章:TCP网络编程本质论 里面有这么几句: 我认为,TCP 网络编程最 ...

  2. php中GD库的简单使用

    在php中需要图像处理的地方GD库会发挥重要的作用,php可以创建并处理包括GIF,PNG,JPEG,WBMP以及XPM在内的多种图像格式,简单的举几个例子: 1.用GD库会创建一块空白图片,然后绘制 ...

  3. C++标准库<string>简单总结

    C++标准库<string>简单总结 在C++中,如果需要对字符串进行处理,那么它自带的标准库<string>无疑是最好的选择,它实现了很多常用的字符处理函数. 要想使用标准C ...

  4. app 下载更新 file-downloader 文件下载库的简单介绍和使用

    app 下载更新 file-downloader 文件下载库的简单介绍和使用 今天介绍一个下载库:file-downloader 文件下载库 说明: * 本文内容来自原 file-downloader ...

  5. ODOO区分测试库和正式库的简单方法

    ODOO区分测试库和正式库的简单方法.1. 打开 开发者模式,右上角能显示数据库名称,缺点是,太耗系统资源了,数据多的时候就明显感觉慢了.2. 安装社区的显示测试帐套的模块, 若是正式环境还是尽量少装 ...

  6. 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍

    GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...

  7. arduino中SCoop库的简单应用案例

    转载:https://www.csdn.net/gather_27/MtTaggzsMDExMS1ibG9n.html arduino中SCoop库的简单应用案例首先这篇文章来在视频https://v ...

  8. 调用MyFocus库,简单实现二十几种轮播效果

    一.首先点击这里下载myFocus库文件,标准文件库就行了,很小仅仅1.4M. myFocus库有以下的好处: a . 文件小巧却高效强大,能够实现二十几种轮播的效果. b . 极其简单的使用,只需要 ...

  9. 嵌入式 Linux下curl库API简单介绍

    1:CURLcode curl_global_init(long flags); 这个函数全局需要调用一次(多次调用也可以,不过没有必要), 所以这也是把Curlplus设计成单体类的原因,curl_ ...

  10. GitHub 上排名前 100 的 Android 开源库进行简单的介绍

    若有任何疑问可通过邮件或微博联系我 项目名称 项目简介 1. react-native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开 ...

随机推荐

  1. java之封装日期工具类DateUtils

    整合日期工具类DateUtils dateUtils日期工具类封装-各类格式方法 pom文件引入 <dependency> <groupId>cn.hutool</gro ...

  2. LLM应用实战: 给个公司简称,输出公司全称

    1.背景 本qiang~本周在处理手头项目工作的时候,遇到了一个问题,就是友方提供了一个公司名称列表(量不小~,因此无法人工处理),且该公司名称列表均为简称,需要与库中的全称做一个映射匹配. 看似简单 ...

  3. Spring常见面试问题

    Spring 1.  Spring工作机制及为什么要用? Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.Spring既是一个AOP框架,也是一IOC容器. SpringFra ...

  4. 试了下Cursor,感觉程序员工种危险了

    大家好,我是汤师爷~ 今年8月份,AI 编程工具 Cursor 在开发者社区彻底火了.在 Twitter 平台上,Cloudflare 副总裁分享了一段视频,展示了一个令人震惊的案例.他年仅 8 岁的 ...

  5. NET任务调度框架Hangfire使用指南

    Hangfire 是一个开源的 .NET 任务调度框架,它允许开发人员轻松地将长时间运行的任务.定时任务和其他后台处理从主线程中分离出来,以提高应用程序的响应速度和性能 1. 安装 Hangfire ...

  6. RPM 与 YUM

    RPM 与 YUM rpm 包的管理 rpm 用于互联网下载包的打包及安装工具,它包含在某些 Linux 分发版中.它生成具有.RPM 扩展名的文件.RPM是 RedHat Package Manag ...

  7. Nginx基础使用

    Nginx Nginx是一个WEB服务 [1].安装nginx 1.官网安装 2.使用默认的仓库安装,版本较低 3.编译方式安装,需要其他功能模块的时候 自定义安装 # 基于官网仓库的安装方式,版本较 ...

  8. 在 d2js 使用多种数据源如spring数据源

    不少人误以为 d2js 只能通过 database.js 指定一个数据库,是一个单数据库方案.实际上 d2js 也可以使用多个数据库. 在 WEB-INF/jslib/d2js/base.js 的末尾 ...

  9. Ubuntu中文件夹建立软链接方法

    1:预备知识 -s 是代号(symbolic)的意思. 这里有两点要注意:第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化:第二,ln的链接又软链 ...

  10. Python 在Excel单元格中应用数据条

    在Excel中添加数据条是一种数据可视化技巧,它通过条形图的形式在单元格内直观展示数值的大小,尤其适合比较同一列或行中各个单元格的数值.这种表示方式可以让大量的数字信息一目了然.本文将介绍如何使用Py ...