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

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.

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码两年半的练习生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值