差分进化算法(Differential Evolution,DE,附简单案例及详细matlab源码)

news2024/11/27 1:25:30

在这里插入图片描述

作者:非妃是公主
专栏:《智能优化算法》
博客地址:https://blog.csdn.net/myf_666
个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩
在这里插入图片描述

文章目录

  • 专栏推荐
  • 一、概论
  • 二、差分进化算法(DE)原理
  • 三、差分进化算法的优点
  • 四、算法具体流程
  • 五、仿真实例:差分进化求解函数最小值
    • 1. 题目
    • 2. 分析
    • 3. matlab求解
    • 4. 求解结果及分析
  • 六、差分进化算法的一些改进方向
    • 1. 自适应差分进化算法
    • 2. 离散差分进化算法
  • the end……

专栏推荐

专栏名称专栏地址
软件工程专栏——软件工程
计算机图形学 专栏——计算机图形学
操作系统专栏——操作系统
软件测试专栏——软件测试
机器学习专栏——机器学习
数据库专栏——数据库
算法专栏——算法

在遗传、选择和变异的作用下,自然界生物体优胜劣汰,不断由低级向高级进化发展。人们注意到,适者生存的进化规律可以模式化,从而构成一些优化算法;近年来发展的进化计算类算法受到了广泛的关注。


一、概论

差分进化算法(Differential Evolution,DE)是一种新兴的进化计算技术。在1995年,由Storn等人提出用来解决切比雪夫多项式问题,后来发现它也是解决复杂优化问题的有效技术。

差分进化算法和遗传算法很相似,也是一种基于群体智能理论的优化算法,通过群体内个体间的合作与竞争而产生的全局搜索策略,采用实数编码、基于差分的简单变异操作和“一对一”的竞争生存策略,降低了进化计算操作的复杂性。

同时,差分进化算法具有记忆能力使其可以动态跟踪当前的搜索情况,以调整其搜索策略,具有较强的全局收敛能力和稳健性,且不需要借助问题的特征信息,适用于求解一些利用常规的数学规划方法很难求解,甚至无法求解的复杂优化问题。


二、差分进化算法(DE)原理

同其它进化算法一样(尤其和遗传算法,具有很强的相似性),差分进化算法,也是对候选解的种群进行操作,具体地说,它包含了三个主要的操作:

  • 变异:通过把种群中两个成员之间的加权差向量加到第三个成员上来产生新的参数向量,该操作称为“变异”;
  • 交叉:将变异向量的参数与另外预先确定的目标向量参数按照一定的规则混合来产生试验向量。
  • 选择:如果试验向量的目标函数比目标向量的代价函数低,那么就利用试验向量替换掉目标向量。

种群中所有成成员必须要当作目标向量进行一次这样的操作,以便在下一代中出现相同个数的竞争者。在进化过程中,对每一代的向量都进行评价,记录最小化过程。

这种利用随机偏差扰动产生新个体的方式,可以获得一个收敛性非常好的结果,引导搜索过程向全局最优解逼近。


三、差分进化算法的优点

差分进化算法从提出到现在,短短二十几年的时间,取得了很多成功的应用。它具有以下优点:

  • 结构简单,容易使用。一个是很容易实现,变异操作只涉及了向量的加减运算。再有就是算法的控制参数较少,这些参数对算法的性能影响已经有了一定的研究,可以供参考,因此,使用起来十分方便。
  • 性能优越。差分进化算法具有较好的可靠性、高效性、鲁棒性。对于大空间、非线性和不可求导的连续问题,其求解速率比其他进化方法好,而且很多学者还在对差分进化算法继续改良,以不断提高其性能。
  • 自适应性。差分变异算子可以根据不同的目标函数进行调整,从而提高搜索质量。
  • 存在内在的并行性,可协同搜索。它具有利用个体局部信息和群体全局信息指导算法进一步搜索的能力。
  • 算法通用,可直接对结构对象进行操作,不依赖于问题信息,不存在对目标函数的限定。比如许多问题是高维的,甚至是不可求导的,在这种情况下,使用差分进化算法就十分简单并不会增加求解的复杂性,而如果使用其它算法,很可能使得求解变得十分复杂。

