【Matlab】智能优化算法_非洲秃鹫优化算法AVOA

news2024/11/24 18:48:25

【Matlab】智能优化算法_非洲秃鹫优化算法AVOA

  • 1.背景介绍
  • 2.数学模型
  • 3.文件结构
  • 4.算法流程图
  • 5.伪代码
  • 6.详细代码及注释
    • 6.1 AVOA.m
    • 6.2 boundaryCheck.m
    • 6.3 exploitation.m
    • 6.4 exploration.m
    • 6.5 initialization.m
    • 6.6 levyFlight.m
    • 6.7 main.m
    • 6.8 ObjectiveFunction.m
    • 6.9 random_select.m
    • 6.10 rouletteWheelSelection.m
  • 7.运行结果
  • 8.参考文献

1.背景介绍

秃鹫是两类狩猎鸟类的名称。新世界秃鹫原产于美洲,旧世界秃鹫原产于欧洲、亚洲和非洲。澳大利亚和南极洲没有秃鹫。大多数秃鹫是秃头,没有规则的羽毛。从历史上看,秃鹫秃顶是为了防止在捕食尸体时受到污染,但最近的研究表明,裸露的皮肤在调节体温方面发挥着重要作用。这就是为什么在寒冷的天气里,秃鹫会将头埋在身体里,而在炎热的天气里,它们会张开脖子。另一个特点是,与大多数其他鸟类不同,秃鹫不筑巢。秃鹫很少攻击健康的动物,但可能会杀死受伤或生病的动物。在战争期间,人们曾在战场上看到许多秃鹫。秃鹫是防止刺伤和感染尸体的有用动物,尤其是在热带地区。秃鹫在生态系统外发挥着重要作用,它们的破坏给人类社会带来了一系列严重的健康风险。

秃鹫的数量正在急剧下降,一些非洲秃鹫物种已经减少到灭绝的地步。非洲国家也需要秃鹫,由于农村人口众多,大量的巨型动物,秃鹫是最基本和最有价值的肉食动物。非洲有各种各样的秃鹫,其中大多数具有相同的生活方式并寻找食物,经常相互遭遇并争夺食物。如图1所示,这些秃鹫中的一些是斑面秃鹫(Torgos tracheliotos)、白背秃鹫(Gyps Africans)和吕佩尔秃鹫(Gyps rueppelli)。

在这里插入图片描述

生活在非洲的每一种秃鹫都有一些独特的身体特征。因此,秃鹫的种类可分为三类。第一类包括体能优于所有秃鹫的秃鹫,如长脸秃鹫,它们比其他秃鹫有更大的机会获得食物。第二类包括体质比第一类弱的秃鹫。其他一些秃鹫也有体力优势: 白背秃鹫Gyps Africans。后一类包括比其他两类体质更弱的秃鹫: 帽鹫Necrosyrtes monachus。在自然环境中,秃鹫不断长途跋涉寻找食物,秃鹫最常见的飞行形式之一是旋转飞行。在寻找食物时,秃鹫会移动去寻找已经找到食物的秃鹫种类,有时可能会有几个种类的秃鹫移动到一个食物来源,这些秃鹫为了获得食物而互相冲突。弱小的秃鹫包围健康的秃鹫,通过使强壮的秃鹫疲惫来获得食物,秃鹫的饥饿使它们变得更具攻击性。一种新的元搜索算法激发了本研究关于在非洲寻找和喂养各种秃鹫的灵感。

2.数学模型

