群体智能优化算法-GOOSE优化算法(含Matlab源代码)

摘要

GOOSE(Goose Optimization Algorithm)是一种基于大雁(Goose)在自然界中觅食与捕猎行为所启发的元启发式算法。它借助大雁的飞行速度、加速度、随机跳跃等策略,以实现对搜索空间进行全局探索和局部开发。通过设置自由落体速度(Free Fall Speed)、声音传播距离(Sound Distance)与时间平均(Time Average)等多种机制,GOOSE 在处理复杂的高维非线性优化问题时具备良好的收敛特性。本文结合算法原理并附上 MATLAB 源代码及详细注释,帮助读者快速理解并应用。


1. 算法介绍

1.1 GOOSE 算法的灵感与思路

  1. 大雁(Goose)生态行为

    • 大雁在季节性迁徙中会进行长距离飞行,利用编队协同等策略以减少能耗;
    • 在觅食或定位时可能会进行短距离跃起随机游走,以平衡远程探索与近距离开发。
  2. 算法核心机制

    • 随机跳跃模型:模拟大雁的距离、时间、重力等要素来生成跳跃更新;
    • 随机游走:当大雁不能确定方向时,引入随机分布进行全局搜索;
    • 最优解吸引:选取当前全局最优解(最佳大雁)作为“目标位置”,其余个体对其进行逼近或随机偏离。
  3. 适用范围

    • 适用于多种连续优化问题及工程应用中需要在全局最优与局部改进间平衡的场景;
    • 算法结构相对简单易实现,并在中高维问题上有较好表现。

2. GOOSE 优化算法之 MATLAB 代码

以下是 GOOSE(Goose Optimization Algorithm)完整 MATLAB 代码:

%*************************************************************************%
% GOOSE Algorithm source codes version 1.0                                
% GOOSE: A GOOSE-inspired Optimization Algorithm                          
% Authors: Rebwar Kh. Hamad, Tarik A. Rashid                              
% GOOSE is implemented by Rebwar Kh. Hamad                                
% Developed in MATLAB R2019a(6.9.0)                                       
%                                                                         
% Cite as: Hamad, R.K., Rashid, T.A. GOOSE algorithm: a powerful          
% optimization tool for real-world engineering challenges and beyond.     
% Evolving Systems (2024). https://doi.org/10.1007/s12530-023-09553-6     
% DOI:https://doi.org/10.1007/s12530-023-09553-6                          
%*************************************************************************%

function [Best_score,Best_pos,Cong_Curve]=GOOSE(SearchAgents_no,Max_IT,lb,ub,dim,fobj)

Best_pos=zeros(1,dim);        % 用于记录全局最优解位置
Best_score=inf;               % 用于记录全局最优适应度值(初始设为无穷大)
M_T=inf;                      % 用于记录最小时间(后续在随机游走使用)
Cong_Curve=zeros(1,Max_IT);   % 记录每次迭代后的最优适应度, 收敛曲线

% 初始化种群(大雁个体)
X=initialization(SearchAgents_no,dim,ub,lb);
Distance_Goose=zeros(SearchAgents_no,dim);  % 用于存储距离相关量

loop=0;  % 迭代计数器

%------------------- 主循环 (直到达到最大迭代次数) --------------------%
while loopub;
        Flag4lb=X(i,:) T_T = sum(T_o_A_S(i,:))/dim
        T_T = sum(T_o_A_S(i,:))/dim;

        % eq.(3.5) => T_A = T_T/2
        T_A = T_T/2;

        if rnd>=0.5
            % (B1) 若 rnd >= 0.5
            if pro>0.2
                % (B1.1) Stone Weight >= 12?
                if S_W>=12
                    % eq.(3.6) => F_F_S = T_o_A_O(i,:) * sqrt(S_W(i,:))/9.81
                    F_F_S = T_o_A_O(i,:)*( sqrt(S_W(i,:))/9.81 );
                    % eq.(3.7) => D_S_T(i,:) = S_S* T_o_A_S(i,:)
                    S_S=343.2;
                    D_S_T(i,:) = S_S* T_o_A_S(i,:);
                    % eq.(3.8) => D_G(i,:) = 0.5 * D_S_T(i,:)
                    D_G(i,:) = 0.5* D_S_T(i,:);
                    % eq.(3.9) => X(i,:) = F_F_S + D_G(i,:)* T_A^2
                    X(i,:)=F_F_S + D_G(i,:)* T_A^2;
                % eq. => else ...
                elseif S_W<12
                    % (B1.2) pro <= 0.2 => eq.(3.10) or eq.(3.11), but code has no direct else logic
                end
            elseif pro<=0.2
                % eq.(3.10) => F_F_S = T_o_A_O(i,:)* (S_W(i,:)/9.81)
                F_F_S = T_o_A_O(i,:)* (S_W(i,:)/9.81);
                S_S=343.2;
                D_S_T(i,:) = S_S* T_o_A_S(i,:);
                D_G(i,:)   = 0.5* D_S_T(i,:);

                % eq.(3.11) => X(i,:) = F_F_S.*D_G(i,:)* T_A^2 * coe
                X(i,:)= F_F_S.*D_G(i,:)* T_A^2 * coe;
            end
        else
            % (B2) rnd<0.5 => exploring wakeup
            if M_T> T_T
                M_T= T_T;
            end
            % eq.(3.12) => alpha=2-(loop/(Max_IT/2))
            alpha=(2 - (loop/(Max_IT/2)));
            % eq.(3.13) => random an awakening
            X(i,:) = randn(1,dim).*(M_T*alpha) + Best_pos;
        end

    end % for i=1:size(X,1)

    loop=loop+1;
    Cong_Curve(loop)=Best_score;  % 记录每轮迭代后全局最优适应度
end
end


%% (C) 种群初始化函数
function X=initialization(SearchAgents_no,dim,ub,lb)
% 若上/下界都是单数值 => 生成随机 uniform
% 若上/下界为向量 => 分别对各维度操作
Boundary_no= size(ub,2);

if Boundary_no==1
    X=rand(SearchAgents_no,dim).*(ub-lb)+lb;
end

if Boundary_no>1
    for i=1:dim
        ub_i=ub(i);
        lb_i=lb(i);
        X(:,i)=rand(SearchAgents_no,1).*(ub_i-lb_i)+lb_i;
    for i=1:dimValue
        SearchAgents_no(i+1)=cos(i*acos(SearchAgents_no(i)));
        G(i)=((x(i)+1)*Value)/2;
    end
    end
end
end

3. 小结

GOOSE 优化算法将 大雁在天上飞行、搜索、坠落等行为过程抽象成不同的更新算子,在全局搜索与局部开发中进行平衡。通过随机时间、自由落体速度与声音传播距离等物理量的模拟,算法能在搜索过程中跳出局部最优并向全局最优解收敛。上述完整 MATLAB 代码中文详细注释有助于读者快速掌握并在各种工程优化和研究场景中应用或进一步改进此算法。

你可能感兴趣的:(算法,matlab,开发语言,群体智能优化,优化)