优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
遗传算法(Genetic Algorithm, GA)是一种启发式搜索算法,用于寻找复杂优化问题的近似解。它模拟了自然选择和遗传学中的进化过程,主要用于解决那些传统算法难以处理的问题。
遗传算法的基本步骤:
-
初始化种群(Initialization):生成一个由多个个体组成的初始种群。每个个体代表一个可能的解,通常以编码形式(如二进制字符串)表示。
-
评估适应度(Fitness Evaluation):对种群中的每个个体进行评估,计算其适应度值。适应度函数用于衡量个体解的质量。
-
选择操作(Selection):根据适应度值选择个体进行繁殖。常见的选择策略包括轮盘赌选择、锦标赛选择等。高适应度的个体更有可能被选中。
-
交叉操作(Crossover):将选择的个体进行交叉,生成新的个体。交叉操作模拟基因重组,以期产生更优的解。常见的交叉方式有单点交叉、多点交叉等。
-
变异操作(Mutation):对新个体进行随机变异,以引入多样性并防止早期收敛。变异操作改变个体的一部分基因,增加探索解空间的能力。
-
替换操作(Replacement):用新生成的个体替换种群中的部分个体,形成新的种群,进入下一代。
-
终止条件(Termination):检查是否满足终止条件,如达到最大迭代次数或解的适应度达到预设阈值。如果满足终止条件,算法结束;否则,返回第2步。
一、遗传算法基本原理
遗传算法(Genetic Algorithm, GA)是一种模拟自然选择和遗传学原理的优化算法。其基本原理可以从生物学中的自然选择和遗传学的机制中得到启发。下面是遗传算法的基本原理及其关键组件:
-
自然选择: 自然选择是生物进化的核心机制之一。在遗传算法中,这种机制通过评估每个个体的适应度,决定哪些个体将被选中进行繁殖。适应度较高的个体更可能被选择,这样可以逐渐优化解的质量。
-
遗传学: 遗传学机制在遗传算法中体现在交叉(Crossover)和变异(Mutation)操作上。交叉操作模拟了基因的重组,而变异操作则引入了基因的随机变化。这两个操作共同作用,产生新的个体,增加种群的多样性,并探索解空间中的新区域。
二、遗传算法公式推导
遗传算法(Genetic Algorithm, GA)的核心在于模拟自然选择和遗传学原理来寻找最优解。虽然遗传算法并没有单一的数学公式来描述其整体工作过程,但我们可以通过一些基本的公式和推导来理解其主要操作。这些公式包括适应度计算、选择概率、交叉操作和变异操作。
2.1适应度函数(Fitness Function)
适应度函数 F(x)用于评价个体 x 的质量。对于最大化问题,适应度函数通常直接等于目标函数值:
对于最小化问题,可以将适应度函数定义为目标函数的负值:
2.2选择操作(Selection)
选择操作根据个体的适应度确定其被选择的概率。最常见的选择方法是轮盘赌选择。选择概率 可以通过以下公式计算:
(1)轮盘赌选择
假设种群中有 N个个体,第 i个个体的适应度为 ,则个体 i 被选择的概率
是:
其中,分母是所有个体适应度的总和,确保选择概率之和为 1。
(2)锦标赛选择
锦标赛选择通过在种群中随机选择 k 个个体进行竞争,并选择适应度最好的个体。假设在锦标赛中选择的 k 个体的适应度为 ,则选择概率可以定义为:
2.3交叉操作(Crossover)
交叉操作生成新的个体。常见的交叉方法是单点交叉。
单点交叉
假设有两个父代个体 和
,其基因序列分别为:
选择一个交叉点 c(假设),交叉操作会生成两个子代:
多点交叉
选择多个交叉点 ,然后在这些点之间交换基因。
2.4变异操作(Mutation)
变异操作通过对个体的基因进行随机修改来引入多样性。以下是几种常见的变异方法及其公式推导。
2.4.1二进制编码的变异
对于二进制编码的个体,变异操作通常通过翻转基因位来实现。例如,个体的基因序列为 ,其中每个基因位
是 0 或 1。
变异方法:
- 对于每个基因位
,以变异概率
翻转该基因位:
这里 是变异后的基因位。
2.4.2实数编码的变异
对于实数编码的个体,变异操作可以通过在基因值上添加随机扰动来实现。例如,个体的基因序列为
变异方法:
对于每个基因 ,以变异概率
在其值上添加一个随机扰动
:
其中 是控制变异范围的参数,
是从均匀分布中抽取的随机扰动。
2.5替换操作(Replacement)
替换操作决定如何将新生成的个体替换种群中的旧个体。虽然没有固定的数学公式,但常见的替换策略包括全替换和部分替换。
2.5.1全替换
将整个种群替换为新生成的个体:
2.5.2部分替换
选择种群中最适应的个体保留,而将其他个体替换为新生成的个体:
2.6小结:
遗传算法中的核心操作包括适应度评估、选择、交叉和变异。每个操作都有其基本的公式和计算方法:
- 适应度函数:评价个体的质量。
- 选择操作:确定个体进入下一代的概率,轮盘赌选择和锦标赛选择为常用方法。
- 交叉操作:生成新个体,通过交换基因组合来探索解空间。
- 变异操作:引入基因变化,通过随机扰动或翻转基因来增加多样性。
- 替换操作:更新种群,保证适应度较高的个体保留。
这些操作结合在一起,使遗传算法能够模拟自然进化过程,并有效地搜索优化问题的解空间。
三、MATLAB仿真程序
编写遗传算法(Genetic Algorithm, GA)在MATLAB中的仿真程序可以帮助你更好地理解和实现遗传算法。下面是一个基本的MATLAB遗传算法示例,它可以解决一个简单的优化问题,例如找到函数 的最小值。我们将使用二进制编码来表示个体,并实现选择、交叉、变异以及适应度评估等操作。MATLAB仿真代码如下:
% 遗传算法基本参数设置
populationSize = 20; % 种群大小
geneLength = 10; % 基因长度(对应于二进制编码的位数)
crossoverRate = 0.8; % 交叉率
mutationRate = 0.1; % 变异率
maxGenerations = 50; % 最大迭代代数% 适应度函数(目标函数)
fitnessFunction = @(x) x.^2; % 目标是最小化x^2% 初始化种群
population = randi([0, 1], populationSize, geneLength);% 主循环:迭代遗传算法
for generation = 1:maxGenerations% 解码:将二进制编码转化为实际值decodedPopulation = bin2dec(num2str(population)) / (2^geneLength - 1) * 10; % 假设取值范围为[0, 10]% 计算适应度fitnessValues = fitnessFunction(decodedPopulation);% 选择:轮盘赌选择selectionProbabilities = (1 ./ (fitnessValues + 1)); % 使用适应度的倒数进行选择selectionProbabilities = selectionProbabilities / sum(selectionProbabilities);% 生成新种群newPopulation = zeros(size(population));for i = 1:populationSize/2% 选择父代parents = randsample(1:populationSize, 2, true, selectionProbabilities);parent1 = population(parents(1), :);parent2 = population(parents(2), :);% 交叉操作if rand < crossoverRatecrossoverPoint = randi([1, geneLength-1]);child1 = [parent1(1:crossoverPoint), parent2(crossoverPoint+1:end)];child2 = [parent2(1:crossoverPoint), parent1(crossoverPoint+1:end)];elsechild1 = parent1;child2 = parent2;end% 变异操作if rand < mutationRatemutationPoint = randi(geneLength);child1(mutationPoint) = 1 - child1(mutationPoint);endif rand < mutationRatemutationPoint = randi(geneLength);child2(mutationPoint) = 1 - child2(mutationPoint);end% 将子代添加到新种群newPopulation(2*i-1, :) = child1;newPopulation(2*i, :) = child2;end% 更新种群population = newPopulation;% 解码并显示当前种群中最优解decodedPopulation = bin2dec(num2str(population)) / (2^geneLength - 1) * 10;[~, bestIndex] = min(fitnessFunction(decodedPopulation));bestSolution = decodedPopulation(bestIndex);disp(['Generation: ', num2str(generation), ', Best Solution: ', num2str(bestSolution), ', Fitness: ', num2str(fitnessFunction(bestSolution))]);
end
代码解释
-
参数设置:
populationSize
: 种群大小。geneLength
: 每个个体的基因长度(即二进制编码的位数)。crossoverRate
: 交叉操作的概率。mutationRate
: 变异操作的概率。maxGenerations
: 最大迭代次数。
-
适应度函数:
- 使用目标函数
fitnessFunction
来计算个体的适应度。在本例中,目标是最小化函数。
- 使用目标函数
-
初始化种群:
- 随机生成初始种群,每个个体由二进制编码表示。
-
主循环:
- 解码:将二进制编码转化为实际值。
- 计算适应度:根据目标函数计算每个个体的适应度。
- 选择:使用轮盘赌选择算法选择父代个体。
- 交叉:通过交叉操作生成子代个体。
- 变异:对子代个体进行随机变异。
- 更新种群:用新生成的个体替换旧种群。
-
显示结果:
- 在每一代中显示当前最优解及其适应度值。
注意事项
- 该示例代码使用了简单的适应度函数和基本的遗传操作,实际应用中可能需要根据具体问题调整适应度函数、选择策略、交叉方法和变异操作。
- 适应度函数的设计应根据实际问题进行调整,确保能够有效地引导搜索过程向最优解靠近。
通过这个示例,你可以在MATLAB中实现遗传算法,并根据实际需要对其进行扩展和改进。
相关文章:
优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
遗传算法(Genetic Algorithm, GA)是一种启发式搜索算法,用于寻找复杂优化问题的近似解。它模拟了自然选择和遗传学中的进化过程,主要用于解决那些传统算法难以处理的问题。 遗传算法的基本步骤: 初始化种群࿰…...
高等数学 2.3 高阶导数
一般地,函数 y f ( x ) y f(x) yf(x) 的导数 y ′ f ′ ( x ) y\ f\ (x) y ′f ′(x) 仍然是 x x x 的函数。我们把 y ′ f ′ ( x ) y\ f\ (x) y ′f ′(x) 的导数叫做函数 y f ( x ) y f(x) yf(x) 的二阶导数,记作 y ′ ′ y\ y ′…...