第1节讨论了秃鹫的生物学原理和生活方式。本小节的目的是基于1节所述的稳健理论和概念,提出一种新的元启发式算法AVOA。所有的元启发式算法在模拟和制定阶段都会考虑一系列关于自然环境的假设,然后介绍AVOA算法。本节将逐步实现AVOA算法,并根据秃鹫的基本概念对算法每一步的必要条件和要点进行描述。默认的AVOA算法如下。

  • 一个环境中最多可能有N只秃鹫。它决定了元启发式算法中相同的种群数量,而种群数量取决于研究人员想要应用于AVOA的问题。
  • 在自然环境中,众多的秃鹫可以被物理地分为两组,算法首先计算所有解(初始种群)的适应度函数,将秃鹫分为几类。最佳答案作为第一最佳秃鹫,第二最佳答案作为第二最佳秃鹫。其他的秃鹫组成一个种群,移动或替换每种表现中最好的两只秃鹫中的一只。
  • 在这种算法中将群体分开的原因是,秃鹫最重要的自然功能可以表述为:群体生活以寻找食物。每组秃鹫都有不同的觅食和进食能力。
  • 秃鹫的进食倾向和寻找食物的时间导致它们逃离饥饿的陷阱。在制定阶段,我们的反饥饿妥协,假定人口中最差的解决方案是最弱和最饥饿的,秃鹰们试图与最差的保持距离,并提出最好的解决方案。在AVOA中,两个最好的解决方案被认为是最强和最好的秃鹫,其他秃鹫试图接近最好的解决方案。

根据秃鹫的基本概念和模拟人工秃鹫优化算法的四个假设,将所提出的算法分为四个步骤。为便于理解,第4节为AVOA流程图,并对每一步算法进行了全面介绍。

a. 第一阶段:确定任一组中的最佳秃鹫

在初始种群形成后,计算所有解的适应度,选出最佳解作为第一组中的最佳秃鹫,次优解作为第二组中的最佳秃鹫,其他解利用公式(1)向第一组和第二组的最佳解移动。在每一次适应度迭代中,整个种群被重新计算。

在这里插入图片描述

在式(1)中,计算了选择被选中的秃鹫将其他秃鹫移向每组最佳解决方案之一的概率,其中L1和L2为搜索操作前需要测量的参数,其值介于0和1之间,两个参数之和为1。选择最佳解决方案的概率通过轮盘赌获得,使用式(2)选择每组的每个最佳解决方案。

在这里插入图片描述

在AVOA中,如果α数值参数接近于值1,而β数值参数接近于值0,则会导致集约化程度增加。另外,如果β数值参数接近于值1,而α数值参数接近于值0,则会导致AVOA的多样性增加。

b. 第二阶段: 秃鹫的饥饿率

秃鹫经常觅食,饱食时能量较高,因此觅食距离较远,但饥饿时能量不足,无法长距离飞行,只能在较强的秃鹫旁边觅食,饥饿时攻击性较强。对于这种行为的数学模型,公式(4)已被使用。它也被用于从探索阶段到开发阶段的转换,其灵感来自于秃鹫饱食或饥饿的速度。饱食率呈下降趋势,为了模拟这种行为,使用了公式(4)。

在这里插入图片描述

在式(3)和式(4)中,F表示秃鹫已经饱食,迭代i表示当前迭代次数,最大迭代次数表示总迭代次数,z是一个介于1和1之间的随机数,每次迭代都会发生变化。

在解决具有挑战性的优化问题时,无法保证在探索阶段结束时,最终种群将包括对全局最优的准确估计。因此,它会导致最优局部位置的过早收敛。式(3)已被用于提高解决复杂优化问题的性能,它增加了从局部最优点逃逸的可靠性。AVOA算法的最后迭代执行开发阶段,并在某些最后迭代中执行探索操作。该策略的总体目标是修改式(3)以改变探索和利用阶段,从而使AVOA算法能够提高在优化操作中的某一点进入探索阶段的概率。式(3)中,sin和cos分别表示正弦和余弦函数。w是优化操作前设定的一个固定参数,表示优化操作打乱了探索和操作阶段;随着w值的增大,在最终优化阶段进入探索阶段的概率增大,但是通过减小参数w,进入探索阶段的概率减小。图3和图4显示了优化过程中F, t随参数w值的变化情况。

