进化算法、遗传编程和学习

news2024/9/24 15:28:19

一、说明

        进化算法是一系列搜索算法,其灵感来自自然界(达尔文主义)进化过程。所有不同家庭成员的共同点是,通过应用受自然遗传学和自然选择启发的

  •         算子,通过进化出最初
  •         随机的候选解决方案群体来解决问题,以便及时出现更合适(即更好)的问题解决方案。

        该领域的起源可以追溯到 1950 年代和 1960 年代,在过去的二十年中已经独树一帜,证明成功地解决了来自高度多样化领域的众多问题,包括(仅举几例):优化、自动编程、电子电路设计、电信、网络、金融、经济学、图像分析、信号处理、音乐和艺术。

        有趣的是,研究人员——包括我自己——发现进化算法可以以有益的方式与机器学习和深度学习相结合。稍后会详细介绍。

二、遗传算法的结构

        以下是基本的进化算法的样子:

  1. 产生最初的个体群体,后者是手头问题的候选解决方案
  2. 根据寻求解决方案的问题评估每个人的适合性
  3. 终止条件未满足时,选择
    更合适的个体进行繁殖
    重组交叉)个体 - 突变个体

    评估修改个体的适应性

让我们盘点一下进化算法的主要成分:

基因组(染色体)。进化算法本质上是基于群体的。群体中的个体被称为基因组或染色体。它可以采用多种形式,包括位串、实值向量、基于字符的编码、计算机程序等。设计适合手头问题的表示对于进化算法的成功至关重要。

健身,或健身功能。总体中候选解决方案质量的度量。正确定义此函数对于进化算法的成功也至关重要。

一代。上面 while 循环的单次迭代。

选择。进化算法选择(通常是概率上)高适应性个体为下一代贡献遗传(嗯,“遗传”)物质的运算符。

交叉。两种主要遗传算子之一,其中两个(或多个)候选溶液(亲本)以某种预定义的方式组合以形成后代。

突变。第二主要遗传算子,其中一种候选溶液被随机改变。

是时候举一个简单的例子了。让我们考虑一个由 4 个个体组成的群体,它们是长度为 10 的位串(基因组)。适应度值等于
位字符串中的 1 个数。当然,在实际应用中,种群规模和基因组长度更大。

在这种情况下,适应度计算非常简单:只需计算一个人的 1 数量。对于现实世界的问题,我们通常必须执行一些繁重的计算来获得适应度值。

初始随机总体可能如下所示(适应度值在括号中):0000011011 (4)、1110111101 (8)、0010000010 (2)、0011010000 (3)。

然后,选择可以选择作为父对:1110111101 (8) 与0011010000 (3),0000011011 (4) 与1110111101 (8)。请注意,有些人比其他人更容易被选中,而有些人可能根本没有——选择是概率性的,这取决于健康状况。适合度越高,被选为父母的概率就越高。

交叉运算符在一对父级之间交换随机块,然后是随机翻转少量位的突变运算符。

一旦我们完成了选择-交叉-突变,我们就有了新一代。在我们的例子中,它可能看起来像这样:1111010000 (5)、0010101101 (5)、0000011011 (4)、1110111111 (9)。是的,有点这个父母,有点那个父母,有点改变,瞧——一个改进的解决方案,健身 9(而以前最好的是 8)。

现在怎么办?只要继续循环几代人——选择-交叉-突变-适应——直到你得到一个足够好的解决方案。甚至可能是最佳的。

三、遗传算法编程

        现在让我们让事情变得更有趣。为什么要发展简单的位串?进化算法中的主要子领域之一称为遗传编程,它专注于使用更复杂的表示。传统上,这些是计算树,但多年来已经提出了许多其他表示。

        计算树如下所示:

        我通过遗传编程进化了这棵树,它实际上计算(递归)等效的数学表达式:x⁴ + x³ + x² + x + 1。有时进化会产生更复杂的树,例如:

四、机器学习和深度学习

        正如我和其他人在过去几年中发现的那样,进化算法的主要优势之一是它们如何“玩”机器学习和深度学习——如果使用得当的话。

        例如,在机器学习环境中,我设计了许多基于进化的分类器,它们与XGBoost,LightGBM和深度神经网络竞争。以下是全文。

        在深度学习环境中,我们使用了一种所谓的协同进化算法,其中多个种群协同进化,为深度网络进化激活函数。我们没有使用标准的ReLU,sigmoid等,而是将进化的激活函数插入深度网络,并表明它们的性能提高了。以下是全文。

        在对抗性深度学习领域,研究人员调查了深度模型对攻击的脆弱性,既试图改进模型防御,又设计新的攻击。输入图像中的微小变化,我们无法检测到,可能会导致网络出错。

        在一项工作中,我们使用进化来生成物理上合理的对抗性补丁,这些补丁是高性能的,看起来很逼真——没有使用梯度。我们使用了GAN(生成对抗网络)生成器。给定一个预训练的生成器,我们寻找一个输入潜在向量,对应于生成的图像,这会导致对象检测器出错。我们利用潜在空间的(相对)小维度,使用进化策略算法近似梯度,通过查询目标对象检测器反复更新输入潜在向量,直到发现适当的对抗补丁。

        下面见证我才华横溢的研究生拉兹·拉皮德(Raz Lapid)站在他的另一半旁边,展示进化的补丁(打印的,即物理的)如何将他隐藏在深度学习模型(没有边界框)之外。全文在这里。

