GOOSE(Goose Optimization Algorithm)是一种基于大雁(Goose)在自然界中觅食与捕猎行为所启发的元启发式算法。它借助大雁的飞行速度、加速度、随机跳跃等策略,以实现对搜索空间进行全局探索和局部开发。通过设置自由落体速度(Free Fall Speed)、声音传播距离(Sound Distance)与时间平均(Time Average)等多种机制,GOOSE 在处理复杂的高维非线性优化问题时具备良好的收敛特性。本文结合算法原理并附上 MATLAB 源代码及详细注释,帮助读者快速理解并应用。
大雁(Goose)生态行为
算法核心机制
适用范围
以下是 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
GOOSE 优化算法将 大雁在天上飞行、搜索、坠落等行为过程抽象成不同的更新算子,在全局搜索与局部开发中进行平衡。通过随机时间、自由落体速度与声音传播距离等物理量的模拟,算法能在搜索过程中跳出局部最优并向全局最优解收敛。上述完整 MATLAB 代码及中文详细注释有助于读者快速掌握并在各种工程优化和研究场景中应用或进一步改进此算法。