在这里插入图片描述
在这里插入图片描述

秃鹫的总数率在下降,且每重复一次下降得更多。当|F|值大于1时,秃鹫在不同区域寻找食物,AVOA进入探索阶段。当|F|的值小于1时,AVOA进入开发阶段,秃鹫在解决方案附近寻找食物。

c. 第三阶段: 探索

在这一阶段,考察的是AVOA的探索阶段。在自然环境中,秃鹫有很强的视觉能力和很强的寻找食物的能力,并能发现可怜的垂死动物。然而,秃鹫寻找食物是非常困难的。秃鹫会长时间仔细观察生活环境,并长途跋涉寻找食物。在AVOA中,秃鹫可以检查不同的随机区域,这可以基于两种不同的策略,一个名为P1的参数用于选择任一策略。该参数必须在搜索操作前估值,其值应在0和1之间,决定两种策略的使用方式。

要在randP1探索阶段选择任一策略,需要生成一个介于0和1之间的随机数。但是,如果randP1小于参数P1,则使用公式(8)。在这种情况下,每只秃鹫在环境中随机搜索其饱和度。这个过程如公式(5)所示。

在这里插入图片描述

根据公式(6),秃鹫在两组中最好的一个随机距离的周围区域随机寻找食物,其中P(i+1)是秃鹫在下一次迭代中的位置向量,F是秃鹫的饱食率,在当前迭代中使用公式(4)得到。在式(7)中,R(i)是当前迭代中通过式(1)选出的最佳秃鹫之一。此外,X是秃鹫为保护食物不被其他秃鹫破坏而随机移动的位置。X作为增加随机运动的系数向量,在每次迭代中都会发生变化,其公式为X=2×rand,其中rand为0到1之间的随机数。 P(i)为秃鹫当前的向量位置。

在这里插入图片描述

在公式(8)中,R(i)是当前迭代中使用公式(1)选出的最佳秃鹫之一。F为当前迭代中使用公式(4)得到的秃鹫饱和率,rand2为0到1之间的随机值。rand3用于增加随机性系数。如果 rand3 取值接近于 1,则解的分布具有相似的模式,在 lb 的基础上增加了随机运动。它在搜索环境尺度上产生了较高的随机系数,以增加多样性和搜索不同的搜索空间区域。在AVOA中,使用最简单的模型来模拟秃鹫的运动。

d. 第四阶段: 开发

在此阶段,将对AVOA的效率阶段进行调查。如果|F|的值小于1,则AVOA进入开发阶段,该阶段也分为两个阶段,每个阶段使用两种不同的策略。在每个内部阶段选择每种策略的程度由P2和P3两个参数决定。参数P2用于选择第一阶段的可用策略,参数P3用于选择第二阶段的可用策略。在执行搜索操作前,这两个参数的值必须分别为0和1。第3节中研究的秃鹫寻找食物的动作是根据数学问题制定和调整的。

开发: 当|F|值介于1和0.5之间时,AVOA进入第一阶段 "探索 "阶段。在第一阶段,将执行两种不同的旋转飞行和包围战斗策略。P2用于确定每种策略的选择,在执行搜索操作前必须对其进行估值,该值应介于0和1之间。在该阶段开始时,产生randP2,它是一个介于0和1之间的随机数。但是,如果该随机数小于参数P2,则执行旋转飞行策略。该过程如式(9)所示。

在这里插入图片描述

食物竞争: 当|F|≥0.5时,秃鹫相对饱食,能量充足。当许多秃鹫聚集在一个食物源上时,会引起严重的食物获取冲突。此时,体力充沛的秃鹫不愿意与其他秃鹫分享食物,如图5所示。

在这里插入图片描述

另一方面,较弱的秃鹫试图通过聚集在健康秃鹫周围并引起小冲突来使健康秃鹫疲惫并从健康秃鹫那里获得食物。公式(10)和公式(11)用于模拟这一步骤。

