摘要
狐狸优化算法(FOX)是一种基于狐狸在自然界中狩猎与运动行为所启发的智能优化算法。它通过模拟狐狸在捕食环境中对猎物(如老鼠、兔子等)的追逐、跳跃以及随机游走等策略,引入能量衰减和随机扰动等机制,平衡全局搜索与局部开发。FOX 算法在高维连续优化和复杂工程优化领域表现出良好的搜索效率和收敛稳定性。本文结合 FOX 的核心思想,并附上完整的 MATLAB 代码及中文注释,帮助读者深入理解并快速应用该算法。
1. 算法介绍
1.1 狐狸优化算法 (FOX) 的灵感
狐狸是一种中小型食肉动物,在自然界中以敏捷的身法、灵活的跳跃能力和随机多样的狩猎路径闻名。算法借鉴了狐狸在捕食、跳跃以及随机移动等过程中表现出的习性:
- 捕食策略 – 狐狸通过追踪最优猎物(全局最优解)并利用随机扰动进行逼近;
- 跳跃策略 – 狐狸在捕食时可能纵身一跃(模拟重力加速度、时间等),使算法能大幅度地改变搜索位置;
- 随机游走 – 狐狸在搜寻猎物不明确时,会采用随机游走方式(Gaussian/Uniform 噪声)进行全局搜索。
1.2 算法主要步骤
- 初始化 – 随机生成一组狐狸个体 (SearchAgents_no) 在给定范围
[lb, ub]
的初始位置; - 适应度评估 – 计算所有狐狸个体的目标函数值,找出全局最优(最佳狐狸)并记录其位置与适应度;
- 位置更新 – 在每次迭代中根据以下策略更新狐狸群:
- 雄狐狸捕食 – 计算距离、时间、加速度等要素模拟跳跃距离;
- 随机游走 – 若随机数满足一定条件,则进行高斯扰动或随机位移;
- 边界处理 – 若狐狸跳跃或随机游走后越出
[lb, ub]
,将其截断或带回有效边界; - 迭代与收敛 – 重复评估与更新过程,直至达到最大迭代次数 (Max_iter) 或满足其他终止准则,最后输出全局最优解。
2. MATLAB 代码及中文详细注释
以下是 FOX(狐狸优化算法)的完整 MATLAB 代码:
function [Best_score,Best_pos,curve]=FOX(SearchAgents_no,Max_iter,lb,ub,dim,fobj)
%
% 狐狸优化算法 (Fox-inspired Optimization Algorithm, FOX)
% ---------------------------------------------------------------
% Authors: Hardi M. Mohammed, Tarik A. Rashid
% Cite: Mohammed, H., Rashid, T. FOX: a FOX-inspired optimization algorithm.
% Appl Intell (2022). https://doi.org/10.1007/s10489-022-03533-0
%
% 输入参数:
% SearchAgents_no : 狐狸个体数量 (种群大小)
% Max_iter : 最大迭代次数
% lb, ub : 搜索空间下界、上界 (可为标量或向量)
% dim : 问题维度
% fobj : 目标 (适应度) 函数句柄
%
% 输出参数:
% Best_score : 收敛后全局最优适应度值
% Best_pos : 对应的全局最优解位置向量
% curve : 每次迭代记录的最优适应度值 (收敛曲线)
%Best_pos=zeros(1,dim); % 记录全局最优位置
Best_score=inf; % 记录全局最优适应度, 初始为无穷大 (最小化问题)
MinT=inf; % 用于记录最小跳跃时间% 初始化种群位置
X=initialization(SearchAgents_no,dim,ub,lb);
Distance_Fox_Rat = zeros(SearchAgents_no,dim);l=0; % 迭代计数器
% 两个参数 c1, c2 分别在区间 [0,0.18] 和 [0.19,1]
c1=0.18;
c2=0.82;%% ===================== 主循环 ===================== %%
while l<Max_iter% (A) 遍历所有狐狸, 检查边界 + 计算适应度 + 更新全局最优for i=1:size(X,1) Flag4ub = X(i,:)>ub;Flag4lb = X(i,:)<lb;% 若越界则拉回到范围内X(i,:) = (X(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb; % 计算适应度fitness = fobj(X(i,:));% 若当前适应度 < 全局最优 => 更新全局最优if fitness<Best_score Best_score = fitness;Best_pos = X(i,:);endend% (B) 计算收敛因子 a, 用于在搜索后期减小跳跃或随机范围a = 2*(1 - (l/Max_iter));Jump=0;dir = rand; % 随机方向% (C) 位置更新for i=1:size(X,1)r = rand;p = rand;% 若 r>=0.5 => 进行跳跃策略if r>=0.5% p>0.18 => 用 c1 (0.18), p<=0.18 => 用 c2 (0.82)if p>0.18Time(i,:) = rand(1,dim); % 随机时间sps = Best_pos./Time(i,:); % 相当于速度 = 距离 / 时间Distance_S_Travel(i,:) = sps.* Time(i,:);Distance_Fox_Rat(i,:) = 0.5* Distance_S_Travel(i,:);tt = sum(Time(i,:))/dim; % 计算平均时间t = tt/2;Jump=0.5*9.81* t^2; % s = 1/2*g*t^2 => 跳跃距离% 位置更新 = Dist * Jump * c1X(i,:) = Distance_Fox_Rat(i,:).* Jump * c1;else% 同理 p <= 0.18 => 用 c2Time(i,:) = rand(1,dim);sps = Best_pos./Time(i,:);Distance_S_Travel(i,:) = sps.* Time(i,:);Distance_Fox_Rat(i,:) = 0.5* Distance_S_Travel(i,:);tt = sum(Time(i,:))/dim;t = tt/2;Jump=0.5*9.81* t^2;X(i,:) = Distance_Fox_Rat(i,:).* Jump * c2;end% 更新最小时间if MinT>ttMinT=tt;endelse% (D) r<0.5 => random walk % eq: ans(i,:) = Best_pos + randn(1,dim).*(MinT*a)ans(i,:) = Best_pos + randn(1,dim).*(MinT*a);X(i,:) = ans(i,:);endendl = l+1;curve(l) = Best_score; % 记录本轮迭代后的最优适应度
end
end%% (E) 种群初始化函数
function X=initialization(SearchAgents_no,dim,ub,lb)
Boundary_no = size(ub,2); if Boundary_no==1X=rand(SearchAgents_no,dim).*(ub-lb)+lb;
endif Boundary_no>1for i=1:dimub_i=ub(i);lb_i=lb(i);X(:,i)=rand(SearchAgents_no,1).*(ub_i-lb_i)+lb_i;for i=1:dimSearchAgents_no(i+1)=cos(i*acos(SearchAgents_no(i)));G(i)=((x(i)+1)*Value)/2;endend
end
3. 小结
狐狸优化算法(FOX)借鉴狐狸捕食与随机游走行为来实现搜索空间的探索与开发,其跳跃策略(借助时间、速度和重力模拟)可在后期提升对局部最优的突破能力。本文给出了 FOX 的完整 MATLAB 代码以及中文详细注释,有助于快速掌握算法原理并加以应用或改进。