当前位置: 首页 > news >正文

南充网站建设制作/手机系统优化软件

南充网站建设制作,手机系统优化软件,移动开发软件,惠安网站建设报价文章目录 1.问题描述2.遗传算法2.1.算法概述2.2.编码操作2.3.选择操作2.4.交叉操作2.5.变异操作2.6.算法流程 3.算法实现3.1.MATLAB代码实现3.2.Python代码实现 4.参考文献 1.问题描述 \quad 在利用启发式算法求解问题时,我们常常需要应用遗传算法解决函数最值问题&…

文章目录

  • 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 在利用启发式算法求解问题时&#xff0c;我们常常需要应用遗传算法解决函数最值问题&…...

Docker部署nacos...用户名密码错误

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

搭建Vue开发环境

一、下载Vue.js 进入官网教程安装 — Vue.js (vuejs.org) 下载开发版本到本地 二、安装 Vue Devtools 安装完成后...

富格林:防范虚假可信投资经验

富格林指出&#xff0c;现货黄金投资作为一种全球性的金融衍生品交易&#xff0c;吸引了无数投资者的目光。它不仅具备避险属性&#xff0c;还是资产配置中不可或缺的一部分。然而&#xff0c;要想在市场中防范虚假陷阱&#xff0c;投资者必须要掌握并且利用可信的投资经验。下…...

Intent的数据传递

在Android开发中&#xff0c;使用Intent在Activity之间传递数据是一种常见的方式。然而&#xff0c;Intent确实有一些大小和类型的限制。 Intent的限制 数据大小限制&#xff1a;虽然官方没有明确说明Intent的数据大小限制&#xff0c;但是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请求类 第七章 会话管理&#xff08;Cookies&Session&#xff09; 第八章 文件上传…...

汕头 西月 公司的面试

1&#xff1b;常用的框架&#xff0c;tp 他的特性 2&#xff1a;事务&#xff0c;的使用的场景。 3&#xff1a;redis 的使用的场景 。 4&#xff1a;redis 集合使用的场景...

Spring Boot 实现不同项目之间的远程

Spring Boot 实现不同项目之间的远程调用 在分布式系统中&#xff0c;通常需要多个微服务之间进行通信。在 Spring Boot 中&#xff0c;实现远程调用的方式有很多&#xff0c;常见的方法包括使用 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&#xff0c;发现creator编辑器并不好用&#xff0c;一点都不时髦。在李大师的指导下&…...

敏感信息泄露wp

1.右键查看网页源代码 2.前台JS绕过&#xff0c;ctrlU绕过JS查看源码 3.开发者工具&#xff0c;网络&#xff0c;查看协议 4.后台地址在robots,拼接目录/robots.txt 5.用dirsearch扫描&#xff0c;看到index.phps,phps中有源码&#xff0c;拼接目录&#xff0c;下载index.phps …...

首屏性能优化

* 减少HTTP请求 * 合并css 和 JS 文件&#xff0c; * 图片精灵&#xff1a;将多个小图标合并成一张图片&#xff0c;通过CSS定位显示所需部分 * 内联小型资源&#xff1a;对于一些小的CSS和js代码&#xff0c;直接内联到HTML中 * 优化资源加载 * 延迟加载&#xff1a;对非关…...

HVV | .NET 攻防工具库,值得您拥有!

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…...

angular入门基础教程(九)依赖注入(DI)

依赖注入 Angular 中的依赖注入&#xff08;DI&#xff09;是框架最强大的特性之一。可以将依赖注入视为 Angular 在运行时为你的应用 提供所需资源的能力。依赖项可以是服务或其他资源。 使用服务的一种方式是作为与数据和 API 交互的方式。为了使服务可重用&#xff0c;应该…...

小学生也能听得懂的大模型 - Transformer 1

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

听说它可以让代码更优雅

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

自写ApiTools工具,功能参考Postman和ApiPost

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

《深入浅出WPF》学习笔记一.解析WPF程序