在这里插入图片描述

D(i)用式(7)计算,F为秃鹫的饱食率,用式(4)计算,rand4为0~1之间的随机数,用于增加随机系数。在式(11)中,R(i)是当前迭代中利用式(1)选出的两组最佳秃鹫之一,P(i)是秃鹫的当前矢量位置,通过该矢量位置可以得到秃鹫与两组最佳秃鹫之一之间的距离。

秃鹫的旋转飞行: 秃鹫经常进行旋转飞行,图6是螺旋运动的模型。

在这里插入图片描述

螺旋模型被用于旋转飞行的数学建模。该方法在所有秃鹫和两只最佳秃鹫中的一只之间建立了一个螺旋方程。旋转飞行用公式(12)和(13)表示。

在这里插入图片描述

在式(12)和式(13)中,R(i)表示当前迭代中两个最佳秃鹫之一的位置向量,该位置向量通过式(1)获得;cos和sin分别表示正弦和余弦函数。rand5和rand6是介于0和1之间的随机数。 其中,S1和S2由式(12)得到。最后,利用公式(13)更新秃鹫的位置。

e. 剥削:(第二阶段)

在第二阶段,两只秃鹫的运动使食物源上空聚集了多种类型的秃鹫,秃鹫们为了寻找食物进行了围攻和激烈的争斗,如果|F|数小于0.5,则执行该阶段算法。如果F值小于0.5,则执行该阶段算法。在该阶段开始时,产生randP3,randP3是一个介于0和1之间的随机数。如果randP3大于或等于参数P3,则策略是在食物源上聚集多种类型的秃鹫。否则,如果产生的值小于参数P3,则执行攻击性围攻策略。该过程如式(14)所示。

在这里插入图片描述

几种秃鹫在食物源上空的聚集情况: 考察所有秃鹫向食物源的移动。有时,秃鹫处于饥饿状态,对食物的竞争非常激烈,可能会在一个食物源上聚集几种秃鹫。公式(15)和(16)被用来计算秃鹫的这种运动。

在这里插入图片描述

式(15)中,BestVulture1(i)是当前迭代中第一组的最佳秃鹫,BestVulture2(i)是当前迭代中第二组的最佳秃鹫,F是秃鹫饱和率,通过式(4)计算,P(i)是秃鹫的当前矢量位置。

在这里插入图片描述

最后,利用公式(16)对所有秃鹫进行汇总,其中A1和A2由公式(15)得到,P(i+1)是下一次迭代中秃鹫位置的向量。

对食物的激烈竞争: 当|F|<0.5时,头秃鹫变得饥饿和虚弱,没有足够的能量来对付其他秃鹫(见图7)。

在这里插入图片描述

另一方面,其他秃鹫在寻找食物时也会变得具有攻击性。它们朝着头鹫的不同方向移动。公式(17)用于模拟这种运动。

在这里插入图片描述

在式(16)中,d(t)表示秃鹫与两组最佳秃鹫之一的距离,通过式(11)计算得出。Levy flight (LF) 模式用于提高式(17)中AVOA的有效性,LF已被识别并用于许多元搜索算法的活动中。LFs通过公式(18)计算得出。

在这里插入图片描述

在公式(18)中,d表示问题维数,u和v为0到1之间的随机数,β为1.5的固定默认值。

3.文件结构

在这里插入图片描述

AVOA.m							% 非洲秃鹫优化算法
boundaryCheck.m					% 边缘检测
exploitation.m					% 开发阶段
exploration.m					% 勘探阶段
initialization.m 				% 初始化
levyFlight.m					% LF(式16)
main.m							% 主函数
ObjectiveFunction.m				% 目标函数
random_select.m	    			% 随机选择
rouletteWheelSelection.m		% 轮盘选择

4.算法流程图

在这里插入图片描述

5.伪代码

在这里插入图片描述
在这里插入图片描述

6.详细代码及注释