欢迎您仔细阅读我的网站以获取更多详细信息和完整论文。

开始使用进化算法有多难? 好吧,我会从众多优秀的软件包之一开始。毫不掩饰地,我想推荐我发起的项目 - 以及我出色的合作者和研究生 - EC-KitY

GitHub - EC-KitY/EC-KitY:EC-KitY是一个scikit-learn兼容的Python工具包,用于执行...

EC-KitY是一个用于进行进化计算的Python工具包,它与scikit-learn兼容。目前我们有...

我们对这个项目有多个目标,因此EC-KitY是:

  • 运行进化算法的综合工具包;
  • 用蟒蛇编写;
  • 可以在有或没有scikit-learn的情况下工作,也就是说,它同时支持sklearn和非sklearn模式;
  • 设计时考虑了现代软件工程;
  • 旨在支持所有流行的进化算法范式。

您只需 3 行代码即可运行进化算法:


algo = SimpleEvolution(Subpopulation(SymbolicRegressionEvaluator()))algo.evolve()print(f'algo.execute(x=2,y=3,z=4): {algo.execute(x=2, y=3, z=4)

}')

EC-KitY也与scikit-learn兼容,如以下代码片段所示:

X, y = make_regression(n_samples=100, n_features=3)terminal_set = create_terminal_set(X)algo = SimpleEvolution(Subpopulation(creators=FullCreator(terminal_set=terminal_set),
 evaluator=RegressionEvaluator()))regressor = SKRegressor(algo)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)regressor.fit(X_train, y_train)


print('MAE on test set:', mean_absolute_error(y_test, regressor.predict(X_test)))

        让我以查尔斯·达尔文(Charles Darwin)的一句名言来结束——《物种起源》的结束语:

        这种生命观是宏伟的,它有几种力量,最初被呼吸成几种形式或一种形式;而且,虽然这个星球按照固定的万有引力定律循环,但从如此简单的开始,最美丽和最美妙的形式已经并且正在进化。摩西·西珀博士

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1014363.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

打包发布异常01

缺一不可 Build starting... Start: Fri Sep 15 08:07:01 UTC 2023 bfdf11d63b70 Git: 0.33-0-g6190381 commit 61903816b88ff5cf3e0848cd19fcb190af0801cd Author: 米伟强 Date: Fri Sep 15 15:57:28 2023 0800gradle插件版本Init SDKMan Found Android manifest Android …

Rust :与C交互

rust调用C端的库函数,有很多方法。今天介绍通过cc库的方式,实现rust调用c端库函数。 1、相关准备: 在ffi目录下,创建了c_part和rust_ffi文件夹。 c_part下放了ctools.c文件,里面有一些库函数,需要让rust调…

华为云云耀云服务器L实例评测|基于Docker环境快速部署Halo个人博客实操

目录 一、基本介绍 1.1 云耀云服务器L实例介绍 1.2 实操介绍 二、云耀云服务器的购买及基本使用 2.1 服务器购买流程 2.2 初始化连接流程 2.3 系统环境检查 三、Docker中运行Halo 3.1 Halo基本介绍 3.2 Docker的安装 3.3 使用 Docker 镜像创建容器 四、安装初始化H…

LVS负载均衡DR直接路由