《深入浅出WPF》学习笔记一.解析WPF程序 visual studio帮助我们做了那些事情 引用文件 输出文件类型 按照最原始的方式&#xff0c;我们需要手动打开编译器命令行&#xff0c;使用命令引用类库将代码编译成目标文件。 visual studio会根据我们选择的项目模板&#xff0c;自动…...

Scrapy框架中,如何有效地管理和维护爬虫的日志记录?

在Scrapy框架中&#xff0c;日志记录是监控爬虫行为和调试问题的重要手段。合理地管理和维护爬虫的日志记录&#xff0c;可以帮助开发者更好地了解爬虫的运行状态&#xff0c;并及时发现和解决问题。以下是一些有效管理和维护Scrapy爬虫日志记录的技巧&#xff1a; 1. 配置日志…...

Laravel Sanctum:简化无状态API认证的新纪元

Laravel Sanctum&#xff1a;简化无状态API认证的新纪元 在现代Web应用中&#xff0c;API的安全认证是一个核心需求。Laravel Sanctum是一个轻量级的认证解决方案&#xff0c;专为Laravel开发的单页应用&#xff08;SPA&#xff09;、移动应用和API而生。它提供了一种简单而灵…...

OCC BRepOffsetAPI_ThruSections使用

目录 一、BRepOffsetAPI_ThruSections简介 二、功能与特点 三、应用场景 四、示例 一、BRepOffsetAPI_ThruSections简介 在Open CASCADE Technology (OCCT) 中,BRepOffsetAPI_ThruSections 类是用来通过放样生成一个实体或者一个面壳(Shell)。当使用这个类时,isSolid 参…...

driver. findElement()vs Selenium中的Webelement. findElement()

Selenium是一个开源工具,可以自动化Web浏览器并帮助测试Web应用程序。它是Web应用程序测试中使用最广泛的工具之一。在Selenium中,两种常用的查找Web元素的方法是driver.findElement和WebElement.findElement。本文将讨论它们之间的差异。 findElement() 方法声明 WebEl…...

jquery图片懒加载

HTML、 <div><img class"lazyload" alt"" width"1000" data-original"/skin/default/images/BB2.jpg" src"默认图片地址"/><img class"lazyload" alt"" width"1000" data-…...

【端口】-

端口总体上分为硬件端口和软件端口 硬件端口&#xff1a;路由器或者交换机上的硬件端口&#xff0c;硬件端口是不同硬件设备进行交互的接口 软件端口&#xff1a;应用层的各种协议进程与运输实体进行层间交互的一种地址...

【研发日记】Matlab/Simulink技能解锁(十一)——Stateflow中的en、du、ex应用对比

文章目录 前言 项目背景 en类型 du类型 ex类型 组合类型 分析和应用 总结 参考资料 前言 见《【研发日记】Matlab/Simulink技能解锁(六)——六种Simulink模型架构》 见《【研发日记】Matlab/Simulink技能解锁(七)——两种复数移相算法》 见《【研发日记】Matlab/Simul…...

《学会 SpringMVC 系列 · 剖析篇(上)》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…...

【Vulnhub系列】Vulnhub_SecureCode1靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_SecureCode1靶场渗透 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、环境配置 1、从百度网盘下载对应靶机的.ova镜像 2、在VM中选择【打开】该.ova 3、选择存储路径&#xff0…...

【C语言】结构体详解 -《探索C语言的 “小宇宙” 》

目录 C语言结构体&#xff08;struct&#xff09;详解结构体概览表1. 结构体的基本概念1.1 结构体定义1.2 结构体变量声明 2. 结构体成员的访问2.1 使用点运算符&#xff08;.&#xff09;访问成员输出 2.2 使用箭头运算符&#xff08;->&#xff09;访问成员输出 3. 结构体…...

基于DTW距离的KNN算法实现股票高相似筛选案例

使用DTW算法简单实现曲线的相似度计算-CSDN博客 前文中股票高相关k线筛选问题的延伸。基于github上的代码迁移应用到股票高相关预测上。 这里给出一个相关完整的代码实现案例。 1、数据准备 假设你已经有了一些历史股票的k线数据。如果数据能打标哪些股票趋势是上涨的、下跌…...