6.1 AVOA.m

function [Best_vulture1_F,Best_vulture1_X,convergence_curve]=AVOA(pop_size,max_iter,lower_bound,upper_bound,variables_no,fobj)

    % initialize Best_vulture1, Best_vulture2
    Best_vulture1_X=zeros(1,variables_no);
    Best_vulture1_F=inf;
    Best_vulture2_X=zeros(1,variables_no);
    Best_vulture2_F=inf;

    %Initialize the first random population of vultures
    X=initialization(pop_size,variables_no,upper_bound,lower_bound);

    %%  Controlling parameter
    p1=0.6;
    p2=0.4;
    p3=0.6;
    alpha=0.8;
    betha=0.2;
    gamma=2.5;

    %%Main loop
    current_iter=0; % Loop counter

    while current_iter < max_iter
        for i=1:size(X,1)
            % Calculate the fitness of the population
            current_vulture_X = X(i,:);
            current_vulture_F=fobj(current_vulture_X);

            % Update the first best two vultures if needed
            if current_vulture_F<Best_vulture1_F
                Best_vulture1_F=current_vulture_F; % Update the first best bulture
                Best_vulture1_X=current_vulture_X;
            end
            if current_vulture_F>Best_vulture1_F && current_vulture_F<Best_vulture2_F
                Best_vulture2_F=current_vulture_F; % Update the second best bulture
                Best_vulture2_X=current_vulture_X;
            end
        end

        a=unifrnd(-2,2,1,1)*((sin((pi/2)*(current_iter/max_iter))^gamma)+cos((pi/2)*(current_iter/max_iter))-1);
        P1=(2*rand+1)*(1-(current_iter/max_iter))+a;

        % Update the location
        for i=1:size(X,1)
            current_vulture_X = X(i,:);  % pick the current vulture back to the population
            F=P1*(2*rand()-1);  

            random_vulture_X=random_select(Best_vulture1_X,Best_vulture2_X,alpha,betha);
            
            if abs(F) >= 1 % Exploration:
                current_vulture_X = exploration(current_vulture_X, random_vulture_X, F, p1, upper_bound, lower_bound);
            elseif abs(F) < 1 % Exploitation:
                current_vulture_X = exploitation(current_vulture_X, Best_vulture1_X, Best_vulture2_X, random_vulture_X, F, p2, p3, variables_no, upper_bound, lower_bound);
            end

            X(i,:) = current_vulture_X; % place the current vulture back into the population
        end

        current_iter=current_iter+1;
        convergence_curve(current_iter)=Best_vulture1_F;

        X = boundaryCheck(X, lower_bound, upper_bound);

        fprintf("In Iteration %d, best estimation of the global optimum is %4.4f \n ", current_iter,Best_vulture1_F );
    end

end

6.2 boundaryCheck.m

function [ X ] = BoundaryCheck(X, lb, ub)

    for i=1:size(X,1)
            FU=X(i,:)>ub;
            FL=X(i,:)<lb;
            X(i,:)=(X(i,:).*(~(FU+FL)))+ub.*FU+lb.*FL;
    end
end

6.3 exploitation.m

function [current_vulture_X] = exploitation(current_vulture_X, Best_vulture1_X, Best_vulture2_X, ...
                                                                      random_vulture_X, F, p2, p3, variables_no, upper_bound, lower_bound)

% phase 1
    if  abs(F)<0.5
        if rand<p2
            A=Best_vulture1_X-((Best_vulture1_X.*current_vulture_X)./(Best_vulture1_X-current_vulture_X.^2))*F;
            B=Best_vulture2_X-((Best_vulture2_X.*current_vulture_X)./(Best_vulture2_X-current_vulture_X.^2))*F;
            current_vulture_X=(A+B)/2;
        else
            current_vulture_X=random_vulture_X-abs(random_vulture_X-current_vulture_X)*F.*levyFlight(variables_no);
        end
    end
    % phase 2
    if  abs(F)>=0.5
        if rand<p3
            current_vulture_X=(abs((2*rand)*random_vulture_X-current_vulture_X))*(F+rand)-(random_vulture_X-current_vulture_X);
        else
            s1=random_vulture_X.* (rand()*current_vulture_X/(2*pi)).*cos(current_vulture_X);
            s2=random_vulture_X.* (rand()*current_vulture_X/(2*pi)).*sin(current_vulture_X);
            current_vulture_X=random_vulture_X-(s1+s2);
        end
    end
