【深度学习】遗传算法[选择、交叉、变异、初始化种群、迭代优化、几何规划排序选择、线性交叉、非均匀变异]

news2024/12/27 4:05:46

目录

  • 一、遗传算法
  • 二、遗传算法概述
    • 2.1 选择
    • 2.2 交叉
    • 2.3 变异
  • 三、遗传算法的基本步骤
    • 3.1 编码
    • 3.2 初始群体的生成
    • 3.3 适应度评估
    • 3.4 选择
    • 3.5 交叉
    • 3.6 变异
    • 3.7 总结
  • 四、遗传算法工具箱
    • 4.1 initializega
    • 4.2 ga
    • 4.3 normGeomSelect
    • 4.4 arithXover
    • 4.5 nonUnifMutation
  • 五、遗传算法优化BP神经网络初始权值与阈值
  • 六、后记


决策树和随机森林建立了输入和输出的非线性的映射模型,决策树判断决策的规则树,随机森林建立了组合的学习框架。

而所谓的遗传算法,则是一类借鉴生物界的进化规律设计的算法,用于模拟自然进化搜索最优解。

一、遗传算法

  遗传算法(Genetic Algorithm, GA )是一种进化算法(即群优化算法在解空间内同时生成多个个体组成群体,寻找最优解问题),其基本原理是仿效生物界中的“物竞天择,适者生存“的演化法则,它最初由美国Michigan大学的J.Holland教授于1967年提出。
  遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,而一个种群则由经过基因(gene)编码的一定数目的个体(individual)组成。因此,第一步需要实现从表现型到基因型的映射即编码工作。初代种群产生之后,按照适者生存优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度(fitness)大小选择个体,并借助于自然遗传学的遗传算子(genetic operators)进行组合交叉变异(保证解空间的多样性,避免偏移最优解),产生出代表新的解集的种群。这个过程将导致种群像自然进化一样后生代种群比前代更加适应于环境末代种群中的最优个体经过解码(decoding),可以作为问题近似最优解


二、遗传算法概述

  遗传算法有三个基本操作:选择(Selection)、交叉(Crossover)和变异(Mutation)。

2.1 选择

  选择的目的是为了从当前群体中选出优良的个体,使它们有机会作为父代为下一代繁衍子孙。根据各个个体的适应度值适应度值高则被选中的概率高,并非一定能被选中;而适应度值低的也可能会被选中,只是被选中的概率较小罢了),按照一定的规则或方法从上一代群体中选择出一些优良的个体遗传到下一代种群中。选择的依据是适应性强的个体为下一代贡献一个或多个后代的概率大


2.2 交叉

  通过交叉操作可以得到新一代个体,新个体组合了父辈个体的特性(保留了父辈的特征)。将群体中的各个个体随机搭配成对,对每一个个体,以交叉概率交换它们之间的部分染色体


2.3 变异

  对种群中的每一个个体,以变异概率改变某一个或多个基因座上的基因值为其他的等位基因。同生物界中一样,(与交叉相比)变异发生的概率很低,变异为新个体的产生提供了机会


三、遗传算法的基本步骤

3.1 编码

  GA在进行搜索之前先将解空间的解数据表示成遗传空间的基因型串结构数据,这些串结构数据的不同组合便构成了不同的点


3.2 初始群体的生成

  随机产生N个初始串结构数据,每个串结构数据称为一个个体,N个个体构成了一个群体。GA以这N个串结构数据作为初始点开始进化
  初始种群数量的选取对后续的计算和优化影响极大,太少则需要迭代次数较多较大则可能出现相邻数据出现部分重叠,出现重复计算。一般用经验值来设定初始种群数量。


3.3 适应度评估

  适应度表明个体或解的优劣性。不同的问题,适应性函数的定义方式也不同。所过所需问题对应的目标函数与工具箱深度函数不同,可对其进行一定的预处理


3.4 选择

  选择的目的是为了从当前群体中选出优良的个体,使它们有机会作为父代为下一代繁殖子孙。遗传算法通过选择过程体现这一思想,进行选择的原则是适应性强的个体为下一代贡献一个或多个后代的概率大。选择体现了达尔文的适者生存原则。


3.5 交叉

  交叉操作是遗传算法中最主要的遗传操作通过交叉操作可以得到新代个体,新个体组合了其父辈个体的特性。交叉体现了 信息交换 的思想。


3.6 变异

  变异首先在群体中随机选择一个个体,对于选中的个体以一定的概率随机地改变串结构数据中某个串的值。同生物界一样,GA中变异发生的概率很低,通常取值很小


