粒子群算法 笔记 数学建模

news2025/1/29 7:27:02

引入:

如何找到全局最大值:如果只是贪心的话,容易被局部最大解锁定

方法有:盲目搜索,启发式搜索

盲目搜索:枚举法和蒙特卡洛模拟,但是样例太多花费巨量时间

所以启发式算法就来了,通过经验和规律减少尝试的次数去解决这个问题

启发式算法的总结:

1)有助于找到最优解,但是不一定能找到最优解

2)有助于加速找到最优解

粒子群算法:

由肯尼迪和埃伯哈特于 1995 年提出, 是一种受鸟群、鱼群等群体生物觅食行为启发的智能优化算法,在多领域广泛应用。以下从原理、算法流程、应用场景、优缺点展开介绍:

基本原理:

将优化问题的潜在解视为搜索空间中的粒子,每个粒子都有位置和速度两个属性。粒子在解空间中以一定速度飞行,通过不断调整自身位置来搜索最优解。在飞行过程中,粒子会参考自身历史最优位置(pbest)和群体历史最优位置(gbest)来更新自己的速度和位置。例如,在一个二维平面上寻找函数最小值问题中,每个粒子代表一个可能的解点,粒子根据自身曾经到达过的最优位置以及整个群体目前找到的最优位置来决定下一步往哪个方向移动以及移动多远。

这只鸟第d步所在的位置 = 第d‐1步所在的位置 + 第d‐1步的速度 * 运动的时间

x(d) = x(d‐1) + v(d‐1)  * t    (每一步运动的时间t一般取1)

这只鸟第d步的速度 =上一步自身的速度惯性 + 自我认知部分 +社会认知部分

v(d) = w*v(d‐1)  + c1*r1*(pbest(d)‐x(d))  + c2*r2*(gbest(d)‐x(d))   (三个部分的和)

粒子群算法中的基本概念

Ø粒子优化问题的候选解

Ø位置:候选解所在的位置

Ø速度:候选解移动的速度

Ø适应度:评价粒子优劣的值,一般设置为目标函数值

Ø个体最佳位置:单个粒子迄今为止找到的最佳位置

Ø群体最佳位置:所有粒子迄今为止找到的最佳位置

算法流程

初始化:随机生成一群粒子,确定每个粒子的初始位置和速度。这些初始值在问题的解空间内随机分布,为后续搜索奠定基础。

适应度计算:根据优化问题的目标函数,计算每个粒子的适应度值,以此评估粒子当前位置的优劣。例如在求解函数最大值问题中,将粒子位置代入函数计算得到的函数值就是该粒子的适应度。

更新个体最优和全局最优:每个粒子将自身当前适应度与其历史最优位置的适应度进行比较,若当前更好,则更新自身历史最优位置(pbest)。同时,所有粒子的适应度相互比较,找出整个群体当前的最优位置(gbest)。

速度和位置更新:依据特定公式,结合粒子自身的速度、当前位置与个体最优位置、全局最优位置的距离,更新粒子的速度和位置。公式中通常包含惯性权重、学习因子等参数,用于平衡粒子的全局搜索和局部搜索能力。例如,惯性权重较大时,粒子倾向于保持原有飞行方向,进行全局搜索;学习因子较大时,粒子更关注自身经验和群体经验,加强局部搜索。

终止判断:检查是否满足终止条件,如达到最大迭代次数、适应度值收敛到一定精度等。若满足,则输出全局最优解;否则,返回适应度计算步骤继续迭代。

例题:求一元函数的最大值

first先画出一开始1函数图

x = -3:0.01:3;

y = 11*sin(x) + 7*cos(5*x);

figure(1)

plot(x,y,'b-')

title('y = 11*sin(x) + 7*cos(5*x)')

hold on % 不关闭图形,继续在上面画图

然后设置粒子的参数

n = 10; % 粒子数量

narvs = 1; % 变量个数

c1 = 2; % 每个粒子的个体学习因子,也称为个体加速常数

c2 = 2; % 每个粒子的社会学习因子,也称为社会加速常数

w = 0.9; % 惯性权重

K = 50; % 迭代的次数

vmax = 1.2; % 粒子的最大速度

x_lb = -3; % x的下界

x_ub = 3; % x的上界

然后初始化例子的位置和速度

x = zeros(n,narvs);

for i = 1: narvs

x(:,i) = x_lb(i) + (x_ub(i)-x_lb(i))*rand(n,1); % 随机初始化粒子所在的位置在定义域内

end