end

6.4 exploration.m

function [current_vulture_X] = exploration(current_vulture_X, random_vulture_X, F, p1, upper_bound, lower_bound)

    if rand<p1
        current_vulture_X=random_vulture_X-(abs((2*rand)*random_vulture_X-current_vulture_X))*F;
    else
        current_vulture_X=(random_vulture_X-(F)+rand()*((upper_bound-lower_bound)*rand+lower_bound));
    end
    
end

6.5 initialization.m

% This function initialize the first population of search agents
function [ X ]=initialization(N,dim,ub,lb)

Boundary_no= size(ub,2); % numnber of boundaries

% If the boundaries of all variables are equal and user enter a signle
% number for both ub and lb
if Boundary_no==1
    X=rand(N,dim).*(ub-lb)+lb;
end

% If each variable has a different lb and ub
if Boundary_no>1
    for i=1:dim
        ub_i=ub(i);
        lb_i=lb(i);
        X(:,i)=rand(N,1).*(ub_i-lb_i)+lb_i;
    end
end

6.6 levyFlight.m

function [ o ]=levyFlight(d)
  
    beta=3/2;

    sigma=(gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
    u=randn(1,d)*sigma;
    v=randn(1,d);
    step=u./abs(v).^(1/beta);

    o=step;

end

6.7 main.m

clear all 
close all
clc

% Population size and stoppoing condition 
pop_size=30;  
max_iter=100;  

% Define your objective function's details here
fobj = @ObjectiveFunction;
variables_no=10;
lower_bound=-100; % can be a vector too
upper_bound=100; % can be a vector too
      
[Best_vulture1_F,Best_vulture1_X,convergence_curve]=AVOA(pop_size,max_iter,lower_bound,upper_bound,variables_no,fobj);


figure 

% Best optimal values for the decision variables 
subplot(1,2,1)
parallelcoords(Best_vulture1_X)
xlabel('Decision variables')
ylabel('Best estimated values ')
box on

% Best convergence curve
subplot(1,2,2)
plot(convergence_curve);
title('Convergence curve of AVOA')
xlabel('Current_iteration');
ylabel('Objective value');
box on

6.8 ObjectiveFunction.m

function o = ObjectiveFunction(x)
    % change this file according to your objective function 
    o=sum(x.^2);
end

6.9 random_select.m

function [random_vulture_X]=random_select(Best_vulture1_X,Best_vulture2_X,alpha,betha)

    probabilities=[alpha, betha ];
    
    if (rouletteWheelSelection( probabilities ) == 1)
            random_vulture_X=Best_vulture1_X;
    else
            random_vulture_X=Best_vulture2_X;
    end

end

6.10 rouletteWheelSelection.m

function [index] = RouletteWheelSelection(x)

    index=find(rand() <= cumsum(x) ,1,'first');

end

7.运行结果

在这里插入图片描述

8.参考文献

[1]Benyamin A,Soleimanian F G,Seyedali M. African vultures optimization algorithm: A new nature-inspired metaheuristic algorithm for global optimization problems[J]. Computers & Industrial Engineering,2021,158.

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

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

相关文章

ARPACK特征值求解分析

线性方程组求解、特征值问题是数值线性代数的主要研究内容。力学、电磁等许多问题&#xff0c;最终都可以归结为特征值、特征向量的求解。 ARPACK使用IRAM(Implicit Restarted Arnoldi Method)求解大规模系数矩阵的部分特征值与特征向量。了解或者熟悉IRAM算法&#xff0c;必定…

S32K flash擦除异常以及flash保护 (FLASH_DRV_CommandSequence函数异常)

出现问题 出现擦除flash异常,一直在FLASH_DRV_CommandSequence卡死复位 但是出现比较奇怪的现象&#xff0c;通过DEBUG在线调试&#xff0c;打断点&#xff0c;一步一步调试可以正常对flash正常擦除读写&#xff0c;但是脱离在线调试就出现不能正常擦除读写。 出现这种还是看…

大模型基础之大语言模型的进展

关键字&#xff1a;LLM大语言模型&#xff0c;fine-tuning微调 预训练语言模型的两种范式 1 特征提取器 提取语言的特征和表示&#xff0c;作为下游模型的输入。例如有名的word2vec模型。 use the output of PLMs as the input of downstream model 2 fine-tuning&#xf…

【代码随想录 | Leetcode | 第一天】数组 | 二分查找 | 边界问题 | 34-35-69-367-704

前言 欢迎来到小K的Leetcode|代码随想录|专题化专栏&#xff0c;今天将为大家带来二分查找边界问题&#xff08;循环不变量规则&#xff09;的分享✨ 目录 前言704. 二分查找367. 有效的完全平方数69. x 的平方根35. 搜索插入位置34. 在排序数组中查找元素的第一个和最后一个位…

PN结、形成过程、单向导电性、伏安特性、电容效应

目录 1.1.3PN结 PN结形成过程&#xff1a; PN结的单向导电性&#xff1a; PN结的伏安特性 PN结的电容效应 1.1.3PN结 形成&#xff1a;由于扩散运动而形成 扩散运动&#xff1a;物质总是从浓度高的地方向浓度低的地方运动&#xff0c;这种由于浓度差而产生的运动称为扩散运…

微服务 云原生:微服务相关技术简要概述

后端架构演进 单体架构 所谓单体架构&#xff0c;就是只有一台服务器&#xff0c;所有的系统、程序、服务、应用都安装在这一台服务器上。比如一个 bbs 系统&#xff0c;它用到的数据库&#xff0c;它需要存储的图片和文件等&#xff0c;统统都部署在同一台服务器上。 单体架…

ubuntu20.04配置vscode

下载&#xff1a; https://az764295.vo.msecnd.net/stable/660393deaaa6d1996740ff4880f1bad43768c814/code_1.80.0-1688479026_amd64.debhttps://az764295.vo.msecnd.net/stable/660393deaaa6d1996740ff4880f1bad43768c814/code_1.80.0-1688479026_amd64.deb 安装&#xff1a…

MySQL基础篇第9章(子查询)

文章目录 1、需求分析与问题解决1.1 实际问题1.2 子查询的基本使用1.3 子查询的分类 2、单行子查询2.1 单行比较操作符2.2 代码示例2.3 HAVING中的子查询2.4 CASE中的子查询2.5 子查询中的空值问题2.6 非法使用子查询 3、多行子查询3.1 多行比较操作符3.2 代码示例3.3 空值问题…

vuepress - - - 首页底部版权信息加a标签超链接跳转或备案信息跳转链接

修改前 默认的底部版权信息只能填写纯文本&#xff0c;加不了超链接跳转等。 对应\docs\README.md内容&#xff1a; 修改后 修改后&#xff0c;点击Zichen跳转会打开新的网页。 看官网例子 底部添加了备案号跳转链接。 找到官网的github部署的文件。点导航栏中的“指…

flutter开发实战-实现webview与Javascript通信JSBridge

flutter开发实战-实现webview与H5中Javascript通信JSBridge 在开发中&#xff0c;使用到webview&#xff0c;flutter实现webview是使用原生的插件实现&#xff0c;常用的有webview_flutter与flutter_inappwebview 这里使用的是webview_flutter&#xff0c;在iOS上&#xff0c;…

【IMX6ULL驱动开发学习】20. input子系统(按键实现ls命令)

一、input子系统相关结构体 二、input子系统实例实现&#xff1a; static struct input_dev *key_input;...... ....../* 1.申请空间 */ key_input input_allocate_device(); if(key_input NULL){printk("input alloc failed\n");return -ENOMEM; } /* 2.设置事件类…

Go实现WebSocket

Go语言标准包里面没有提供对WebSocket的支持&#xff0c;但是在由官方维护的go.net子包中有对这个的支持&#xff0c;你可以通过如下的命令获取该包&#xff1a; go get golang.org/x/net/websocket WebSocket分为客户端和服务端&#xff0c;接下来我们将实现一个简单的例子:…

云进销存是什么意思,云进销存系统该如何选?

云进销存是指基于云计算技术的一种进销存管理系统&#xff0c;云进销存系统可以帮助企业或中小商户实时监控库存情况、优化采购和销售流程、提高物流效率&#xff0c;以及生成各类报表和统计分析&#xff0c;从而提升企业或商户的运营效率和管理水平。 一、云进销存对中小商户有…

C#,数值计算——不完全 Beta 函数(incomplete beta function)的源代码

Incomplete Beta Function The incomplete beta function (also called the Euler Integral) is a generalized β-function; An independent integral (with integral bounds from 0 to x) replaces the definite integral. The formula is: Where: 0 ≤ x ≤ 1, a, b > 0…

Pro白嫖esri数据

最近用Pro比较多,想跟大家谈谈一些关于Pro的 技巧。在谈之前,我想问大家一个问题,你真的了解ArcGIS Pro吗? 我想大多数刚刚接触Pro的用户应该是把Pro当做像Map一样的数据处理分析工具,只是简单的从其他地方下载数据来加入工程进行处理和分析 或许在你眼里的Pro和Map仅有…

在Orangepi上使用raspberry的dashboard

树莓派实验室整了一个比较酷的dashboard&#xff0c;可以用来显示树莓派状态&#xff0c;主要内容是基于js和php来实现&#xff0c;因为orangepi的用户名和密码都是一个套路&#xff0c;首先想到能不能移植。 https://www.rstk.cn/news/860562.html?actiononClick 首先需要做…

Docker把公共镜像推送到harbor私服的流程(企业级)

如果构建项目时&#xff0c;使用了k8s docker Jenkins的模式。 那么我们在docker构建镜像时&#xff0c;如果需要使用了Nodejs&#xff0c;那么我们必须得从某个资源库中拉取需要的Nodejs。 在企业里&#xff0c;正常都会把自己项目涉及的库都放在harbor私服里。 下面讲一下&…

数据分类分级

数据分类是数据管理的第一步&#xff0c;是数据治理的先行条件。当前&#xff0c;数据应用方兴未艾。“数据”作为新的生产要素资源&#xff0c;支撑供给侧结构性改革、驱动制造业转型升级的作用日益显现&#xff0c;正成为推动质量变革、效率变革、动力变革的新引擎。但与此同…

python3+requests+unittest实战系列【二】

前言&#xff1a;上篇文章python3requestsunittest&#xff1a;接口自动化测试&#xff08;一&#xff09;已经介绍了基于unittest框架的实现接口自动化&#xff0c;但是也存在一些问题&#xff0c;比如最明显的测试数据和业务没有区分开&#xff0c;接口用例不便于管理等&…

ROS中bag的录制、播放和使用

文章目录 前言一、bag录制二、bag信息查看三、bag播放四、bag的使用&#xff08;以A-LOAM为例&#xff09; 前言 传感器获取到的信息&#xff0c;有时我们可能需要实时处理&#xff0c;有时可能只是采集数据&#xff0c;事后分析&#xff0c;比如: 机器人导航实现中&#xff0…