3.7 总结

  将各个步骤总结如下图:
在这里插入图片描述


四、遗传算法工具箱

  目前主流的遗传算法工具箱有gadstgatbxgaot等,下面主要以 gaot为例 进行讲解。先介绍遗传算法工具箱各自的特点:
  (1)MATLAB内嵌遗传算法工具箱: gadst封装上层级较高,底层的函数方法无法查阅。代码复用性较高
  (2)Sheffield大学遗传算法工具箱: gatbx
  (3)北卡罗来纳大学遗传算法工具箱: gaot
  工具箱的调用方式是非常相似的

  北卡罗来纳大学遗传算法工具箱可查看每一个步骤的原理,重点函数解读如下:
  optimtoolmatlab自带工具箱函数,具体调用界面如下。因为可调参数都很直观,故不展开讲解。
在这里插入图片描述

4.1 initializega

  Initializega:初始化种群,调用命令如下:

pop = initializega(populationSize,variableBounds,evalFN,evalOps,options)

  以下附上各参数含义的解释
在这里插入图片描述

参数意义
pop随机生成的初始种群
populationSize种群大小,即种群中个体的数目
variableBounds变量边界的矩阵
evalFN适应度函数的名称
evalOps适应度函数的参数
options精度及编码形式。0为二进制编码,1为浮点编码

4.2 ga

  Ga:迭代优化的混合函数。

[x,endPop,bPop,traceInfo] = ga(bounds,evalFN,evalOps,startPop,opts,termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)

在这里插入图片描述

参数意义
bounds变量上下界的矩阵
evalFN适应度函数的名称
evalOps适应度函数的参数
startPop初始种群
opts精度、编码形式及显示方式, 1为浮点编码, 0为二进制编码,默认为[1e-6 10]
termFN终止函数的名称
termOps终止函数的参数
selectFN选择函数的名称
selectOps选择函数的参数
xOverFNs交叉函数的名称
xOverOps交叉函数的参数
mutFNs变异函数的名称
mutOps变异函数的参数

  其中,适应度函数 如下:

function [sol, fitnessVal] = fitness(sol, options)
x = sol(1);
fitnessVal = x + 10*sin(5*x)+7*cos(4*x); 
end

  主函数 如下,为了方便理解给每一行代码都加上了注释。

%% 实现遗传算法优化的过程。绘制给定函数曲线、执行遗传算法优化并显示结果。同时还绘制了迭代进化曲线,用于观察优化过程中平均适应度和最佳适应度的变化情况。

%% I. 清空环境变量
clear all;% 清除当前工作空间中的所有变量
clc;% 清除命令窗口中的内容

%% II. 绘制函数曲线
x = 0:0.01:9;% 创建一个从0到9,步长为0.01的向量作为自变量x的取值范围
y =  x + 10*sin(5*x)+7*cos(4*x); % 根据给定的函数表达式计算因变量y的值
figure;% 创建一个新的图形窗口
plot(x, y);% 绘制自变量x和因变量y之间的曲线图
xlabel('自变量');% 设置x轴的标签为“自变量”
ylabel('因变量');% 设置y轴的标签为“因变量”
title('y = x + 10*sin(5*x) + 7*cos(4*x)'); % 设置图的标题为给定的函数表达式

%% III. 初始化种群
initPop = initializega(50,[0 9],'fitness'); % 种群大小, 变量边界的矩阵,适应度函数名称
% 初始化种群。采用遗传算法时,需要首先初始化一组个体作为初始种群。该函数接收三个参数,分别为种群大小、变量边界的矩阵,以及适应度函数的名称

%% IV. 遗传算法优化
[x endPop bpop trace] = ga([0 9],'fitness',[],initPop,[1e-6 1 1],'maxGenTerm',25,...                           'normGeomSelect',0.08,'arithXover',2,'nonUnifMutation',[2 25 3]); 
% 使用遗传算法进行优化。该函数接收多个参数,包括变量边界、适应度函数、约束条件等。返回的结果包括最优解x、最后的种群endPop、最佳个体bpop和迭代过程的跟踪记录trace

%% V. 输出最优解并绘制最优点
x;% 输出最优解x
hold on;% 保持图形窗口不关闭,以便进行后续的绘图操作
plot (endPop(:,1),endPop(:,2),'ro'); % 绘制最优点。将最优种群中的坐标显示为红色圆点