四、算法具体流程

学习的过程是广度优先,层层深入的,前面大致了解了差分进化算法的原理及思想,下面我们看一看差分进化算法的具体算法流程。


1. 整体流程

  1. 初始化;
  2. 变异;
  3. 交叉;
  4. 选择;
  5. 边界条件处理。

算法流程图如下:

在这里插入图片描述

Ⅰ. 初始化

初始化就是给种群中的每个个体的每个维度进行一个赋值,实现一个初始化的操作。每个个体表示如下:

x i , G ( i = 1 , 2 , . . . , N P ) x_{i,G}(i=1,2,...,NP) xi,G(i=1,2,...,NP)

其中, i i i 表示个体在种群中的编号, G G G 表示进化代数, N P NP NP 代表种群规模。

在差分进化算法中,一般假定所有随机初始化种群均符合均匀分布。设参数变量的界限为 x j ( L ) < x j < x j U x_j^{(L)}<x_j<x_j^{U} xj(L)<xj<xjU,则 x j i , 0 = r a n d [ 0 , 1 ] × ( x j ( U ) − x j ( L ) ) + x j L x_{ji,0}=rand[0,1] \times (x_j^{(U)}-x_j^{(L)})+x_j^{L} xji,0=rand[0,1]×(xj(U)xj(L))+xjL

其中, r a n d [ 0 , 1 ] rand[0,1] rand[0,1]表示在 [ 0 , 1 ] [0,1] [0,1]之间产生均匀的实数

当然,均匀产生随机数只是一种可能,如果可以预先知道解的概率分布,就不需要均匀产生,可以通过其分布规律,产生涵盖更多信息的解,进而提高重建效果。

Ⅱ. 变异

产生完初始种群后,进行变异操作,对于每个目标 x i , G ( i = 1 , 2 , . . . , N P ) x_{i,G}(i=1,2,...,NP) xi,G(i=1,2,...,NP),基本差分进化算法的变异向量产生方式如下:

v i , G + 1 = x r 1 , G + F ⋅ ( x r 2 , G − x r 3 , G ) v_{i,G+1}=x_{r_1,G}+F\cdot(x_{r_2,G}-x_{r_3,G}) vi,G+1=xr1,G+F(xr2,Gxr3,G)

其中,要求随机选择的个体序号 r 1 , r 2 , r 3 r_1,r_2,r_3 r1,r2,r3互不相同,且与目标向量序号 i i i也不能相同,所以必须满足 N P ≥ 4 NP\geq4 NP4

变异算子 F ∈ [ 0 , 2 ] F\in[0,2] F[0,2]是一个实常数因数,它控制偏差变量的缩放。

Ⅲ. 交叉

这一步进行变异向量和目标向量的总体交叉。为了增加干扰参数向量的多样性,引入交叉操作,测试向量变为:

u i , G + 1 = ( u 1 i , G + 1 , u 2 i , G + 1 , . . . , u D i , G + 1 ) u_{i,G+1}=(u_{1_i,G+1},u_{2_i,G+1},...,u_{D_i,G+1}) ui,G+1=(u1i,G+1,u2i,G+1,...,uDi,G+1)