v = -vmax + 2*vmax .* rand(n,narvs); % 随机初始化粒子的速度(这里我们设置为[-vmax,vmax])

计算粒子的适应度(也就是对应的y值)

fit = zeros(n,1); % 初始化这n个粒子的适应度全为0

for i = 1:n % 循环整个粒子群,计算每一个粒子的适应度

fit(i) = Obj_fun1(x(i,:)); % 调用Obj_fun1函数来计算适应度(这里写成x(i,:)主要是为了和以后遇到的多元函数互通)

end

找到适应度最大的下标

pbest = x; % 初始化这n个粒子迄今为止找到的最佳位置(是一个n*narvs的向量)

ind = find(fit == max(fit), 1); % 找到适应度最大的那个粒子的下标

并记录最大值

gbest = x(ind,:); % 定义所有粒子迄今为止找到的最佳位置(是一个1*narvs的向量)

模拟绘制出过程

h = scatter(x,fit,80,'*r'); % scatter是绘制二维散点图的函数,80是我设置的散点显示的大小(这里返回h是为了得到图形的句柄,未来我们对其位置进行更新)

接下来迭代k次来更新位置和速度

伪代码:

迭代k次

更新每个例子的信息

调整速度

调整位置

检测速度是否超出范围

检测位置是否超出定义域

更新当前的适应度

检测自学习是否需要更新

检测社会学习是否要更新

fitnessbest = ones(K,1); % 初始化每次迭代得到的最佳的适应度

for d = 1:K % 开始迭代,一共迭代K次

for i = 1:n % 依次更新第i个粒子的速度与位置

v(i,:) = w*v(i,:) + c1*rand(1)*(pbest(i,:) - x(i,:)) + c2*rand(1)*(gbest - x(i,:)); % 更新第i个粒子的速度

% 如果粒子的速度超过了最大速度限制,就对其进行调整

for j = 1: narvs

if v(i,j) < -vmax(j)

v(i,j) = -vmax(j);

elseif v(i,j) > vmax(j)

v(i,j) = vmax(j);

end

end

x(i,:) = x(i,:) + v(i,:); % 更新第i个粒子的位置

% 如果粒子的位置超出了定义域,就对其进行调整

for j = 1: narvs

if x(i,j) < x_lb(j)

x(i,j) = x_lb(j);

elseif x(i,j) > x_ub(j)

x(i,j) = x_ub(j);

end

end

fit(i) = Obj_fun1(x(i,:)); % 重新计算第i个粒子的适应度

if fit(i) > Obj_fun1(pbest(i,:)) % 如果第i个粒子的适应度大于这个粒子迄今为止找到的最佳位置对应的适应度

pbest(i,:) = x(i,:); % 那就更新第i个粒子迄今为止找到的最佳位置

end

if fit(i) > Obj_fun1(gbest) % 如果第i个粒子的适应度大于所有的粒子迄今为止找到的最佳位置对应的适应度

gbest = pbest(i,:); % 那就更新所有粒子迄今为止找到的最佳位置

end

end

fitnessbest(d) = Obj_fun1(gbest); % 更新第d次迭代得到的最佳的适应度

pause(0.1) % 暂停0.1s

h.XData = x; % 更新散点图句柄的x轴的数据(此时粒子的位置在图上发生了变化)

h.YData = fit; % 更新散点图句柄的y轴的数据(此时粒子的位置在图上发生了变化)

end

figure(2)

plot(fitnessbest) % 绘制出每次迭代最佳适应度的变化图

xlabel('迭代次数');

disp('最佳的位置是:'); disp(gbest)

disp('此时最优值是:'); disp(Obj_fun1(gbest))

例题2:求二元函数的最小值

x1 = -15:1:15;

x2 = -15:1:15;

[x1,x2]=meshgrid(x1,x2);

y = x1.^2+x2.^2-x1.*x2-10*x1-4*x2+60;

figure(1);

mesh(x1,x2,y);

title('y = 11*sin(x) + 7*cos(5*x)')

hold on % 不关闭图形,继续在上面画图

n = 50; % 粒子数量

narvs = 2; % 变量个数

c1 = 2; % 每个粒子的个体学习因子,也称为个体加速常数

c2 = 2; % 每个粒子的社会学习因子,也称为社会加速常数

w = 0.9; % 惯性权重

K = 50; % 迭代的次数

vmax =[4,4]; % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

x_lb = [-15,-15]; % x%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

x_ub = [15,15]; % x的上界

x = zeros(n,narvs);

for i = 1: narvs