%% VI. 绘制迭代进化曲线
figure(2);% 创建第二个图形窗口
plot(trace(:,1),trace(:,3),'b:');% 绘制迭代进化曲线中的平均适应度。用蓝色虚线表示
hold on;% 保持图形窗口不关闭,以便继续绘制其他曲线
plot(trace(:,1),trace(:,2),'r-')% 绘制迭代进化曲线中的最佳适应度。用红色实线表示
xlabel('Generation'); % 设置x轴的标签为“Generation”
ylabel('Fittness');% 设置y轴的标签为“Fitness”
legend('Mean Fitness', 'Best Fitness');% 设置图例,表示平均适应度和最佳适应度

在这里插入图片描述

参数意义
x优化计算得到的最优个体
endPop优化终止时的最终种群
bPop最优种群的进化轨迹
traceInfo每代的最优适应度函数值和平均适应度函数值矩阵

  其他还有如几何规划排序选择(normGeomSelect)、算术交叉或线性交叉(arithXover)、非均匀变异(nonUnifMutation)等遗传算法操作。这里暂且展开说一说吧。


4.3 normGeomSelect

  normGeomSelect 是一种遗传算法中的选择操作,也称为**标准几何选择**(normalized geometric selection)。在遗传算法中,选择操作用于确定哪些个体能够被选中作为下一代的父代个体
  标准几何选择通过将个体的适应度值进行归一化,并根据归一化适应度值选择父代个体。具体而言,标准几何选择使用以下公式计算个体在选择过程中的概率:

prob(i) = (1 - p) * p^i

  其中,prob(i)是第 i 个个体被选择的概率,p 是一个介于 0 和 1 之间的常数,表示选择压力(selection pressure)。较小的 p 值会增加选择压力,使适应度较高的个体更有可能被选择
  在标准几何选择中,选择概率随着个体的排序指数 i 的增加而减小,呈几何级数分布。这意味着适应度更高的个体被选中的概率更大,但较低适应度的个体仍然有一定的机会被选择
  通过使用标准几何选择,遗传算法能够根据个体的适应度值选择父代个体,并通过遗传操作(如交叉和变异)产生下一代个体。这有助于保留适应度较高的个体,并逐步改进整体种群的适应度水平。


4.4 arithXover

  arithXover 是一种遗传算法中的交叉操作,也称为算术交叉或线性交叉。在遗传算法中,交叉是模拟生物进化过程中的基因交换通过将两个个体的基因信息进行组合,产生新的个体
  具体而言,arithXover 采用算术平均的方式进行交叉。对于每对父代个体,它们的相应基因位(或称为变量)会按照一个随机权重进行加权平均,从而生成新的后代个体。这个过程通过以下公式表示:

childGene = w * parent1Gene + (1 - w) * parent2Gene

  其中,parent1Gene和parent2Gene分别表示两个父代个体在特定基因位上的基因值w是一个随机权重,通常取值范围是0到1。
  通过使用 arithXover 进行交叉操作,可以实现对父代个体的基因信息进行混合和融合,从而产生更多样化的后代个体。这有助于增加遗传算法搜索空间的探索能力,并提高找到全局最优解的概率。


4.5 nonUnifMutation

   nonUnifMutation 是一种遗传算法中的变异操作,也称为非均匀变异。在遗传算法中,变异是模拟生物进化中的基因突变,通过在个体的基因信息上引入随机扰动,以增加搜索空间的探索能力
  具体而言,nonUnifMutation 是一种非均匀变异方式,它引入了一个**变异率缩减函数,使得 变异率(即发生变异的概率)随着迭代次数的增加而逐渐减小。这是为了在执行初期有更高的探索能力,而在后期有更高的收敛性**。
  通常,nonUnifMutation 的变异率缩减函数采用如下形式:

mutationRate = initialMutationRate * (1 - generation/maxGenerations) ^ beta

  其中,initialMutationRate 是初始变异率generation 是当前迭代的代数maxGenerations 是总的迭代代数beta 是变异率缩减的参数
  通过使用 nonUnifMutation 进行变异操作,可以在遗传算法优化过程中引入 一定的随机性,从而避免陷入局部最优解,并提高算法的全局搜索能力。同时,通过动态调整变异率,可以在优化的后期更加聚焦于局部搜索和收敛。


五、遗传算法优化BP神经网络初始权值与阈值

  在应用到具体实战时,遗传算法可以用于优化神经网络的初始权值和阈值,这里给出一种基本的遗传算法优化初始全职和阈值的方法:
(1)定义个体编码
  首先需要定义个体的编码方式。可以 将每个个体表示为一个包含所有权值和阈值的向量 。例如,如果神经网络有 n 个权值和 m 个阈值,则一个个体可以表示为一个长度为 n+m 的向量。
(2)初始化种群
  使用随机方式生成初始种群种群中的每个个体都包含初始的权值和阈值
(3)适应度函数
  定义适应度函数来评估个体的性能。对于神经网络问题,可以 选择训练误差作为适应度函数。例如,可以使用平方误差交叉熵等来衡量个体在训练集上的性能。
(4) 选择操作
  使用选择操作来确定哪些个体能够被选中作为下一代的父代个体。可以使用标准几何选择(normalized geometric selection)或其他选择算法来进行选择。
(5)遗传操作
  应用遗传操作包括交叉和变异,来产生下一代个体。交叉操作可以通过交换个体之间的权值和阈值来产生新的个体。变异操作可以引入随机扰动来增加种群的多样性。
(6)重复迭代
  重复进行选择遗传操作,直到达到停止条件(例如达到最大迭代次数或获得满意的适应度水平)为止
(7)最优个体选择
  最终,选择具有最高适应度的个体作为优化后的初始权值和阈值

通过使用遗传算法来优化初始权值和阈值,可以提高神经网络的训练效果和泛化能力。遗传算法的全局搜索和优化能力可以帮助找到较好的初始权值和阈值组合,提高神经网络的性能。同时,遗传算法也可以用于解决权值和阈值调整中的陷入局部最优问题。
  可以总结如下图所示:
在这里插入图片描述


六、后记

  本篇主要介绍了深度学习优化算法之一的遗传算法,接下来会陆续蚁群算法粒子群算法模拟退火算法(T▽T)。上次发了一个投票征求更新的顺序,可能大家都忙于评论没有在意吧,也没有几个人投票(╥_╥)…
  另:最近C站的热榜热度算法好像经过了一定的修改,我评论被禁言的这两天(8.10-8.12)一直在研究其机制(虽然也没有研究出具体的权重值 (>﹏<))。感兴趣的朋友可以在评论区留言或是找我私信。
  最后感谢所有完整看完本文的朋友们,谢谢你们!

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

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

相关文章

【Transformer】自注意力机制Self-Attention | 各种网络归一化Normalization

1. Transformer 由来 & 特点 1.1 从NLP领域内诞生 "Transformer"是一种深度学习模型,首次在"Attention is All You Need"这篇论文中被提出,已经成为自然语言处理(NLP)领域的重要基石。这是因为Transfor…

苹果电脑 Java切换版本

效果 1、安装 Java1.8和Java11 直接官网下载并安装 2、安装后的文件 /资源库/Java/JavaVirtualMachines/ 3、修改配置文件 vi ~/.bash_profile#java export JAVA_8_HOME"/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home" alias jdk8expor…

大语言模型(LLM)与 Jupyter 连接起来了

现在,大语言模型(LLM)与 Jupyter 连接起来了! 这主要归功于一个名叫 Jupyter AI 的项目,它是官方支持的 Project Jupyter 子项目。目前该项目已经完全开源,其连接的模型主要来自 AI21、Anthropic、AWS、Co…

信号调制原理演示,模拟和数字调制技术大比拼

【中英双语字幕】信号调制原理演示,模拟和数字调制技术大比拼!_哔哩哔哩_bilibili

Filament for Android 编译搭建(基于Ubuntu20.04系统)

一、Filament 源代码下载 github下载地址: 2、安装clang 我是直接安装clang-10 Ubuntu 20.04 ,sudo apt install clang 命令默认就是clang-10 $sudo apt-get install clang-10 # 安装 AST.h 等头文件 $sudo apt-get install libclang-10-dev $sudo …

大语言模型:LLM的概念是个啥?

一、说明 大语言模型(维基:LLM- large language model)是以大尺寸为特征的语言模型。它们的规模是由人工智能加速器实现的,人工智能加速器能够处理大量文本数据,这些数据大部分是从互联网上抓取的。 [1]所构建的人工神…

期权定价模型系列【3】—Delta动态对冲

Delta动态对冲 本文章主要介绍常见的delta对冲概念,具体的delta动态对冲代码可以参考【期权量化】专栏同名文章 专栏地址: http://t.csdn.cn/obNflhttp://t.csdn.cn/obNfl 1.前言 期权交易有四种基本交易方式:买入看涨期权、卖出看涨期权、买…

Linux基础知识学习