u j i , G + 1 = { v j i , G + 1 若 randb(j) <= CR 或 j = rnbr(i) x j i , G + 1 若 x != 0 且 j != rnbr(i) u_{ji,G+1}= \begin{cases} v_{ji,G+1}& \text{若 randb(j) <= CR 或 j = rnbr(i)}\\ x_{ji,G+1}& \text{若 x != 0 且 j != rnbr(i)} \end{cases} uji,G+1={vji,G+1xji,G+1 randb(j) <= CR  j = rnbr(i) x != 0  j != rnbr(i)

其中, r a n d b ( j ) randb(j) randb(j) 表示产生 [ 0 , 1 ] [0,1] [0,1] 之间的随机数发生器的第j个估计值。 r n b r ( i ) ∈ ( 1 , 2 , . . . , D ) rnbr(i) \in (1,2,...,D) rnbr(i)(1,2,...,D) 表示一个随机选择的序列(这个序列必然在 [ 1 , D ] [1,D] [1,D] 之间,因此必然会有一个与 j j j 相等),用它来确保 u i , G + 1 u_{i,G+1} ui,G+1 至少从 v i , G + 1 v_{i,G+1} vi,G+1 获得一个参数;CR 表示交叉算子(表示一个概率),其取值范围为 [ 0 , 1 ] [0,1] [0,1]

Ⅳ. 选择

经过上面的变异、交叉操作,差分进化算法按照贪婪准则将试验向量与当前种群中的目标向量 x i , G x_{i,G} xi,G 进行比较,在下一代中,如果目标向量好,就选择目标向量,如果试验向量好,就选择试验向量。

值得注意的实,试验向量只与目标向量进行个体比较,而不是现有种群中的所有个体(锦标赛选择)。

Ⅴ. 边界条件的处理

如果在变异过程中,我们编译出了可行域外的解(可以理解为函数变量的定义域),即: u j i , G + 1 < x j ( L ) u_{ji,G+1}<x_j^{(L)} uji,G+1<xj(L) u j i , G + 1 > x j U u_{ji,G+1}>x_j^{U} uji,G+1>xjU,那么

u j i , G + 1 = r a n d [ 0 , 1 ] ⋅ ( x j ( U ) − x j ( L ) ) + x j ( L ) ( i = 1 , 2 , . . . , N P ; j = 1 , 2 , . . . , D ) u_{ji,G+1}=rand[0,1] \cdot (x_j^{(U)}-x_j^{(L)})+x_j^{(L)} \quad \quad \quad (i=1,2,...,NP;j=1,2,...,D) uji,G+1=rand[0,1](xj(U)xj(L))+xj(L)(i=1,2,...,NP;j=1,2,...,D)


2. 细节处理

Ⅰ. 种群数量 N P NP NP

NP 越大,说明个体越多,种群多样性越好,寻优能力也越强,但同时也增加了计算难度。所以NP不能无限取大。一般取 5 D ≤ N P ≤ 10 D 5D\leq NP \leq10D 5DNP10D 之间,必须满足的是 N P ≥ 4 NP \geq 4 NP4,因为只有 NP 大于4,才能有空间进行变异和杂交。(这两个操作要求个体编号是不同的,也就是应该有3个不同的个体,但是如果NP恰好为3,那么就没有一点随机性可言了= =。)


Ⅱ. 变异算子 F F F

变异算子 F ∈ [ 0 , 2 ] F\in [0,2] F[0,2]是一个实常数因数,它决定偏差向量的放大比例。

  • 如果太小,容易“早熟”,即陷入局部最优解。
  • 如果太大,不容易“收敛”。当 F > 1 F>1 F>1 的时候,算法收敛到最优值变得十分困难,因为差分向量的扰动已经大于两个个体之间的距离了。

目前研究表面标明, F F F 小于 0.4 0.4 0.4 F F F 大于 1 1 1 的值仅偶尔有效,通常, F = 0.5 F=0.5 F=0.5是一个较好的初始选择。如果种群收敛过早,那么应该增大 F F F N P NP NP

Ⅲ. 交叉算子 C R CR CR

一个 [ 0 , 1 ] [0,1] [0,1] 之间的数,它控制着试验向量参数来自于随机选择的目标向量,还是变异向量。 C R CR CR 越大,发生交叉的可能性就越大, C R CR CR 的一个较好的选择实 0.1 0.1 0.1,但较大的 C R CR CR 通常会加速收敛。可以先尝试 C R = 0.9 CR=0.9 CR=0.9 C R = 1.0 CR=1.0 CR=1.0,查看是否可以快速产生一个快速解。

Ⅳ. 最大进化代数 G G G

最大进化代数 G G G 表示差分进化算法运行结束的一个参数,最多更新 G G G 代后就结束了,并将当前群体中最佳个体作为最优解输出。一般, 100 ≤ G ≤ 500 100\leq G \leq 500 100G500

Ⅴ. 终止条件

除最大进化代数可作为差分进化算法的终止条件外,还可以增加其他判定准则。一般当目标函数值小于阈值时程序终止,阈值常选为 1 0 − 6 10^{-6} 106


五、仿真实例:差分进化求解函数最小值

1. 题目

求解函数 f ( x ) = ∑ i = 1 n x i 2 ( − 20 ≤ x i ≤ 20 ) f(x)=\sum_{i=1}^n x_i^2 (-20\leq x_i \leq 20) f(x)=i=1nxi2(20xi20) 的最小值,其中个体 x x x 的维数 n = 10 n=10 n=10


2. 分析

这个案例和之前模拟退火以及遗传算法的案例是相同的,函数只有一个极小值点 x = ( 0 , 0 , . . . , 0 ) x=(0,0,...,0) x=(0,0,...,0),理论最小值 f ( 0 , 0 , . . . , 0 ) = 0 f(0,0,...,0)=0 f(0,0,...,0)=0

求解思路如下

  1. 初始化参数,各参数设置如下
参数名参数值
个体数 N P NP NP 50 50 50
维度 D D D 10 10 10
最大进化代数 G G G 200 200 200
变异算子 F 0 F_0 F0 0.4 0.4 0.4
交叉算子 C R CR CR 0.1 0.1 0.1
结束阈值 y z yz yz 1 0 − 6 10^{-6} 106
  1. 产生初始种群。
  2. 计算临时种群个体目标函数。并进行变异、交叉、选择。
  3. 判断是否满足终止条件:如果满足,结束;不满足,继续迭代。

3. matlab求解

matlab的求解源码如下:

%%%%%%%%%%%%%%%%%差分进化算法求函数极值%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;                            %清除所有变量
close all;                            %清图
clc;                                  %清屏
NP=50;                                %个体数目
D=10;                                 %变量的维数
G=200;                                %最大进化代数
F0=0.4;                               %初始变异算子
CR=0.1;                               %交叉算子
Xs=20;                                %上限
Xx=-20;                               %下限
yz=10^-6;                             %阈值
%%%%%%%%%%%%%%%%%%%%%%%%%赋初值%%%%%%%%%%%%%%%%%%%%%%%%
x=zeros(D,NP);                        %初始种群
v=zeros(D,NP);                        %变异种群
u=zeros(D,NP);                        %选择种群
x=rand(D,NP)*(Xs-Xx)+Xx;              %赋初值
   %%%%%%%%%%%%%%%%%%%%计算目标函数%%%%%%%%%%%%%%%%%%%%
for m=1:NP                            % 评价原始种群
    Ob(m)=func1(x(:,m));
end
trace(1)=min(Ob);                     % 跟踪原始种群中的最优个体
%%%%%%%%%%%%%%%%%%%%%%%差分进化循环%%%%%%%%%%%%%%%%%%%%%
for gen=1:G
    %%%%%%%%%%%%%%%%%%%%%%变异操作%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%%%%%%%%%%%%%自适应变异算子%%%%%%%%%%%%%%%%%%%
    lamda=exp(1-G/(G+1-gen));         % 自适应差分进化算法
    F=F0*2^(lamda);                   % 动态的设置的变异算子(交叉概率)
    %%%%%%%%%%%%%%%%%r1,r2,r3和m互不相同%%%%%%%%%%%%%%%%
    for m=1:NP
        r1=randi([1,NP],1,1);         % 变异操作,取r1
        while (r1==m)
            r1=randi([1,NP],1,1);     % 保证 r1!=m
        end
        r2=randi([1,NP],1,1);         % 变异操作,取r2
        while (r2==m)||(r2==r1)       % 保证r2!=m r2!=r1
            r2=randi([1,NP],1,1);
        end
        r3=randi([1,NP],1,1);         % 变异操作,取r3
        while (r3==m)||(r3==r1)||(r3==r2)   % 保证r3!=m r3!=r1 r3!=r2
            r3=randi([1,NP],1,1);
        end
        v(:,m)=x(:,r1)+F*(x(:,r2)-x(:,r3)); % 计算变异个体
    end
    %%%%%%%%%%%%%%%%%%%%%%交叉操作%%%%%%%%%%%%%%%%%%%%%%%
    r=randi([1,D],1,1);               % 取 r 防止 u == x
    for n=1:D                         % 遍历种群
        cr=rand(1);                   % 生成[0,1]随机数
        if (cr<=CR)||(n==r)           % 以CR的概率交叉(接受变异向量)
            u(n,:)=v(n,:);
        else
            u(n,:)=x(n,:);            % 不接受变异向量
        end
    end
    %%%%%%%%%%%%%%%%%%%边界条件的处理%%%%%%%%%%%%%%%%%%%%%
    for n=1:D                           % 遍历所有维度
        for m=1:NP                      % 遍历种群
            if (u(n,m)<Xx)||(u(n,m)>Xs) % 如果超过边界值
                u(n,m)=rand*(Xs-Xx)+Xx; % 重新生成
            end
        end
    end
    %%%%%%%%%%%%%%%%%%%%%%选择操作%%%%%%%%%%%%%%%%%%%%%%%
    for m=1:NP                       % 遍历新种群
        Ob1(m)=func1(u(:,m));        % 评价新种群的个体
    end
    for m=1:NP                       % 遍历种群
        if Ob1(m)<Ob(m)              % 进行锦标赛选择
            x(:,m)=u(:,m);           % 选择更优的
        end
    end  
    for m=1:NP                       % 遍历种群所有个体
        Ob(m)=func1(x(:,m));         % 重新评价种群所有个体
    end
    trace(gen+1)=min(Ob);            % 记录 G+1 代的最优值
    if min(Ob(m))<yz                 % 如果小于 yz 这个阈值,说明已经足够收敛了
        break                        % 那么就不再搜了
    end
end
[SortOb,Index]=sort(Ob);             % 对新种群个体的适应度进行排序,并获取它的索引
x=x(:,Index);                        % 获取 第 index 个个体
X=x(:,1)                               %最优变量,并打印输出
Y=min(Ob)                              %最优值,并打印输出
%%%%%%%%%%%%%%%%%%%%%%%%%画图%%%%%%%%%%%%%%%%%%%%%%%%%%
figure
plot(trace);
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')

4. 求解结果及分析

适应度进化曲线如下:

在这里插入图片描述

求解的最优值,以及对应的最优解如下:

在这里插入图片描述


六、差分进化算法的一些改进方向

1. 自适应差分进化算法

对于变异算子 F F F的设置,可以采用如下模型:

λ = e 1 − G m G m + 1 − G , F = F 0 × 2 λ \lambda = e^{1-\frac{G_m}{G_m+1-G}}, F=F_0\times 2^\lambda λ=e1Gm+1GGm,F=F0×2λ

这个模型的好处是,在初期 F F F具有较大值为 2 F 0 2F_0 2F0,可以保持个体多样性,避免早熟,在后期变异率接近 F 0 F_0 F0,保留优良信息,避免最优解遭到破坏,增加全局最优解的概率。

还可以设计随机范围的交叉算子,比如 C R : 0.5 × [ 1 + r a n d ( 0 , 1 ) ] CR: 0.5\times[1+rand(0,1)] CR:0.5×[1+rand(0,1)],这样交叉算子的平均值维持在0.75附近,考虑到了差分向量放大中可能的随机变化,有助于在搜索过程中保持群体多样性。


2. 离散差分进化算法

我们上述采用的编码都是实数编码,如果对于整数规划等问题,还可以采用离散差分进化算法。主要思路很简单,就是将变异操作中的值进行取整(比如向下取整),模型如下1

v i , G + 1 = f l o o r [ x r 1 , G + F ⋅ ( x r 2 , G − x r 3 , G ) ] v_{i,G+1}=floor[x_{r_1,G}+F\cdot(x_{r2,G}-x_{r_3,G})] vi,G+1=floor[xr1,G+F(xr2,Gxr3,G)]

floor指向下取整的四舍五入方法。


the end……

差分进化算法到这里就要结束啦~~到此既是缘分,欢迎您的点赞评论收藏关注我,不迷路,我们下期再见!!

😘😘😘 我是Cherries,一位计算机科班在校大学生,写博客用来记录自己平时的所思所想!
💞💞💞 内容繁杂,又才疏学浅,难免存在错误,欢迎各位大佬的批评指正!
👋👋👋 我们相互交流,共同进步!

:本文由非妃是公主发布于https://blog.csdn.net/myf_666,转载请务必标明原文链接:https://blog.csdn.net/myf_666/article/details/129278838


  1. 包子阳,智能优化算法及其matlab实例.电子工业出版社. ↩︎

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

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

相关文章

7、Maxwell安装部署

1、Maxwell简介 1.1 Maxwell概述 Maxwell 是由美国Zendesk公司开源&#xff0c;用Java编写的MySQL变更数据抓取软件。它会实时监控Mysql数据库的数据变更操作&#xff08;包括insert、update、delete&#xff09;&#xff0c;并将变更数据以 JSON 格式发送给 Kafka、Kinesi等…

java项目之KTV点歌系统源码(ssm+jsp+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的KTV点歌系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌&#xff0…

FPGA实验六:PWM信号调制器设计

目录 一、实验目的 二、设计要求 三、实验代码 1.顶层文件代码 2.仿真文件部分代码 3.系统工程文件 四、实验结果及分析 1、引脚锁定 2、仿真波形及分析 3、下载测试结果及分析 五、实验心得 一、实验目的 &#xff08;1&#xff09;掌握通信信号调制过程及实现原理…

Linux调优–I/O 调度器

Linux 的 I/O 调度器是一个以块式 I/O 访问存储卷的进程&#xff0c;有时也叫磁盘调度器。Linux I/O 调度器的工作机制是控制块设备的请求队列&#xff1a;确定队列中哪些 I/O 的优先级更高以及何时下发 I/O 到块设备&#xff0c;以此来减少磁盘寻道时间&#xff0c;从而提高系…

Android TEE可信计算环境与TrustZone基础

文章目录 前言可信计算环境TEE嵌入式安全现状现有的TEE分类TEE的应用场景TEE存在必要性 TrustZone移动端数据隔离安全/非安全世界CPU的特权等级TrustZone的结构CA与TA通信流程 TEE安全设计系统总线设计内存隔离机制安全启动机制安全通信机制 总结 前言 先引用 《可信计算&…

Java中规模软件开发实训——简单计算器制作

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;html css js&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;在现代社会中…

springcloud+docker+k8s发布安装第三方插件脚本

Dockerfile 安装第三方依赖插件软件 &#xff0c;以及构建镜像 #基础镜像&#xff0c;如果本地仓库没有&#xff0c;会从远程仓库拉取 openjdk:8 FROM docker.io/centos:centos7 #暴露端口 EXPOSE 9311 # 避免centos中文乱码 ENV LANG en_US.utf8 #容器中创建工作目录 WORKDIR …

uni-app 从零开始第二章:hello world

一、新建项目 选择 默认模板&#xff0c;填写项目名&#xff0c;然后点击创建&#xff0c;我这里选择的是 vue3&#xff0c;大家自行选择&#xff0c;默认是2 二、 运行项目到各个平台 注意&#xff0c;这里需要提前开启 微信开发者工具的端口 同样的&#xff0c;需要将mumu模…

DAY39:贪心算法(七)根据身高重建队列(注意思路)+最少箭引爆气球(重叠区间)

文章目录 406.根据身高重建队列&#xff08;注意思路&#xff09;思路两个维度降序排序注意点 完整版vector容器插入相关复习为什么能直接根据ki数值插入ki位置的下标 时间复杂度vector-insert操作存在的问题链表优化版时间复杂度list和vector的插入与访问操作区别 452.最少弓箭…

使用SDWAN构建安全的混合WAN

使用SD-WAN构建安全的混合WAN SDWAN的爆炸已成为头条新闻了一年多。企业正在以惊人的速度采取SDWAN&#xff0c;不但可以为分支机构提供更灵活的连接和利用程序性能&#xff0c;而且可以跨全部网络提供。远程“超级用户”依托SDWAN(通过将小型台式机装备提供的安全性&#xff…

图像尺寸、仿射、透视变换

1、尺寸变换 1.1 图像差值原理 1.2 图像缩放、翻转、拼接 1.2.1 图像缩放 1.2.2 图像翻转 1.2.3 图像拼接 #include <iostream> #include <fstream> #include <opencv2/opencv.hpp>using namespace std; using namespace cv;int main() {Mat gray imread(…

spring boot项目如何自定义参数校验规则

spring boot项目对参数进行校验时&#xff0c;比如非空校验&#xff0c;可以直接用validation包里面自带的注解。但是对于一些复杂的参数校验&#xff0c;自带的校验规则无法满足要求&#xff0c;此时需要我们自定义参数校验规则。自定义校验规则和自带的规则实现方式一样&…

【每日一题】Leetcode - 面试题 17.08. Circus Tower LCCI

Question Leetcode - 面试题 17.08. Circus Tower LCCI Train of thought Sorting heights to be ascending order and weights to be descending order. dp[i] j represents person[i] as the bottom of tower, the tower height is amount of j, to calculate the dp[i] …

【C语言初阶(11)】递归练习题

文章目录 1. 打印一个整型的每一位2. 求字符串长度3. 求 n 的阶乘4. 求第 n 个斐波那契数4.1 递归算法4.2 非递归算法 1. 打印一个整型的每一位 题目内容 接受一个整型值&#xff08;无符号&#xff09;&#xff0c;按照顺序打印它的每一位。 例如&#xff1a;输入 1234&#…

UART串口收发数据

uart4.h ubuntuubuntu:05_uart$ cat include/uart4.h #ifndef __UART_H__ #define __UART_H__//初始化相关操作 void hal_uart4_init();//发送一个字符 void hal_put_char(const char str);//发送一个字符串 void hal_put_string(const char* string);//接收一个字符 char h…

中医_治方

&#x1f368;中医治方 &#x1f354;普通&#x1f333;肺之实症&#x1f333;过食瓜果&#x1f333;补气&#x1f333;五脏逼毒法&#x1f333;判断是否有儿子&#x1f333;酒糟鼻&#x1f333;判断处女&#x1f333; 判断下一胎性别&#x1f333; 头痛&#x1f333; 音哑发不…

AI绘画结合GPT 把Ai绘画与摄影玩明白

一、绘画与摄影有什么关系&#xff1f; 绘画和摄影是两种不同的艺术形式&#xff0c;它们都以其自身独特的方式捕捉和表达现实。在某些方面&#xff0c;它们是相互联系的&#xff0c;而在其他方面&#xff0c;它们又有所不同。​ 相似之处&#xff1a;绘画和摄影都是创造性的…

Docker网络管理应用

实验要求 了解Docker常用网络模式&#xff0c;掌握Docker常用网络模式的使用。主要任务是利用busybox镜像建立容器&#xff0c;容器名称为test_busybox1和test_busybox2&#xff0c;将网络模式设置为none&#xff0c;并为容器配置IP地址&#xff0c;容器test_busybox1的IP设置…

21-部署 Web 项目到 Linux

目录 1.什么是部署&#xff1f; 2.如何部署&#xff1f; 2.1.本机连接远程mysql服务器&#xff08;可选项&#xff09; 2.2.在远程服务器mysql数据库上执行创建数据库、表的脚本 2.3.检查项目中连接mysql服务器的地址和密码是否正确 2.4.使用Maven打包项目&#xff0c;生…

Linux组件之内存池的实现

文章目录 一、为什么需要内存池二、内存池的工作流程三、内存池的实现3.1 数据结构3.2 接口设计3.2.1 创建内存池3.2.2 内存池销毁3.2.3 内存分配1. 分配小块内存2. 分配大块内存 3.2.4 内存池的释放3.2.5 内存池重置 3.3 完整代码 一、为什么需要内存池 应用程序使用内存&…