x(:,i) = x_lb(i) + (x_ub(i)-x_lb(i))*rand(n,1); % 随机初始化粒子所在的位置在定义域内

end

v = -vmax + 2*vmax .* rand(n,narvs);

fit = zeros(n,1); % 初始化这n个粒子的适应度全为0

for i = 1:n % 循环整个粒子群,计算每一个粒子的适应度

fit(i) = only(x(i,:)); %&&&&%%%%%%%%%

end

pbest = x; % 初始化这n个粒子迄今为止找到的最佳位置(是一个n*narvs的向量)

ind = find(fit == min(fit), 1); % 找到适应度最大的那个粒子的下标

gbest = x(ind,:); % 定义所有粒子迄今为止找到的最佳位置(是一个1*narvs的向量)

h = scatter3(x(:,1),x(:,2),fit,100,'*r'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%

fitnessbest = ones(K,1); % 初始化每次迭代得到的最佳的适应度

for d = 1:K % 开始迭代,一共迭代K次

for i = 1:n % 依次更新第i个粒子的速度与位置

v(i,:) = w*v(i,:) + c1*rand(1)*(pbest(i,:) - x(i,:)) + c2*rand(1)*(gbest - x(i,:)); % 更新第i个粒子的速度

% 如果粒子的速度超过了最大速度限制,就对其进行调整

for j = 1: narvs

if v(i,j) < -vmax(j)

v(i,j) = -vmax(j);

elseif v(i,j) > vmax(j)

v(i,j) = vmax(j);

end

end

x(i,:) = x(i,:) + v(i,:); % 更新第i个粒子的位置

% 如果粒子的位置超出了定义域,就对其进行调整

for j = 1: narvs

if x(i,j) < x_lb(j)

x(i,j) = x_lb(j);

elseif x(i,j) > x_ub(j)

x(i,j) = x_ub(j);

end

end

fit(i) = only(x(i,:)); % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

if fit(i) < only(pbest(i,:)) % 555555555555555555455555555555555555%%%%%%

pbest(i,:) = x(i,:); % 那就更新第i个粒子迄今为止找到的最佳位置

end

if fit(i) < only(gbest) % %%%%%%%%%%%%%%%%%%%%%%%%%%%

gbest = pbest(i,:); % 那就更新所有粒子迄今为止找到的最佳位置

end

end

fitnessbest(d) = only(gbest); % %%%%%%%%%%%%%%%%%%%

pause(0.1) % 暂停0.1s

h.XData = x(:,1); % 更新散点图句柄的x轴的数据(此时粒子的位置在图上发生了变化)

h.YData = x(:,2); % 更新散点图句柄的x轴的数据(此时粒子的位置在图上发生了变化)

h.ZData = fit; % 更新散点图句柄的y轴的数据(此时粒子的位置在图上发生了变化)

end

figure(2)

plot(fitnessbest) % 绘制出每次迭代最佳适应度的变化图

xlabel('迭代次数');

disp('最佳的位置是:'); disp(gbest)

disp('此时最优值是:'); disp(only(gbest))

改进::

-线性递减惯性权重

惯性权重w体现的是粒子继承先前的速度的能力,Shi,Y最先将惯性权重w引入到粒子群算法中,并分析指出一个较大的惯性 权值有利于全局搜索,而一个较小的权值则更利于局部搜索。为了更好地平衡算法的全局搜索以及局部搜索能力,,公式如下

参数的设定

w_max = 0.9; % 最大惯性权重,通常取0.9   w_min = 0.4; % 最小惯性权重,通常取0.4

枚举粒子的时候加入

w = w_start - (w_start - w_end) * d / K;

-非线性递减惯性权重

三种递减惯性权重

-自适应惯性权重

(假如我们现在在求最小值问题)

适应度越小,距离我们要求的最小值越近,就要局部搜,不然步幅太大,容易错过,当我们的适应度越大,代表我们距离最小值越远,越要全局搜索

(假如我们现在在求最大值问题)

参数的设定

w_max = 0.9; % 最大惯性权重,通常取0.9   w_min = 0.4; % 最小惯性权重,通常取0.4

枚举粒子都时候加入

f_i = fit(i); % 取出第i个粒子的适应度

f_avg = sum(fit)/n; % 计算此时适应度的平均值

f_min = min(fit); % 计算此时适应度的最小值

if f_i <= f_avg

if f_avg ~= f_min % 如果分母为0,我们就干脆令w=w_min

w = w_min + (w_max - w_min)*(f_i - f_min)/(f_avg - f_min);

else

w = w_min;

end

else

w = w_max;

end

-随机惯性权重:

参数的设定:

w_max = 0.9; % 最大惯性权重,通常取0.9

w_min = 0.4; % 最小惯性权重,通常取0.4

sigma = 0.3; % 正态分布的随机扰动项的标准差(一般取0.2-0.5之间)

枚举粒子都时候加入:

w = w_min + (w_max - w_min)*rand(1) + sigma*randn(1);

-收缩因子法:

个体学习因子c1和社会(群体)学习因子c2决定了粒子本身经验信息和其他粒子的经验信息对粒子运行轨迹的影响,其反映了粒子群之间的信息交流。设置c1较大的值,会使粒子

过多地在自身的局部范围内搜索,而较大的c2的值,则又会促使粒子过早收敛到局部最优值。为了有效地控制粒子的飞行速度,使算法达到全局搜索与局部搜索两者间的有效平衡,Clerc构造了引入收缩因子的PSO模型,采用了压缩因子,这种调整方法通过合适选取参

数,可确保PSO算法的收敛性,并可取消对速度的边界限制。

参数设定

c1 = 2.05; % 每个粒子的个体学习因子,也称为个体加速常数

c2 = 2.05; % 每个粒子的社会学习因子,也称为社会加速常数

C = c1+c2;

fai = 2/abs((2-C-sqrt(C^2-4*C))); % 收缩因子

w = 0.9; % 惯性权重

更新粒子速度

v(i,:) = fai * (w*v(i,:) + c1*rand(1)*(pbest(i,:) - x(i,:)) + c2*rand(1)*(gbest - x(i,:))); % 更新第i个粒子的速度

-非对称学习因子

设计的思路:一开始强调各干各的,最后朝着全局最优解靠拢

参数设定:

c1_ini = 2.5; % 个体学习因子的初始值

c1_fin = 0.5; % 个体学习因子的最终值

c2_ini = 1; % 社会学习因子的初始值

c2_fin = 2.25; % 社会学习因子的最终值

每次循环更新因子

c1 = c1_ini + (c1_fin - c1_ini)*d/K;

c2 = c2_ini + (c2_fin - c2_ini)*d/K;

每次更新粒子的速度

v(i,:) = w*v(i,:) + c1*rand(1)*(pbest(i,:) - x(i,:)) + c2*rand(1)*(gbest - x(i,:)); % 更新第i个粒子的速度

-自动退出迭代循环

一个记录最大值,一个记录最大值计数器

如果多次在最大值极小附近变化,那么计数器+1

反之如果大于最大值一定量,就计数器清空

%% 改进:自动退出迭代循环

Count = 0; % 计数器初始化为0

max_Count = 30; % 最大计数值初始化为30

tolerance = 1e-6; % 函数变化量容忍度,取10^(-6)

每次循环完一系列的粒子,检测最大值的delta

delta_fit = abs(Obj_fun3(gbest) - Obj_fun3(tem)); % 计算相邻两次迭代适应度的变化量

if delta_fit < tolerance % 判断这个变化量和“函数变化量容忍度”的相对大小,如果前者小,则计数器加1

Count = Count + 1;

else

Count = 0; % 否则计数器清0

end 

if Count > max_Count % 如果计数器的值达到了最大计数值

break; % 跳出循环

end

matlab自带的粒子群函数(只能求最小值)

narvs = 2; % 变量个数

x_lb = [-15 -15]; % x的下界(长度等于变量的个数,每个变量对应一个下界约束)

x_ub = [15 15]; % x的上界

[x,fval,exitflag,output] = particleswarm(@Obj_fun2, narvs, x_lb, x_ub)

粒子群算法的应用:

1求解方程组

将方程组移动到右边,变成一个==0的表达式f,我们尝试去求得f^2(x)或者|f(x)|的最小值,这个时候的x的取值就是解

function F = my_fun(x)

F(1) = abs(x(1)+x(2))-abs(x(3));

F(2) = x(1) * x(2) * x(3) + 18;

F(3) = x(1)^2*x(2)+3*x(3);

end

clear; clc

narvs = 3;

% 使用粒子群算法,不需要指定初始值,只需要给定一个搜索的范围

lb = -10*ones(1,3); ub = 10*ones(1,3);

options = optimoptions('particleswarm','FunctionTolerance',1e-12,'MaxStallIterations',100,'MaxIterations',20000,'SwarmSize',100);

[x, fval] = particleswarm(@Obj_fun,narvs,lb,ub,options)

2,拟合函数

同样的将多个点的值求平方和,通过多次的搜索确定一个最接近0的值

如果求解有约束的,那么可以是fmincon

如果是没有约束的,可以是fminsearch和fminunc

k0 = [0 0]; %初始值,注意哦,这个初始值的选取确实挺难,需要尝试。。。

lb = []; ub = [];

% lb = [-1 -1]; ub = [2 2];

[k, fval] = fmincon(@Obj_fun,k0,[],[],[],[],lb,ub)

%% 求解无约束非线性函数的最小值的两个函数

[k, fval] = fminsearch(@Obj_fun,k0) % Nelder-Mead单纯形法求解最小值,适用于解决不可导或求导复杂的函数优化问题

[k, fval] = fminunc(@Obj_fun,k0) % 拟牛顿法求解无约束最小值,适用于解决求导容易的函数优化问题

多元函数拟合

使用matlab的lsqcurvefit(@fun,k0,)

注意这里的fun函数,对于fmincon返回的是残差平方和,这个函数返回的是表达式

load data_x_y

k0 = [0 0];

lb = []; ub = [];

[k, fval] = lsqcurvefit(@fit_fun,k0,x,y,lb,ub)

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

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

相关文章

深入理解若依RuoYi-Vue数据字典设计与实现

深入理解若依数据字典设计与实现 一、Vue2版本主要文件目录 组件目录src/components&#xff1a;数据字典组件、字典标签组件 工具目录src/utils&#xff1a;字典工具类 store目录src/store&#xff1a;字典数据 main.js&#xff1a;字典数据初始化 页面使用字典例子&#xf…

实战网络安全:渗透测试与防御指南

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 引言 在数字化时代&#xff0c;网络安全已成为企业和个人不可忽视的重要课题。网络攻击的复杂性与日俱增&#xff0c;从数据泄露…

SpringBoot+Electron教务管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.查询课程表代码2.保存学生信息代码3.用户登录代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootElectron框架开发的教务管理系统。首先&#xff…

Ubuntu-手动安装 SBT

文章目录 前言Ubuntu-手动安装 SBT1. SBT是什么?1.1. SBT 的特点1.2. SBT 的基本功能1.3. SBT 的常用命令 2. 安装2.1. 下载2.2. 解压 sbt 二进制包2.3. 确认 sbt 可执行文件的位置2.4. 设置执行权限2.5. 创建符号链接2.6. 更新 PATH 环境变量2.7. 验证 sbt 安装 前言 如果您觉…

详解最基本的数据顺序存储结构:顺序表

新的一年&#xff0c;我觉得这张图很合适&#xff01;有梦想&#xff0c;敢拼&#xff0c;马上就是除夕了&#xff0c;希望新的一年我们逢考必过&#xff0c;事事顺心&#xff0c;看见朝阳的你是不是嘴角微微上扬&#xff01; 本篇从0基础白话文讲述顺序表的概念、用法、注意事…

STM32使用VScode开发

文章目录 Makefile形式创建项目新建stm项目下载stm32cubemx新建项目IED makefile保存到本地arm gcc是编译的工具链G++配置编译Cmake +vscode +MSYS2方式bilibiliMSYS2 统一环境配置mingw32-make -> makewindows环境变量Cmake CmakeListnijia 编译输出elfCMAKE_GENERATOR查询…

安装Office自定义项,安装期间出错

个人博客地址&#xff1a;安装Office自定义项&#xff0c;安装期间出错 | 一张假钞的真实世界 卸载PowerDesigner后&#xff0c;打开“WPS文字”时出现下图错误&#xff1a; 解决方法&#xff1a; 按“WinR”快捷键&#xff0c;打开【运行】框&#xff0c;在对话框中输入“re…

代码审查中的自动化与AI应用

代码审查&#xff08;Code Review&#xff09;作为软件开发中的一项重要实践&#xff0c;通常被认为是提高代码质量、减少bug和提升团队协作的重要手段。随着开发规模的不断扩大&#xff0c;手动代码审查在效率、准确性、以及可扩展性上都存在明显的局限性。尤其是在敏捷开发和…

蓝桥杯模拟算法:蛇形方阵

P5731 【深基5.习6】蛇形方阵 - 洛谷 | 计算机科学教育新生态 我们只要定义两个方向向量数组&#xff0c;这种问题就可以迎刃而解了 比如我们是4的话&#xff0c;我们从左向右开始存&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4 到5的时候y就大于4了就是越界了&…

PostGIS笔记:PostgreSQL 数据库与用户 基础操作

数据库基础操作包括数据模型的实现、添加数据、查询数据、视图应用、创建日志规则等。我这里是在Ubuntu系统学习的数据库管理。Windows平台与Linux平台在命令上几乎无差异&#xff0c;只是说在 Windows 上虽然也能运行良好&#xff0c;但在性能、稳定性、功能扩展等方面&#x…

Nginx中部署多个前端项目

1&#xff0c;准备前端项目 tlias系统的前端资源 外卖项目的前端资源 2&#xff0c;nginx里面的html文件夹中新建&#xff0c;tlias和sky两个文件夹。 切记这是在nginx/html下创建的 mkdir sky mkdir tlias 把tlias和sky的资源都放到对应的文件夹中 3&#xff0c;编辑配置ngi…

人力资源管理HR系统的需求设计和实现

该作者的原创文章目录&#xff1a; 生产制造执行MES系统的需求设计和实现 企业后勤管理系统的需求设计和实现 行政办公管理系统的需求设计和实现 人力资源管理HR系统的需求设计和实现 企业财务管理系统的需求设计和实现 董事会办公管理系统的需求设计和实现 公司组织架构…

2025年美赛B题-结合Logistic阻滞增长模型和SIR传染病模型研究旅游可持续性-成品论文

模型设计思路与创新点&#xff1a; 建模的时候应该先确定我们需要建立什么类的模型&#xff1f;优化类还是统计类&#xff1f;这个题需要大量的数据分析&#xff0c;因此我们可以建立一个统计学模型。 统计学建模思路&#xff1a;观察规律&#xff0c;建立模型&#xff0c;参…

【太阳——几何计算】

题目 代码 #include <bits/stdc.h> using namespace std; using PII pair<int, int>; using ll long long; const int N 1e5 10; set<PII> s; bool st[N]; struct node {int x, y, id; } arr[2 * N]; int main() {int n, X, Y;cin >> n >> …

嵌入式MCU面试笔记2

目录 串口通信 概论 原理 配置 HAL库代码 1. 初始化函数 2. 数据发送和接收函数 3. 中断和DMA函数 4. 中断服务函数 串口通信 概论 我们知道&#xff0c;通信桥接了两个设备之间的交流。一个经典的例子就是使用串口通信交换上位机和单片机之间的数据。 比较常见的串…

云原生时代,如何构建高效分布式监控系统

文章目录 一.监控现状二.Thanos原理分析SidecarQuerierStoreCompactor 三.Sidecar or ReceiverThanos Receiver工作原理 四.分布式运维架构 一.监控现状 Prometheus是CNCF基金会管理的一个开源监控项目&#xff0c;由于其良好的架构设计和完善的生态&#xff0c;迅速成为了监控…

火语言RPA--配置文件读取

&#x1f6a9;【组件功能】&#xff1a;读取配置文件信息以字典类型输出。 配置预览 配置说明 要读取的文件 支持T或# 读取配置文件的路径及名称&#xff0c;绝对路径。 配置文件类型 INI或XML两种选项供选择。 编码 写入配置文件的编码&#xff0c;以列表方式供选择&am…

电子应用设计方案104:智能家庭AI弹簧床系统设计

智能家庭 AI 弹簧床系统设计 一、引言 智能家庭 AI 弹簧床系统旨在为用户提供更加舒适、个性化的睡眠体验&#xff0c;通过结合人工智能技术和先进的床垫设计&#xff0c;实时监测和调整睡眠环境&#xff0c;以满足不同用户的需求。 二、系统概述 1. 系统目标 - 自动适应用户…

基于paddleocr的表单关键信息抽取

全流程如下&#xff1a; 数据集 XFUND数据集是微软提出的一个用于KIE任务的多语言数据集&#xff0c;共包含七个数据集&#xff0c;每个数据集包含149张训练集和50张验证集分别为&#xff1a; ZH(中文)、JA(日语)、ES(西班牙)、FR(法语)、IT(意大利)、DE(德语)、PT(葡萄牙)&a…

爬虫基础之爬取某基金网站+数据分析

声明: 本案例仅供学习参考使用&#xff0c;任何不法的活动均与本作者无关 网站:天天基金网(1234567.com.cn) --首批独立基金销售机构-- 东方财富网旗下基金平台! 本案例所需要的模块: 1.requests 2.re(内置) 3.pandas 4.pyecharts 其他均需要 pip install 模块名 爬取步骤: …