智能优化算法(三):遗传算法
文章目录
- 1.问题描述
- 2.遗传算法
- 2.1.算法概述
- 2.2.编码操作
- 2.3.选择操作
- 2.4.交叉操作
- 2.5.变异操作
- 2.6.算法流程
- 3.算法实现
- 3.1.MATLAB代码实现
- 3.2.Python代码实现
- 4.参考文献
1.问题描述
\quad 在利用启发式算法求解问题时,我们常常需要应用遗传算法解决函数最值问题,也是遗传算法在数学中最常应用到的方面,遗传算法的思想是通过种群的迭代最后求解出某一函数的最值 (最大值/最小值) 或者极值 (极大值与极小值),具体的问题描述与见下文。
\quad 利用二进制编码的遗传算来求解函数优化问题:
max f ( x ) = x + 10 sin ( 5 x ) + 7 cos ( 4 x ) s.t.x ∈ [ 0 , 10 ] \max f(x)=x+10\sin(5x)+7\cos(4x)\quad\text{s.t.x}\in[0,10] maxf(x)=x+10sin(5x)+7cos(4x)s.t.x∈[0,10]
2.遗传算法
2.1.算法概述
\quad 遗传算法(Genetic Algorithm, GA)是一种基于自然选择和遗传学原理的优化算法。它模仿了生物进化过程,通过模拟自然选择、交叉、变异等遗传操作,逐步优化问题的解。遗传算法是进化算法的一种,广泛应用于优化问题、机器学习、人工智能等领域。
\quad 其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,不需要确定的规则就能自动获取和指导优化的搜索空间,自适应地调整搜索方向。
\quad 遗传算法以一种群体中的所有个体为对象,并利用随机化技术指导对一个被编码的参数空间进行高效搜索。其中,选择、交叉和变异构成了遗传算法的遗传操作;参数编码、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容。
2.2.编码操作
\quad 遗传算法的解空间与编码空间的可能需要进行适当的转换,也就是说适值计算需要在解空间内进行,而遗传运算是对编码空间操作的,所以要进行两个空间的转换,单体的数值的转化如图1所示,常常利用二进制编码与十进制编码的转化方法,同时整体种群的变异,交叉等操作都需要在二进制编码上进行,如图2所示。
2.3.选择操作
\quad 在遗传算法每一代的遗传方面,就涉及到了选择操作,选择概率的计算方法,按比例的适应度函数、基于排序的适应度计算等,其中选择算法有轮盘赌选择、随机遍历抽样、截断选择、锦标赛选择等方法,我们最常利用轮盘赌方法来进行选择操作。
\quad 轮盘赌选择(Roulette Wheel Selection)是一种遗传算法中常用的选择方法。它的基本思想是根据个体的适应度值来决定其被选择的概率,类似于在轮盘上抽签。首先,我们计算种群中每个个体的适应度值,适应度值反映了个体在当前问题中的表现。然后,将这些适应度值归一化,转换为每个个体的选择概率,确保所有个体的选择概率加起来等于1。接着,计算累积概率(即累积适应度值),每个个体的累积概率表示从第一个个体到当前个体的总选择概率。然后在选择个体时,生成一个0到1之间的随机数r,然后通过比较这个随机数与累积概率,确定选择的个体。如果随机数r小于某个累积概率CDF_i,则选择对应的第i个个体。这样,每个个体被选择的概率与其适应度成正比,适应度越高的个体被选择的概率越大。
2.4.交叉操作
\quad 交叉(Crossover)是指在遗传算法中,一对父代个体发生染色体交叉交换的操作,交叉发生的概率叫做交叉率,通常用Pc表示,常设定为0.8至0.9。根据编码方式的不同,交叉操作有多种形式:对于二进制和整数编码,常见的交叉方法包括单切点交叉、双切点交叉和均匀交叉;对于顺序编码,则使用部分映射交叉、顺序交叉和循环交叉;对于实数编码,则包括离散交叉和线性重组等方法。
\quad 其中,单切点交叉(Single-Point Crossover) 是最基础的一种交叉方法,适用于二进制和整数编码。在单切点交叉中,首先在父代个体的基因序列中随机选择一个切点,然后将两个父代个体在该切点处分开,交换彼此的基因部分,以生成新的子代个体。例如,假设有两个父代个体A和B,切点选择在第k位,那么子代个体C和D的基因序列将是父代个体A和B在切点k处分开的部分进行交换,从而生成新的个体。单切点交叉的优点是实现简单,能够有效地在基因之间进行信息重组,促进解空间的探索。
2.5.变异操作
\quad 变异率(Mutation Rate),用Pm表示,是遗传算法中控制染色体上基因发生变异的概率,通常设置得较小,一般在0.05以下,以维持种群的稳定性。变异操作首先需要根据变异率Pm,随机选择NPPm个个体进行变异,其中NP是种群大小。对于每个被选中的个体,再随机选择round(LPm)个基因进行变异,将这些基因的值进行取反,即0变成1,1变成0。最终,将变异后的个体更新到种群中,并保留最优个体fBest在新种群中,以确保最优解不会丢失。这种变异操作通过引入基因的多样性,帮助算法避免陷入局部最优解,同时保持种群的优秀特征。
2.6.算法流程
\quad 遗传算法的基本流程包括几个关键步骤。首先,生成初始种群,通过随机方式创建一组个体。接下来,计算每个个体的适应度值,评估其在目标函数中的表现。然后,根据适应度值选择个体进入下一代,常用的选择方法包括轮盘赌选择和锦标赛选择。选择后的个体进行交叉操作,模拟基因重组,生成新的子代个体。接着,对新生成的个体进行变异操作,引入基因变异,以增加种群的多样性。更新种群时,将新个体与旧种群结合,可能需要替换一些旧个体,并保留最优个体以确保优秀基因的传递。最后,检查是否满足终止条件,如达到最大代数或适应度收敛,若满足条件则结束算法,输出当前代中最优个体作为近似解。这些步骤帮助遗传算法逐步优化解的质量,并在复杂的解空间中寻找最优解。
3.算法实现
3.1.MATLAB代码实现
%%%%%%%%%%%%%%%%%%%%标准遗传算法求函数极值%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%初始化参数%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
tic;
NP=100; %种群数量
L=20; %二进制数串长度
Pc=0.8; %交叉率
Pm=0.7; %变异率
G=100; %最大遗传代数
Xs=10; %上限
Xx=0; %下限
%编码方式采用二进制编码方法
f=randi([0,1],NP,L); %随机获得初始种群
%%%%%%%%%%%%%%%%%%%%%%%%%遗传算法循环%%%%%%%%%%%%%%%%%%%%%%%%
for k=1:G
%%%%%%%%%%%%将二进制解码为定义域范围内十进制%%%%%%%%%%%%%%
for i=1:NPU=f(i,:);m=0;for j=1:L%将二进制编码转化为十进制m=U(j)*2^(j-1)+m;end%将解码结果映射到[Xx,Xs]区间x(i)=Xx+m*(Xs-Xx)/(2^L-1);Fit(i)= func2(x(i));%带入值进行计算
endmaxFit=max(Fit); %最大值
minFit=min(Fit); %最小值
rr=find(Fit==maxFit);%获取最优结果对应的索引
fBest=f(rr(1,1),:); %历代最优个体
xBest=x(rr(1,1));%获取最好的结果
Fit=(Fit-minFit)/(maxFit-minFit); %归一化适应度值
%%%%%%%%%%%%%%%%%%基于轮盘赌的复制操作%%%%%%%%%%%%%%%%%%%
sum_Fit=sum(Fit);
fitvalue=Fit./sum_Fit;%将适应度转化为被选择的概率
fitvalue=cumsum(fitvalue);%变成当前被选择时的累计概率
ms=sort(rand(NP,1));%生成随机数
fiti=1;newi=1;
%轮盘赌选择个体
while newi<=NPif (ms(newi))<fitvalue(fiti)nf(newi,:)=f(fiti,:);newi=newi+1;elsefiti=fiti+1;end
end
%%%%%%%%%%%%%%%%%%%%%%基于概率的交叉操作%%%%%%%%%%%%%%%%%%
for i=1:2:NP%简单地随机交叉操作p=rand;%随机生成一个p如果p小于pc,执行交叉操作,反正不执行。if p<Pc%随机选择交叉的位置q=randi([0,1],1,L);for j=1:Lif q(j)==1;temp=nf(i+1,j);nf(i+1,j)=nf(i,j);nf(i,j)=temp;endendend
end
%%%%%%%%%%%%%%%%%%%基于概率的变异操作%%%%%%%%%%%%%%%%%%%%%%%
i=1;while i<=round(NP*Pm)%随机选择NP*Pm个个体进行变异h=randi([1,NP],1,1); %随机选取一个需要变异的染色体for j=1:round(L*Pm)g=randi([1,L],1,1); %随机需要变异的基因数nf(h,g)=~nf(h,g);%0,1的位置取反endi=i+1;endf=nf;f(1,:)=fBest; %保留最优个体在新种群中trace(k)=maxFit; %历代最优适应度
end
xBest; %最优个体
figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
print(gcf,'C:\Users\Zeng Zhong Yan\Desktop\GA','-dpng','-r600')
3.2.Python代码实现
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Times New Roman'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 定义优化的目标函数
def func1(x):return x + 10 * np.sin(5 * x) + 7 * np.cos(4 * x)# 初始化参数
NP = 100 # 种群大小
L = 20 # 二进制字符串的长度
Pc = 0.8 # 交叉率
Pm = 0.9 # 变异率
G = 50 # 最大代数
Xs = 10 # 上界
Xx = 0 # 下界# 生成初始种群
f = np.random.randint(0, 2, (NP, L))# 遗传算法循环
trace = np.zeros(G)
for k in range(G):# 将二进制字符串解码为十进制数x = np.zeros(NP)for i in range(NP):U = f[i, :]m = sum(U[j] * 2**j for j in range(L))x[i] = Xx + m * (Xs - Xx) / (2**L - 1)# 计算每个个体的适应度Fit = np.array([func1(xi) for xi in x])maxFit = np.max(Fit)minFit = np.min(Fit)rr = np.where(Fit == maxFit)[0]fBest = f[rr[0], :] # 记录当前代的最优个体xBest = x[rr[0]]# 归一化适应度值Fit = (Fit - minFit) / (maxFit - minFit)# 轮盘赌选择sum_Fit = np.sum(Fit)fitvalue = Fit / sum_Fitfitvalue = np.cumsum(fitvalue) # 计算累积适应度值ms = np.sort(np.random.rand(NP)) # 生成并排序随机数new_population = np.zeros_like(f)fiti = 0newi = 0while newi < NP:if ms[newi] < fitvalue[fiti]:new_population[newi, :] = f[fiti, :]newi += 1else:fiti += 1# 交叉操作for i in range(0, NP, 2):if np.random.rand() < Pc:q = np.random.randint(0, 2, L)for j in range(L):if q[j] == 1:new_population[i, j], new_population[i+1, j] = new_population[i+1, j], new_population[i, j]# 变异操作for i in range(round(NP * Pm)):h = np.random.randint(0, NP)for j in range(round(L * Pm)):g = np.random.randint(0, L)new_population[h, g] = 1 - new_population[h, g]f = new_populationf[0, :] = fBest # 保留最优个体在新种群中trace[k] = maxFit # 记录每代的最优适应度值print("最优个体:", xBest)# 绘制适应度进化曲线
plt.plot(trace)
plt.xlabel('The number of iterations',fontsize=14)
plt.ylabel('The value of the objective function',fontsize=14)
plt.title('Fitness Evolution Curve ',fontsize=18)
plt.savefig('GA.svg', dpi=600,bbox_inches='tight')
plt.show()
4.参考文献
[1]https://blog.csdn.net/LOVEmy134611/article/details/111639624
[2]https://blog.csdn.net/zyx_bx/article/details/115188782
[3]https://baike.baidu.com/item/
[4]https://chatgpt.com/
相关文章:

智能优化算法(三):遗传算法
文章目录 1.问题描述2.遗传算法2.1.算法概述2.2.编码操作2.3.选择操作2.4.交叉操作2.5.变异操作2.6.算法流程 3.算法实现3.1.MATLAB代码实现3.2.Python代码实现 4.参考文献 1.问题描述 \quad 在利用启发式算法求解问题时,我们常常需要应用遗传算法解决函数最值问题&…...

Docker部署nacos...用户名密码错误
前提 镜像选择v2.3.0版本,因为最新的没拉下来用的别的地方save load的镜像。 官方示例 官方文档 数据库脚本,直接去数据库新建数据库nacos吧,执行脚本,执行完成后,发现只有建表语句,查询得知,…...

搭建Vue开发环境
一、下载Vue.js 进入官网教程安装 — Vue.js (vuejs.org) 下载开发版本到本地 二、安装 Vue Devtools 安装完成后...
富格林:防范虚假可信投资经验
富格林指出,现货黄金投资作为一种全球性的金融衍生品交易,吸引了无数投资者的目光。它不仅具备避险属性,还是资产配置中不可或缺的一部分。然而,要想在市场中防范虚假陷阱,投资者必须要掌握并且利用可信的投资经验。下…...
Intent的数据传递
在Android开发中,使用Intent在Activity之间传递数据是一种常见的方式。然而,Intent确实有一些大小和类型的限制。 Intent的限制 数据大小限制:虽然官方没有明确说明Intent的数据大小限制,但是Intent是通过Binder机制进行IPC&…...

