鹅优化算法(GOOSE AlgorithmGO)是一种群智能优化算法,Rebwar Khalid Hamad提出了一种基于鹅的休息和觅食行为的新型元启发式算法。鹅用一条腿站立,保持平衡,以保护和保护群中的其他个体。该算法通过自适应地调整搜索空间的分辨率和搜索速度,以快速而准确地找到最优解,具有收敛速度快、求解精度高等特点,是一个出色的优化算法。该成果于2024发表在知名SCI期刊JCQ3区Evolving Systems上。

fa4399460ba1140fe7dd0d6866a1f014.png

GO从鹅的休息和觅食行为获得灵感,当鹅听到任何奇怪的声音或动作时,它们会发出响亮的声音来唤醒群中的个体,并保证它们的安全。

鹅群在它们之间创造了一种有吸引力的保护氛围。鹅的动作特点分为三类:1. 在它们休息的时候,大雁成群地聚集在一起,其中一只用单腿保持平衡。2. 偶尔,他抬起一条腿,扛起一块小石头,这样,当他睡着时,石头又掉了下来,鹅就会醒过来。3. 当鹅注意到任何意外的噪音或活动时,它会发出响亮的叫声来警告群中的其他动物,以保证它们的安全。

be7e8d895677e300ebb767e6a647a29f.png

鹅成群地聚集在它们的避难所和休息区。在种群中,会有一只鹅被指派守卫,这只鹅开始通过站立和单腿平衡来执行他的命令。每当鹅睡着时,它的腿或它携带的石头就会掉到地上。这时,岩石的声音传到了群中的另一只鹅。它一听到这个声音就会处于被剥削的状态。因此,其他个体需要一些时间才能听到守护鹅的叫声。

61799b8a95aa6bb62452f59eb6d82ccb.png

1、算法原理

(1)开发阶段

我们首先需要估计鹅脚里的石头的重量,在525公斤之间。通过下式,我们可以在任意迭代中随机求出石头的重量。这个变量指示迭代的次数。

然后,在下式中,我们应该找到当石头落下时到达地球所需的时间time_of_arrive_object。它是随机的,在1到循环中每次迭代的维数之间。

在下式中,我们找到了物体撞击地面并发出声音并传递给群中每只鹅的时间Time_of_Arrive_Soundit

在下一个等式中,找出声音在整个迭代过程中传播并到达群中单个鹅所需的总时间。如该式所示,维度除以总时间量。

为了得到所需的平均时间,我们将总时间除以2。下式解释了步骤。

正如我们之前所讨论的,有一个随机变量rnd负责开发和探索阶段的分布。变量pro的值在[0,1]范围内随机选取。假设变量pro的值大于0.2,且Stone_Weightit大于等于12。在上式中,time_of_arrive_object乘以stone_weight的平方根除以物体的加速度。为了保护和唤醒群体中的个体,这些方程式应该被计算出来。

(2)探索阶段

一旦其中一只鹅醒来,它们就开始尖叫,以保护鸟群中的所有个体,此时开始进入探索阶段。如果变量rnd的值小于0.5,那么应用以下方程。

通过使用randn(1, dim)确保鹅随机探索搜索空间中的其他个体。然而,Minimum_Timealpha变量都被用来提高GOOSE的可搜索性。在下式中,将时间和alpha的最小值乘以一个随机数,然后加到搜索空间中的最佳位置。

Міпітит

其中dim是问题维度的数量,Best_pos是我们在搜索区域中找到的最佳位置。

总而言之,鹅算法随机开始生成种群。然后,在第一次迭代中,它检查种群中的值,以恢复边界外的值。同时,实现目标函数来确定搜索边界内的最佳分数和最佳位置。为了控制开发和勘探阶段,我们使用随机选择值的随机变量rand。如果rand的值大于或等于0.5,则激活探索阶段。

2、结果展示

18e3a3772315b500ba934f9124c2321c.png

844163ba09b720957cfde0a23cb68350.png

