粒子群算法 笔记 数学建模
引入:
如何找到全局最大值:如果只是贪心的话,容易被局部最大解锁定
方法有:盲目搜索,启发式搜索
盲目搜索:枚举法和蒙特卡洛模拟,但是样例太多花费巨量时间
所以启发式算法就来了,通过经验和规律减少尝试的次数去解决这个问题
启发式算法的总结:
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)
相关文章:
粒子群算法 笔记 数学建模
引入: 如何找到全局最大值:如果只是贪心的话,容易被局部最大解锁定 方法有:盲目搜索,启发式搜索 盲目搜索:枚举法和蒙特卡洛模拟,但是样例太多花费巨量时间 所以启发式算法就来了,通过经验和规…...
Vue.js 嵌套路由和动态路由
Vue.js 嵌套路由和动态路由 在 Vue.js 开发中,Vue Router 是官方提供的路由管理器,用于构建单页应用(SPA)。它支持嵌套路由和动态路由,帮助开发者构建复杂的应用结构。 嵌套路由 嵌套路由允许在路由配置中定义子路由…...
Docker导入镜像
使用命令行进行处理: docker load < onething1_wxedge.tar如下图所示 查看状态 docker images...
C# OpenCV机器视觉:红外体温检测
在一个骄阳似火的夏日,全球却被一场突如其来的疫情阴霾笼罩。阿强所在的小镇,平日里熙熙攘攘的街道变得冷冷清清,人们戴着口罩,行色匆匆,眼神中满是对病毒的恐惧。阿强作为镇上小有名气的科技达人,看着这一…...
STM32项目分享:智能厨房安全检测系统
目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 PCB图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: STM32智能厨房安全检测系统 (资料分…...
docker 安装 redis 详解
在平常的开发工作中,我们经常会用到 redis,那么 docker 下应该如何安装 redis 呢?简单来说:第一步:拉取redis镜像;第二步:设置 redis.conf 配置文件;第三步:编写 docker-…...
《探秘鸿蒙Next:人工智能助力元宇宙高效渲染新征程》
在元宇宙的宏大愿景中,高效的渲染技术是构建沉浸式虚拟世界的关键。鸿蒙Next凭借与人工智能的深度融合,为元宇宙的渲染带来了全新的解决方案和无限可能。 智能场景分析与优化 人工智能能够对元宇宙场景进行智能分析。鸿蒙Next可以利用AI技术对场景中的…...
nginx分发请求超时切换服务
nginx的upstream模块实现超时自动切换服务 upstream testfail {server 192.168.1.218 max_fails1 fail_timeout10s;server 192.168.1.129 max_fails1 fail_timeout10s;} max_fails代表失败尝试次数,达到设置的次数则视为该服务不可用, fail_timeout代…...
vulfocus/fastjson-cnvd_2017_02833复现
漏洞概述 Fastjson 是阿里巴巴开发的一个高性能的 Java 库,用于将 Java 对象转换成 JSON 格式(序列化),以及将 JSON 字符串转换回 Java 对象(反序列化)。 fastjson在解析json的过程中,支持使用type字段来指…...
.Net Core微服务入门全纪录(五)——Ocelot-API网关(下)
系列文章目录 1、.Net Core微服务入门系列(一)——项目搭建 2、.Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上) 3、.Net Core微服务入门全纪录(三)——Consul-服务注…...
OpenCV imread函数读取图像__实例详解
OpenCV imread函数读取图像__实例详解 本文目录: 零、时光宝盒 一、imread函数定义 二、imread函数支持的文件格式 三、imread函数flags参数详解 (3.1)、Flags-1时,样返回加载的图像(使用alpha通道,否…...
GPSd定时检测保活TCP GPS源
为了在 TCP GPS 源丢失连接时自动重新连接,可以编写一个监控脚本,定期检查 gpspipe 输出中的 TCP 源数据是否存在。如果检测到丢失,则使用 gpsdctl 或直接命令重新添加 TCP 源。 1、工具 检查并安装必要工具,本例需要使用 gpspi…...
得物App亮相第七届进博会,科技赋能打造消费新热点
在2024年11月5日至11月10日举办的第七届进博会舞台上,上海交易团虹口分团表现亮眼,其中得物作为来自虹口品质电商的践行者,备受众多参观者关注。 上海得物信息集团有限公司自2015年于上海虹口创立以来,始终坚守“满足年轻人对美好…...
单片机内存管理剖析
一、概述 在单片机系统中,内存资源通常是有限的,因此高效的内存管理至关重要。合理地分配和使用内存可以提高系统的性能和稳定性,避免内存泄漏和碎片化问题。单片机的内存主要包括程序存储器(如 Flash)和数据存储器&a…...
用Python绘制一只懒羊羊
目录 一、准备工作 二、Turtle库简介 三、绘制懒羊羊的步骤 1. 导入Turtle库并设置画布 2. 绘制头部 3. 绘制眼睛 4. 绘制嘴巴 5. 绘制身体 6. 绘制四肢 7. 完成绘制 五、运行代码与结果展示 六、总结 在这个趣味盎然的技术实践中,我们将使用Python和Turtle图形…...
Python 预训练:打通视觉与大语言模型应用壁垒——Python预训练视觉和大语言模型
大语言模型是一种由包含数百亿甚至更多参数的深度神经网络构建的语言模型,通常使用自监督学习方法通过大量无标签文本进行训练,是深度学习之后的又一大人工智能技术革命。 大语言模型的发展主要经历了基础模型阶段(2018 年到2021年)、能力探索阶段(2019年…...
神经网络梯度爆炸的原因及解决方案
在深度学习中,梯度爆炸(gradient exploding)是一种常见的训练问题,尤其是在深层神经网络中。梯度爆炸指的是在反向传播过程中,梯度值呈指数级增长,导致网络权重的大幅更新,从而使得网络变得不稳…...
WPS不登录无法使用基本功能的解决方案
前言 WPS不登录无法使用基本功能的原因通常是为了同步数据、提供更多高级功能或满足软件授权要求。然而,一些用户可能出于隐私或便捷性的考虑,不愿意登录账号。在这种情况下,WPS可能会限制未登录用户的使用权限,导致工具栏变灰…...
蓝桥杯lesson3---string的使用
🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” string的概念 string字符串是一种更加高级的封装,string字符串中包含了大量的方法,这些方法使得字符串的操作变得更加简单,string的使用&…...
Java设计模式 三 工厂方法模式 (Factory Method Pattern)
工厂方法模式 (Factory Method Pattern) 是一种常见的创建型设计模式,旨在通过定义一个接口来创建对象,而将实例化对象的具体类延迟到子类中。工厂方法模式允许客户端通过工厂方法来创建对象,而不需要直接调用构造函数,这样可以减…...
日志收集Day005
1.filebeat的input类型之filestream实战案例: 在7.16版本中已经弃用log类型,之后需要使用filebeat,与log不同,filebeat的message无需设置就是顶级字段 1.1简单使用: filebeat.inputs: - type: filestreamenabled: truepaths:- /tmp/myfilestream01.lo…...
java开发,IDEA转战VSCODE配置(mac)
一、基本java开发环境配置 前提:已经安装了jdk、maven、vscode,且配置了环境变量 1、安装java相关的插件 2、安装spring相关的插件 3、vscode配置maven环境 打开 VsCode -> 首选项 -> 设置,也可以在setting.json文件中直接编辑&…...
Effective C++读书笔记——item23(用非成员,非友元函数取代成员函数)
一、主要观点: 在某些情况下,使用 non-member、non-friend 函数来替换 member 函数可以增强封装性和可扩展性,提供更好的软件设计。 二、详细解释: 封装性: 类成员函数的封装性考量:成员函数可以访问类的…...
(3)STM32 USB设备开发-USB存储设备
例程:STM32USBdevice: 基于STM32的USB设备例子程序 - Gitee.com 本篇为使用芯片内部flash作为USB存储设备的例程,没有知识,全是实操,按照步骤就能获得一个STM32的U盘。本例子是在野火F103MINI开发板上验证的,如果代码…...
考研408笔记之数据结构(五)——图
数据结构(五)——图 1. 图的基本概念 1.1 图的定义 1.2 有向图和无向图 在有向图中,使用圆括号表示一条边,圆括号里元素位置互换没有影响。 在无向图中,使用尖括号表示一条边,尖括号里元素位置互换则表示…...
【博客之星】年度总结:在云影与墨香中探寻成长的足迹
🐇明明跟你说过:个人主页 🔖行路有良友,便是天堂🔖 目录 一、年度回顾 1、创作历程 2、个人成长 3、个人生活与博客事业 二、技术总结 1、赛道选择 2、技术工具 3、实战项目 三、前景与展望 1、云原生未来…...
springboot 调用 c++生成的so库文件
一、创建c文件 SoTest.h #pragma once class SoTest {int Add(int a,int b); };SoTest.cpp #include "SoTest.h"int SoTest::Add(int a, int b) {return a b; }二、创建so文件 /home/ubuntu/projects/SoTest/bin/x64/Debug/libSoTest.so 三、java代码 Maven依…...
简识JVM栈帧中的操作数栈
在JVM(Java虚拟机)中,栈帧(Stack Frame)是方法执行时的数据结构,用于存储局部变量、操作数栈、方法返回地址等信息。 其中,操作数栈(Operand Stack)是栈帧中的一个重要组…...
在 Kubernetes 上快速安装 KubeSphere v4.1.2
目录标题 安装文档配置repo安装使用插件 安装文档 在 Kubernetes 上快速安装 KubeSphere 配置repo export https_proxy10.10.x.x:7890 helm repo add stable https://charts.helm.sh/stable helm repo update安装 helm upgrade --install -n kubesphere-system --create-name…...
腾讯 Hunyuan3D-2: 高分辨率3D 资产生成
腾讯 Hunyuan3D-2:高分辨率 3D 资产生成的突破 前言 在当今数字化时代,3D 资产生成技术正变得越来越重要。无论是游戏开发、影视制作还是虚拟现实领域,高质量的 3D 模型和纹理都是创造沉浸式体验的关键。然而,传统的 3D 资产制作…...
论文阅读--Qwen22.5技术报告
Qwen2 1 引言 所有模型都是在超过7 trillion token(7万亿)的高质量、大规模数据集上预训练的 2 Tokenizer & Model 2.1 Tokenizer 沿用Qwen(Bai等人,2023a)的做法,我们采用了基于字节级字节对编码…...
python如何导出数据到excel文件
python导出数据到excel文件的方法: 1、调用Workbook()对象中的add_sheet()方法 wb xlwt.Workbook() ws wb.add_sheet(A Test Sheet) 2、通过add_sheet()方法中的write()函数将数据写入到excel中,然后使用save()函数保存excel文件 ws.write(0, 0, 1234…...
pyhton学习笔记(三)
目录 1.变量 2.变量的命名规则 3.常用函数汇总 4.常用数据类型汇总 5.算术运算符 6.比较运算符和逻辑运算符 7.常见的三种格式化输出方法 8.分支语句 1.变量 变量就是可以变化的量,可以理解为是一个存储东西的盒子,盒子里面可以放一些程序里需要…...
时间类型数据处理:基于Python的datetime库和pandas库
一、datetime库常用方法 日期的数据类型主要有两种:一是包含时间的datetime类型,二是不包含时间的date类型。这里的时间指具体的时、分、秒、甚至毫秒。 1、自定义日期、时间、获取本地时间、获取本地日期、获取年份、月份、月号、小时、分钟、秒、星期…...
CPU 缓存基础知识
并发编程首先需要简单了解下现代CPU相关知识。通过一些简单的图,简单的代码,来认识CPU以及一些常见的问题。 目录 CPU存储与缓存的引入常见的三级缓存结构缓存一致性协议MESI协议缓存行 cache line 通过代码实例认识缓存行的重要性 CPU指令的乱序执行通过…...
vue3 中如何监听 props 中的值的变化
在 Vue 3 中,你可以使用 watch 函数来监听组件的 props 值的变化。watch 函数允许你观察一个或多个响应式数据源,并在这些数据源发生变化时执行回调函数。 以下是一个示例,展示了如何在 Vue 3 中使用 watch 来监听 props 中的值的变化&#…...
煤矿场景下矿工行为检测数据集VOC+YOLO格式24709张8类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):24709 标注数量(xml文件个数):24709 标注数量(txt文件个数):2470…...
Git处理冲突详解
文章目录 Git处理冲突详解一、引言二、冲突产生的原因三、解决冲突的步骤1. 手动解决冲突1.1 查看冲突文件1.2 编辑冲突文件1.3 提交解决冲突 2. 使用合并工具解决冲突 四、使用示例五、总结 Git处理冲突详解 一、引言 在团队协作开发中,Git冲突是不可避免的。当多…...
Jetson Orin Nano Super之jetson-fpv开源代码下载
Jetson Orin Nano Super之jetson-fpv开源代码下载 1. 源由2. 方法2.1 优化配置方案一:增加缓冲方案二:降低并发数方案三:临时禁用深度克隆 2.2 路径更换方案一:设置代理方案二:替换git协议方案三:替换https…...
gitlab使用多数据库
1. 说明 默认情况下,GitLab 使用一个单一的应用数据库,称为主数据库。为了扩展 GitLab,您可以将 GitLab 配置为使用多个应用数据库。 设置多个数据库后,GitLab 将使用第二个应用数据库用于 CI/CD 功能,称为 CI 数据库…...
【Redis】事务
前言: 对比MySQL事务:【MySQL篇】事务的认识以及四大特性-CSDN博客 弱化的原子性: redis 没有 "回滚机制". 只能做到这些操作 "批量执行". 不能做到 "一个失败就恢复到初始状态". 不保证一致性: 不涉及 "约束". 也没有…...
在vue3中使用datav完整引入时卡在加载页面的解决方法
文件修改 文件:node_modules/dataview\datav-vue3/package.json // "module": "./es/index.js","module": "./es/index.mjs", // 修改后使用完整引入,需要为datav配置文件添加相应方法 文件:node…...
WPA_cli P2P命令详解及使用
目录 通用命令 status scan scan_results add_network set_network enable_network reconfigure save_config quit P2P 相关命令 p2p_find p2p_peers p2p_connect [method] p2p_group_add [ssid=] [freq=] [ht40] [persistent] p2p_remove_client p2p_di…...
Kubernetes v1.28.0安装dashboard v2.6.1(k8s图形化操作界面)
准备工作 Kubernetes v1.28.0搭建教程请参考:Kubernetes v1.28.0集群快速搭建教程-CSDN博客 查看当前集群nodes都是ready状态 查看当前pods都是running状态 下载并修改配置文件 下载 recommended.yaml ,下载好之后,进入文件编辑 下载地址…...
性能测试监控与诊断
我们依据一个HTTP请求处理的过程,采用主流的J2EE技术栈,如下图所示 1>用户的请求通过网卡传送到服务器(中断信号),用户与服务器简历TCP/IP链接。也就是产说的TCP三次握手。既然是链接,就有限制ÿ…...
窥探QCC518x-308x系列与手机之间的蓝牙HCI记录与分析 - 耳机篇
上一篇是介绍如何窥探手机端Bluetooth的HCI log, 本次介绍是如何窥探Bluetooth的HCI log-耳机篇. 这次跟QCC518x/QCC308x测试的手机是Samsung S23 Ultra. QCC518x/QCC308x透过HCI界面取得Log教学. 步骤1: 开启QMDE -> 选择ADK r1102 QCC3083 Headset workspace.步骤2: 点…...
Numpy基础02(Numpy对数组的基本操作)
Numpy的基本操作 2.3.1 ndarray索引操作 一维数组:同一维列表大致相同 n np.array([1, 2, 3, 4, 5]) n[0], n[-1] #(1, 5)多维数组 n np.random.randint(0, 10, size(3, 4, 5)) print(n) # 访问最后一个元素并改为66 n[2,3,-1] 66 print(n)# 最后一行元素并…...
WPS计算机二级•幻灯片的基础操作
听说这是目录哦 PPT的正确制作步骤🛣️认识PPT界面布局🏜️PPT基础操作 快捷键🏞️制作PPT时 常用的快捷技巧🏙️快速替换PPT的 文本字体🌃快速替换PPT 指定文本内容🌅能量站😚 PPT的正确制作步…...
蓝桥杯准备 【入门1】顺序结构
P5705 【深基2.例7】数字反转 题目描述 输入一个不小于 100100 且小于 10001000,同时包括小数点后一位的一个浮点数,例如 123.4123.4 ,要求把这个数字翻转过来,变成 4.3214.321 并输出。 解题思路:使用字符串比较简单…...
Java学习笔记(二十四)
1 策略模式 1.1 策略模式概述 策略模式(Strategy Pattern) 是一种行为设计模式,定义了一系列算法,并将它们封装成独立的类,使它们可以互相替换而不会影响使用它们的客户端代码。 策略模式的核心思想是将行为与环境解…...