【NPU 系列专栏 3.1 -- - ARM NPU 有哪些型号?】
请阅读【嵌入式及芯片开发学必备专栏】 文章目录 ARM X 系列和 Z 系列 NPU 详解ARM X 系列 NPUARM X 系列 NPU型号和算力ARM X 系列 NPU 应用场景ARM Z 系列 NPU 简介ARM Z 系列 NPU 型号和算力ARM Z 系列 NPU 应用场景SummaryARM X 系列和 Z 系列 NPU 详解 ARM 的 NPU(Neura…...
如何运行别人的vue项目
文章目录 如何运行别人的vue项目一、删除现有的node_modules二、npm换源三、清理缓存四、进行依赖安装五、运行服务器 如何运行别人的vue项目 一、删除现有的node_modules 二、npm换源 换成淘宝的镜像源 查看当前镜像源 npm config get registry更换淘宝镜像源 npm confi…...

【Django5】内置Admin系统
系列文章目录 第一章 Django使用的基础知识 第二章 setting.py文件的配置 第三章 路由的定义与使用 第四章 视图的定义与使用 第五章 二进制文件下载响应 第六章 Http请求&HttpRequest请求类 第七章 会话管理(Cookies&Session) 第八章 文件上传…...
汕头 西月 公司的面试
1;常用的框架,tp 他的特性 2:事务,的使用的场景。 3:redis 的使用的场景 。 4:redis 集合使用的场景...
Spring Boot 实现不同项目之间的远程
Spring Boot 实现不同项目之间的远程调用 在分布式系统中,通常需要多个微服务之间进行通信。在 Spring Boot 中,实现远程调用的方式有很多,常见的方法包括使用 REST API、gRPC、以及 Spring Cloud Feign 等。本篇博客将详细介绍如何在不同的…...

【VS2019安装+QT配置】
【VS2019安装QT配置】 1. 前言2. 下载visual studio20193. visual studio2019安装4. 环境配置4.1 系统环境变量配置4.2 qt插件开发 5. Visual Studio导入QT项目6. 总结 1. 前言 前期安装了qt,发现creator编辑器并不好用,一点都不时髦。在李大师的指导下&…...

敏感信息泄露wp
1.右键查看网页源代码 2.前台JS绕过,ctrlU绕过JS查看源码 3.开发者工具,网络,查看协议 4.后台地址在robots,拼接目录/robots.txt 5.用dirsearch扫描,看到index.phps,phps中有源码,拼接目录,下载index.phps …...
首屏性能优化
* 减少HTTP请求 * 合并css 和 JS 文件, * 图片精灵:将多个小图标合并成一张图片,通过CSS定位显示所需部分 * 内联小型资源:对于一些小的CSS和js代码,直接内联到HTML中 * 优化资源加载 * 延迟加载:对非关…...

HVV | .NET 攻防工具库,值得您拥有!
01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失…...

angular入门基础教程(九)依赖注入(DI)
依赖注入 Angular 中的依赖注入(DI)是框架最强大的特性之一。可以将依赖注入视为 Angular 在运行时为你的应用 提供所需资源的能力。依赖项可以是服务或其他资源。 使用服务的一种方式是作为与数据和 API 交互的方式。为了使服务可重用,应该…...

小学生也能听得懂的大模型 - Transformer 1
参考 [小学生也能听得懂的大模型 Transformer 1]...

听说它可以让代码更优雅
一提到静态代码检查工具这个词应该比较好理解,所谓静态代码检查工具就是检查静态代码的工具,完美~ 言归正传,相信很多程序员朋友都听说过静态代码检查工具这个概念,它可能是我们IDE里的某一个插件,可能是计算机中的一…...

自写ApiTools工具,功能参考Postman和ApiPost
近日在使用ApiPost的时候,发现新版本8和7不兼容,也就是说8不支持离线操作,而7可以。 我想说,我就是因为不想登录使用才从Postman换到ApiPost的。 众所周知,postman时国外软件,登录经常性抽风,…...

《深入浅出WPF》学习笔记一.解析WPF程序
《深入浅出WPF》学习笔记一.解析WPF程序 visual studio帮助我们做了那些事情 引用文件 输出文件类型 按照最原始的方式,我们需要手动打开编译器命令行,使用命令引用类库将代码编译成目标文件。 visual studio会根据我们选择的项目模板,自动…...
Scrapy框架中,如何有效地管理和维护爬虫的日志记录?
在Scrapy框架中,日志记录是监控爬虫行为和调试问题的重要手段。合理地管理和维护爬虫的日志记录,可以帮助开发者更好地了解爬虫的运行状态,并及时发现和解决问题。以下是一些有效管理和维护Scrapy爬虫日志记录的技巧: 1. 配置日志…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...