70bacaa8055a39df78e88ce4593be288.png

1c1f4b1416dfdd86dfd32a6f6cf34c2d.png

8e9b99655907f1d1d50a4ebed224fa3b.png

可以看到,该算法基本不会陷入局部最优解。搜索效率也还不错!

3、MATLAB核心代码

%% 淘个代码 %%
% 微信公众号搜索:淘个代码,获取更多代码
% 鹅优化算法(GO)
function [Best_score,Best_pos,Cong_Curve]=GOOSE(SearchAgents_no,Max_IT,lb,ub,dim,fobj)
Best_pos=zeros(1,dim);
Best_score=inf;                          %change this to -inf for maximization problems
M_T=inf;
Cong_Curve=zeros(1,Max_IT);
%Initialize the positions of search agents
X=initialization(SearchAgents_no,dim,ub,lb);
Distance_Goose=zeros(SearchAgents_no,dim);
loop=0;                                               % Loop counter
% Main loop
while loop<Max_IT
    for i=1:size(X,1)
        % Return back the search agents that go beyond the boundaries of the search space
        Flag4ub=X(i,:)>ub;
        Flag4lb=X(i,:)<lb;
        X(i,:)=(X(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
        % Calculate objective function for each search agent
        fitness=fobj(X(i,:));
        if fitness<Best_score
            Best_score=fitness;
            Best_pos=X(i,:);
        end
    end
    for i=1:size(X,1)
        pro=rand;
        rnd=rand;
        coe=rand();
        if(coe<=0.17)
            coe;
        else
            coe=0.17;
        end
S_W(i,:)=randi([5,25],1,1);                                         %Eq.(3.1)
        % Time of Arrive object to earth.
T_o_A_O(i,:)=rand(1,dim);                                           %Eq.(3.2)
        % Time of Arrive Sound to Groups
T_o_A_S(i,:)=rand(1,dim);                                           %Eq.(3.3)
T_T=sum(T_o_A_S(i,:))/dim;                                          %Eq.(3.4)
        % Determine Time Average
T_A=T_T/2;                                                          %Eq.(3.5)
        if rnd>=0.5
            if pro>0.2
                if S_W>=12
                    %  Calculate Free Fall Speed
                    F_F_S=T_o_A_O(i,:) *(sqrt(S_W(i,:))/ 9.81);       %Eq.(3.6)
                    S_S=343.2;
                    D_S_T(i,:)=S_S* T_o_A_S(i,:);                     %Eq.(3.7)
                    D_G(i,:)=0.5* D_S_T(i,:);                         %Eq.(3.8)
                    X(i,:)=F_F_S + D_G(i,:)* T_A^2;                     %Eq.(3.9)
                elseif S_W<12
                elseif pro<=0.2
                    %  Calculate Free Fall Speed
                    F_F_S=T_o_A_O(i,:) *(S_W(i,:)/ 9.81);             %Eq.(3.10)
                    S_S=343.2;
                    D_S_T(i,:)=S_S* T_o_A_S(i,:);                     %Eq.(3.7)
                    D_G(i,:)=0.5* D_S_T(i,:);                         %Eq.(3.8)
                    X(i,:)=F_F_S.*D_G(i,:)* T_A^2*coe;                  %Eq.(3.11)
                end
            end
        else
            if M_T>T_T
                M_T=T_T;
            end
            alpha=(2-(loop/(Max_IT/2)));                         %Eq.(3.12)
            %random an awakening
            % exploring wakeup without holding stone.
            X(i,:)=randn(1,dim).*(M_T*alpha)+Best_pos;           %Eq.(3.13)
        end
    end
    loop=loop+1;
    Cong_Curve(loop)=Best_score;
end

参考文献

[1] Hamad R K, Rashid T A. GOOSE algorithm: a powerful optimization tool for real-world engineering challenges and beyond[J]. Evolving Systems, 2024: 1-26.

完整代码获取方式:后台回复关键字:

TGDM199

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