一、i.mx6ull交叉编译QT项目 1、步骤 2、安装交叉编译链 使能交叉编译链,使能刚安装的编译器,不然还是老版本的 source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi 3、命令行交叉编译QT项目 wandzhangwa…

Redis系列(二):深入解读Redis的两种持久化方式

博客地址:blog.zysicyj.top Redis为什么要引入持久化机制 Redis引入持久化机制是为了解决内存数据库的数据安全性和可靠性问题。虽然内存数据库具有高速读写的优势,但由于数据存储在内存中,一旦服务器停止或崩溃,所有数据将会丢失…

由于找不到vcruntime140_1.dll,无法继续执行代码的常见解决方法

在遇到vcruntime140_1.dll丢失的问题时,我对于计算机的运行状况感到非常困扰。这个错误导致我无法正常运行某个应用程序或游戏,给我带来了很多不便。然而,在修复这个问题的过程中,我学到了一些有用的知识和技巧,下面就…

tkinter+爬虫+pygame实现音乐播放器

文章目录 前文安装模块示意图爬虫完整代码pygametkinter完整代码结尾前文 本文将涉及爬虫(数据的获取),pygame(音乐播放器),tkinter(界面显示),将他们汇聚到一起制造一个音乐播放器,欢迎大家的订阅。 安装模块 pip install requests,parsel,lxpy,pygame 示意图

volatile用法详解(c语言)

前言 volatile是易变的、不稳定的意思。或许你没见过这个关键字,但它的的确确存在着。 volatile作用 保持内存可见性 volatile关键字和const 一样是一种类型修饰符,变量可以被某些编译器未知的因素更改,比如操作系统、硬件或者其他线程等,遇到这个关键字声明的变量…

起亚中国与壳牌中国宣布战略合作协议,加速电动化品牌转型

根据相关媒体的报导,起亚中国和壳牌中国最近宣布了一项战略合作协议,旨在充分利用各自在充电基础设施方面的技术和产业资源优势,展开更深入的合作。 为了满足中国消费者对电动车的需求,起亚于今年3月发布了中国中长期电动化战略&…

Thinkphp6在线预约按摩系统H5对接杉德宝支付开发 第三方支付平台

在线预约按摩系统后端使用的是thinkphp6开发的 前端是使用uniapp开发的,在微信浏览器里面一打开就会自动授权登录 1、在\app\common.php底部增加一个打印测试使用的 if (!function_exists(ljLog)) {function ljLog($data, $logNameDEBUG, $fname"testlog&…

在Eclipse在Java里面调用Python脚本的方法

由于项目中需要用到Java调用Python的脚本,来实现一些功能,就对jython做了一些了解,通过jython可以实现java对python脚本的调用。Java调用Python开发环境配置(EclipseJythonPyDev) 1、Jython是什么 Java可以使用Jython库来调用Python库。Jyt…

Java进阶-Oracle(二十一)(2)

🌻🌻 目录 一、Oracle 数据库的操作(DDL DML DQL DCL TPL)1.1 标识符、关键字、函数等1.1.1 数值类型:1.1.2 字符串类型:1.1.3 日期类型1.1.4 大的数据类型--适合保存更多的数据 1.2 运算符1.3 函数---预定义函数、自定义函数&…

MFC 多语言对话框

可以直接看一下bilibili的这个本人录制的视频:MFC资源多语言_哔哩哔哩_bilibili 这里所说的多语言也是国际化 新建一个MFC项目,我这边是中文简体,如果想加入其他语言,方法如下: 修改完这些之后,需要在代码…

f1tenth仿真2

起点(0.192,0.201) 终点(9.902,5.148) 起点(9.902,5.148) 终点(-13.289,7.058) 起点(-13.289,7.058) 终点(-13.289,0.201) 起点(-13.289,0.201) #! /usr/bin/env python import time from numba import jit import math import rospy import numpy as…

python教程:删除列表中某个元素的3种方法

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! python中关于删除list中的某个元素,一般有三种方法:remove、pop、del: 1.remove: 删除单个元素,删除首个符合条件的元素,按值删除 举例说明: >>> str[1,2,3,4,5,…

msvcp140.dll丢失的解决方法?三个常见修复解决方法

msvcp140.dll是Microsoft Visual C Redistributable的一部分,它是一个Windows操作系统中的动态链接库文件。这个文件是由Microsoft开发的,用于提供运行C程序所需的函数和库。它通常用于许多软件和游戏中,如果缺少或损坏该文件,可能…