LVS负载均衡DR直接路由 一、DR工作原理二、 数据包流向三、DR模式特点四、ARP问题4.1第一次访问完整(不考虑实际问题)4.2问题一:IP 地址冲突 五、部署LVS-DR集群5.2、第一台web服务器5.3、第二台Web节点服务器5.4、在客户机测试(1…

QT : 仿照QQ 完成弹出登录窗口,并实例化组件

1. 运行效果图 2. Headers #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWindow(); }; #endif // MAINWINDOW_H 3. mainWindow.cpp &#xff1a…

Android studio实现登录验证后返回token及用户信息,使用token获取用户信息并生成列表展示

大概时序图 登录成功保存token&#xff0c;然后带token请求获取用户列表 实现效果&#xff1a; 依赖 build.gradle(:app) dependencies {implementation androidx.recyclerview:recyclerview:1.2.1implementation com.google.code.gson:gson:2.8.9implementation com.tenc…

Python爬虫逆向猿人学刷题系列——第七题

题目&#xff1a;采集这5页中胜点列的数据&#xff0c;找出胜点最高的召唤师&#xff0c;将召唤师姓名填入答案中 地址&#xff1a;https://match.yuanrenxue.cn/match/7 本题主要是考察字体的动态变化&#xff0c;同样也是从字体文件下手构造出映射关系就好&#xff0c;但本题…

k8s(Kubernetes)集群部署--使用 kubeadm方式部署

k8s集群部署--使用 kubeadm方式部署 一、测试所需环境&#xff08;三台均要执行&#xff09;二、配置准备&#xff08;三台均要执行&#xff09;1. 重命名hostname、添加hosts2. 关闭防火墙、selinux与swap3. 添加网桥过滤及内核转发配置文件4.同步时间5.安装ipset及ipvsadm 三…

Tomcat 下部署 jFinal

1、检查web.xml 配置&#xff0c;在 tomcat 下部署需要检查 web.xml 是否存在&#xff0c;并且要确保配置正确&#xff0c;配置格式如下。 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-i…

网址导航收藏引导页面H5源码(自适应引导页HTML源码)-自动检测域名延迟

简介&#xff1a; 网址导航收藏引导页面H5源码&#xff08;自适应引导页HTML源码&#xff09;&#xff0c;可以自动检测域名延迟。这网址导航发布页不同于其它的&#xff0c;因为它可以测试所有域名的一个访问速度&#xff0c;并且将访问速度具象化显示出来&#xff0c;具体的…

性能调优降本实例

降本思路 在A企业内部&#xff0c;线上业务稳定性标准为&#xff1a;达到业务核定TPS时&#xff0c;CPU利用率的峰值不超过60&#xff05;&#xff0c;即为稳定状态。 在这个背景下&#xff0c;测试部门针对部分CPU消耗较高的系统进行了统一梳理和专项性能测试&#xff0c;旨…

Linux 挂载

挂载需要挂载源和挂载点 虚拟机本身就有的挂源 添加硬件 重启虚拟机 操作程序 sudo fdisk -l //以管理员权限查看电脑硬盘使用情况sudo mkfs.ext4 /dev/sdb //以管理员身份格式化硬盘sudo mkdir guazai //创建挂载文件夹 sudo mount /dev/sdb/guazai //将挂载源接上挂载点 s…

【数据结构】堆排序详解

文章目录 一、堆排序思想二、向上调整建堆排序三、向下调整建堆排序四、总结 对于什么是堆&#xff0c;堆的概念分类以及堆的向上和向下两种调整算法可见&#xff1a; 堆的创建 一、堆排序思想 int a[] { 2,3,5,7,4,6 };对于这样一个数组来说&#xff0c;要想要用堆排序对它…

Webserver项目解析

一.webserver的组成部分 Buffer类 用于存储需要读写的数据 Channel类 存储文件描述符和相应的事件&#xff0c;当发生事件时&#xff0c;调用对应的回调函数 ChannelMap类 Channel数组&#xff0c;用于保存一系列的Channel Dispatcher 监听器&#xff0c;可以设置为epo…

分享一个基于微信小程序的社区生活小助手源码调试和lw,有java+python双版本

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

让NPU跑起来迅为RK3588开发板设置交叉编译器

让NPU跑起来迅为RK3588开发板设置交叉编译器 编译器下载地址是网盘资料“iTOP-3588 开发板\02_【iTOP-RK3588 开发板】开发资料 \12_NPU 使用配套资料\03_编译所需工具\Linux”。 拷贝 gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.gz 到 Ubuntu 的/opt/tool_ch…

JavaScript中的`async`和`await`关键字的作用

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ async关键字⭐ await 关键字3. 错误处理 ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对We…

中国汽车供应商远赴德国,中国智驾方案能否远渡重洋?

作者|Amy 编辑|德新 今年的上海车展&#xff0c;中国智能汽车的进步有目共睹&#xff0c;吸引了大批外企高管和研发人员的关注&#xff0c;甚至引发了海外车企一系列的动作和调整。 而在刚刚结束的慕尼黑车展&#xff0c;中国车企及汽车供应链把「肌肉」秀到了现代汽车起源地…

flask要点与坑

简介 Flask是一个用Python编写的Web应用程序框架&#xff0c;该框架简单易用、模块化、灵活性高。 该笔记主要记录Flask的关键要点和容易踩坑的地方 Flask 日志配置 Flask 中的自带logger模块&#xff08;也是python自带的模块&#xff09;&#xff0c;通过简单配置可以实现…

浅谈拓展欧几里得算法

1、求特解 x 0 , y 0 x_0, y_0 x0​,y0​ 普通的欧几里得算法依据是辗转相除法&#xff0c;也就是&#xff0c;比如求 a &#xff0c; b a&#xff0c;b a&#xff0c;b 的最大公约数&#xff0c; a &#xff0c; b a&#xff0c;b a&#xff0c;b 进行辗转相除直到 a − b …