摘要
火烈鸟优化算法(FSA,Flamingo Search Algorithm)是一种基于火烈鸟群体迁徙和觅食行为的元启发式优化算法。该算法通过模拟两阶段迁徙(先行与后行)和中间觅食行为,让种群在迭代中不断朝向更优解移动。FSA 在保持搜索多样性的同时,能在后期阶段快速收敛,适用于复杂的高维非线性优化问题。本文提供了 FSA 算法原理以及完整的 MATLAB 代码和详细中文注释,帮助读者深入理解并快速上手应用。
1. 算法介绍
1.1 火烈鸟优化算法的灵感来源
火烈鸟是一种群居水鸟,具有下列典型行为:
- 阶段性迁徙(Migration):火烈鸟在特定时节会分批次、阶段性地进行长距离迁徙;
- 集体觅食(Foraging):火烈鸟群在湖泊或沼泽地带协同寻找食物;
- 队形保持与分工:迁徙时火烈鸟会保持特定的队形分布,部分火烈鸟先行,另一些跟随或在觅食等。
FSA 将火烈鸟的两阶段迁徙与中间觅食等行为抽象成优化过程的位置更新与随机扰动,从而兼顾全局搜索与局部开发能力。
1.2 算法主要阶段
在每次迭代中,火烈鸟种群分成三部分:
- 第一阶段迁徙(MPo 个体)
- 在此阶段先行迁徙的火烈鸟向全局最优解进行位置更新,以加速收敛。
- 觅食阶段(MPt 个体)
- 部分火烈鸟留在原地或接近最优解区域进行觅食;其位置受随机干扰因子、正态分布等影响。
- 第二阶段迁徙(MPr 个体)
- 剩余火烈鸟再次向最优解更新,从而进一步提高全局搜索精度。
通过以上步骤循环迭代,并在每次迭代中更新全局最优解,FSA 最终在搜索空间中趋于收敛。
2. 完整 MATLAB 代码与中文注释
以下是火烈鸟优化算法(FSA)的完整 MATLAB 代码:
function [Score,Position,Convergence_curve]=FSA(Pop,Max_iter,lb,ub,dim,fobj)
% FSA (Flamingo Search Algorithm)
% 输入参数:
% Pop : 种群规模 (火烈鸟个体数量)
% Max_iter : 最大迭代次数
% lb, ub : 搜索空间下界与上界 (可为标量或向量)
% dim : 问题维度 (决策变量数)
% fobj : 目标 (适应度) 函数句柄
%
% 输出参数:
% Score : 收敛后得到的最优适应度值 (目标函数值)
% Position : 对应的最优解位置向量
% Convergence_curve : 每次迭代记录的最优适应度值 (收敛曲线)
% 如果 ub, lb 是单一数值, 扩展到 dim 维
if size(ub,1)==1
ub=ones(dim,1)*ub;
lb=ones(dim,1)*lb;
end
Convergence_curve = zeros(1,Max_iter); % 用于存储每代的最优适应度
%============= 1. 种群初始化 =============%
% 根据上下界随机生成火烈鸟个体的位置
X = initialization(Pop,dim,ub,lb);
Position=zeros(1,dim); % 全局最优解位置
Score=inf; % 全局最优解适应度
% 计算初始适应度
for i=1:size(X,1)
Fitness(1,i) = fobj(X(i,:));
end
% 将种群按适应度排序, 并找出最优个体
[sorted_fitness,sorted_indexes]=sort(Fitness);
for newindex=1:Pop
Sorted_Pos(newindex,:)=X(sorted_indexes(newindex),:);
end
Position = Sorted_Pos(1,:); % 当前最优解位置
Score = sorted_fitness(1); % 当前最优解适应度
%============= 2. 主循环开始 =============%
l = 1; % 迭代计数器
while l < Max_iter+1
% MP_b: 第一阶段迁徙火烈鸟所占比例
MP_b = 0.1;
% 随机数R,用于决定第二阶段迁徙火烈鸟数量
R = rand();
% MPr: 第二阶段迁徙火烈鸟的数量
MPr = round(R * Pop * (1 - MP_b));
% MPo: 第一阶段迁徙火烈鸟数量
MPo = MP_b*Pop;
% MPt: 中间留在原地或附近觅食的火烈鸟数量
MPt = Pop - MPo - MPr;
Xb = Sorted_Pos(1,:); % 全局最优解(当前种群最优)
% eps: 在[1,-1]之间随机取正负值, 用于觅食阶段扰动
a = rand();
if a > 0.5
eps = 1;
else
eps = -1;
end
% G: 正态分布随机数, 用于觅食阶段
G = random('Normal',0,1);
%=========== 2.1 第一阶段迁徙 (MPo 个体) ===========%
for j=1:round(MPo)
for i=1:dim
% w: 正态分布噪声, (均值=0, 方差=1.2)
sz=1;
w = normrnd(0,1.2,sz);
% X(j, i) = X(j, i) + (Xb(i) - X(j, i)) * w eqn.(3)
X(j, i) = X(j, i) + (Xb(i) - X(j, i)) * w;
end
end
%=========== 2.2 中间觅食阶段 (MPt 个体) ===========%
for j = 1+round(MPo) : round(MPo+MPt)
for i=1:dim
% eqn.(2): X(j,i) = ( X(j,i) + eps*Xb(i) + G*( G*|Xb(i)+eps*X(j,i)| ) ) / chi2pdf(8,1)
X(j, i) = (X(j, i) + eps*Xb(i) + G*( G*abs(Xb(i) + eps*X(j, i)))) / chi2pdf(8,1);
end
end
%=========== 2.3 第二阶段迁徙 (MPr 个体) ===========%
for j = round(MPo+MPt)+1 : Pop
for i=1:dim
sz=1;
w = normrnd(0,1.2,sz);
% 与第一阶段相同的更新公式 eqn.(3)
X(j, i) = X(j, i)+(Xb(i)-X(j, i))*w;
end
end
% 边界处理, 若越界则进行替换 (将越界点放到相反位置, eqn 不明确, 这里是 if X<lb => X=ub, X>ub => X=lb)
for i=1:Pop
for j=1:dim
if X(i,j)<lb(j)
X(i,j) = ub(j);
elseif X(i,j)>ub(j)
X(i,j) = lb(j);
end
end
end
% 重新计算新的适应度, 若有更优解则更新
for i=1:size(X,1)
Fitness(1,i) = fobj(X(i,:));
if Fitness(1,i) < Score
Position = X(i,:);
Score = Fitness(1,i);
end
end
% 记录本代最优适应度值
Convergence_curve(l) = Score;
l = l + 1;
end
end
%%====================== 种群初始化函数 ======================%%
function Positions=initialization(SearchAgents_no,dim,ub,lb)
% 如果 [ub,lb] 是标量 => uniformly sampled
% 如果 [ub,lb] 是向量 => 分别对每个维度生成
Boundary_no= size(ub,1);
if Boundary_no==1
Positions=rand(SearchAgents_no,dim).*(ub-lb)+lb;
end
if Boundary_no>1
for i=1:dim
ub_i=ub(i);
lb_i=lb(i);
Positions(:,i)=rand(SearchAgents_no,1).*(ub_i-lb_i)+lb_i;
end
end
end
3. 小结
火烈鸟优化算法(FSA)借鉴火烈鸟群体在迁徙与觅食过程中的分批队形与行为特征,将其拆分成两阶段迁徙和中间觅食三个主要更新步骤,再配合简单的边界检查,从而完成对搜索空间的全局探索与局部开发。