app抓包 chrome://inspect/#devices
一、前言: 1.首先不支持flutter框架,可支持ionic、taro 2.初次需要翻墙 3.app为debug包,非release 二、具体步骤 1.谷歌浏览器地址:chrome://inspect/#devices qq浏览器地址:qqbrowser://inspect/#devi…...
SAP自动化-ME12批量更新某行价格
Python源码 #-Begin-----------------------------------------------------------------#-Includes-------------------------------------------------------------- import sys, win32com.client import os#-Sub Main----------------------------------------------------…...
数据库系统 第58节 概述源码示例
深入探讨数据库技术,我们将通过具体的源代码示例来进一步解释数据库分区、复制、集群和镜像等高级特性。 数据库分区的源代码示例 哈希分区 在PostgreSQL中,可以使用哈希分区来创建一个分区表: CREATE TABLE measurements (city_id …...

软件设计师——程序设计语言
目录 低级语言和高级语言 编译程序和解释程序 正规式,词法分析的一个工具 有限自动机 编辑 上下文无关法 编辑 中后缀表示法 杂题 编辑 低级语言和高级语言 编译程序和解释程序 计算机只能理解由0、1序列构成的机器语言,因此高级程序设计…...

【在Linux世界中追寻伟大的One Piece】五种IO模型和阻塞IO
目录 1 -> 五种IO模型 1.1 -> 阻塞IO(Blocking IO) 1.2 -> 非阻塞IO(Non-blocking IO) 1.3 -> 信号驱动IO(Signal-Driven IO) 1.4 -> IO多路转接(IO Multiplexing) 1.5 -> 异步IO(Asynchronous IO) 2 -> 高级IO概念 2.1 -> 同步通信VS异步通信…...

nginx实现权重机制(nginx基础配置二)
在上一篇文章中我们已经完成了对轮询机制的测试,详情请看轮询机制。 接下来我们进行权重机制的测试 一、conf配置 upstream backServer{ server 127.0.0.1:8080 weight2; server 127.0.0.1:8081 weight1; } server { listen 80; server_name upstream.boyatop.cn…...

华为的仓颉和ArkTS这两门语言有什么区别
先贴下官网: ArkTs官网 仓颉官网 ArkTS的官网介绍说,ArkTS是TypeScript的进一步强化版本,简单来说就是包含了TS的风格,但是做了一些改进。 了解TypeScript的朋友都应该知道,其实TypeScript就是JavaScript的改进版本&…...
(SERIES10)DM逻辑备份还原
1 概念 逻辑备份还原是对数据库逻辑组件(如表、视图和存储过程等数据库对象)的备份还原。逻辑导出(dexp)和逻辑导入(dimp)是 DM 数据库的两个命令行工具,分别用来实现对 DM 数据库的逻辑备份和逻…...
Java零基础-StringBuilder类详解
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互…...

免费爬虫软件“HyperlinkCollector超链采集器v0.1”
HyperlinkCollector超链采集器单机版v0.1 软件采用python的pyside2和selenium开发,暂时只支持window环境,抓取方式支持普通程序抓取和selenium模拟浏览器抓取。软件遵守robots协议。 首先下载后解压缩,然后运行app目录下的HyperlinkCollector.exe 运行…...
OPENAIGC开发者大赛企业组AI黑马奖 | AIGC数智传媒解决方案
在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给您…...

k8s(kubernetes)的PV / PVC / StorageClass(理论+实践)
NFS总是不支持PVC扩容 先来个一句话总结:PV、PVC是K8S用来做存储管理的资源对象,它们让存储资源的使用变得可控,从而保障系统的稳定性、可靠性。StorageClass则是为了减少人工的工作量而去自动化创建PV的组件。所有Pod使用存储只有一个原则&…...

前端Excel热成像数据展示及插值算法
🎬 江城开朗的豌豆:个人主页 🔥 个人专栏:《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️生活的理想,就是为了理想的生活! 目录 📘 前言 📘一、热成像数…...

VBA_NZ系列工具NZ01: VBA二维码应用技术
我的教程一共九套及VBA汉英手册一部,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到数据库,到字典,到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑,这么多知识点该如何组织…...

小明震惊OpenAI 的新模型 01
在硅谷的中心,繁忙的咖啡馆和创业中心周围,年轻的软件工程师小明坐在他的办公桌前,面露困惑。科技界一直在盛传一项新的AI突破,但他持怀疑态度,不敢抱太大希望。他认为AI泡沫即将破灭,炒作列车即将出轨&…...

Clickhouse使用笔记
clickhouse官方文档:https://clickhouse.com/docs/zh/sql-reference/data-types/decimal 一,建表 create table acitivity_user_record ( id String DEFAULT generateUUIDv4(), -- 主键自增 activityId String, userId String, userName Nullable(Strin…...

基于高通主板的ARM架构服务器
一、ARM架构服务器的崛起 (一)市场需求推动 消费市场寒冬,全球消费电子需求下行,服务器成半导体核心动力之一。Arm 加速布局服务器领域,如 9 月推出 Neoverse V2。长久以来,x86 架构主导服务器市场&#…...

AV1 Bitstream Decoding Process Specification--[2]:符号和缩写术语
原文地址:https://aomediacodec.github.io/av1-spec/av1-spec.pdf没有梯子的下载地址:AV1 Bitstream & Decoding Process Specification摘要:这份文档定义了开放媒体联盟(Alliance for Open Media)AV1视频编解码器…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
多元隐函数 偏导公式
我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z、 …...