群体智能优化算法-斑马优化算法 (Zebra Optimization Algorithm, ZOA,含Matlab源代码)
摘要
斑马优化算法(Zebra Optimization Algorithm, ZOA)是一种基于斑马(Zebra)在觅食与防御行为中展现的社会行为所提出的元启发式算法。该算法将斑马在觅食阶段与对抗捕食者时的不同策略抽象为搜索过程,通过不断迭代更新斑马位置以在全局与局部搜索之间取得平衡,最终找到全局最优解。本文结合 ZOA 的核心思路并给出完整的 MATLAB 代码及详细中文注释,帮助读者深入理解并快速应用此算法。
1. 算法介绍
1.1 ZOA 的灵感
-
斑马群体行为
- 觅食阶段:斑马会在草原上成群觅食,彼此之间存在微妙的配合,一方面保持群体优势,另一方面能够随机移动寻找更佳草源。
- 防御与逃逸策略:当捕食者(如狮子)攻击时,斑马会采取防御或逃逸策略;有时可能分散逃跑,也可能联合反击。
-
算法核心机制
- 将斑马群体抽象为若干个体在搜索空间中随机分布;
- 每一次迭代包括两个主要阶段:
- 觅食阶段(Foraging Behaviour):向当前最优解靠近,或进行局部小范围搜索。
- 防御阶段(Defense Strategies):根据一定概率决定是逃逸策略还是反击策略,通过不同公式进行位置更新。
-
适用场景
- 适用于多种工程优化和高维非线性优化问题。
- 能平衡全局搜索与局部开发,并在后期维持一定多样性。
1.2 算法主要步骤
- 初始化
-
在给定的上下界
[lb, ub]
内随机生成一组个体(斑马)的初始位置,并计算其适应度。
-
- 觅食阶段(Foraging Behaviour)
- 斑马尝试沿着或远离当前最优解进行更新,产生新的候选位置;
- 保留能够改进适应度的解。
- 防御阶段(Defense Strategies)
- 根据随机数决定是哪种捕食者攻击;
- 若是“狮子攻击”,则斑马使用逃逸策略(做较大跳动);
- 若是“其他捕食者攻击”,斑马会尝试进攻策略(向最优解或被攻击的斑马靠近),再进行微调。
- 更新最优解
- 如果新的候选解优于当前全局最优解,则更新;
- 记录每一次迭代的最优适应度值。
- 迭代终止
- 当达到最大迭代次数或满足其他结束条件后,输出最终的全局最优解和收敛曲线。
2. 斑马优化算法 (ZOA) 完整 MATLAB 代码及详细中文注释
下面是 ZOA 的 MATLAB 源代码:
function [Best_score,Best_pos,ZOA_curve] = ZOA(SearchAgents, Max_iterations, lowerbound, upperbound, dimension, fitness)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 斑马优化算法(Zebra Optimization Algorithm, ZOA)
%
% 输入参数:
% SearchAgents :种群规模(斑马数量)
% Max_iterations :最大迭代次数
% lowerbound :搜索空间下界(可为标量或向量)
% upperbound :搜索空间上界(可为标量或向量)
% dimension :问题维度(变量个数)
% fitness :目标函数句柄
%
% 输出参数:
% Best_score :最终找到的全局最优适应度
% Best_pos :对应的最优解(斑马位置向量)
% ZOA_curve :每次迭代后的最优适应度历史记录(收敛曲线)
%
% 该算法结合了“觅食阶段”和“防御阶段”的行为模型,通过更新斑马在
% 搜索空间的位置以寻求全局最优解。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 若下界/上界是标量,则扩展为与 dimension 一致的行向量
lowerbound = ones(1,dimension).* (lowerbound);
upperbound = ones(1,dimension).* (upperbound);
%% ===================== INITIALIZATION ===================== %%
% 生成初始种群 X :SearchAgents 行、dimension 列
for i=1:dimension
X(:,i) = lowerbound(i) + rand(SearchAgents,1).*(upperbound(i) - lowerbound(i));
end
% 计算所有斑马个体的初始适应度
for i =1:SearchAgents
L = X(i,:);
fit(i) = fitness(L);
end
% ==================== 主循环 ====================== %
for t=1:Max_iterations
%% (A) 找到当前最优解 (best) 及位置 (location)
[best, location] = min(fit);
if t==1
% 第一次迭代,记录全局最优
PZ = X(location,:);
fbest = best;
else
% 若本代出现更优解,则更新全局最优
if best < fbest
fbest = best;
PZ = X(location,:);
end
end
%% (B) 觅食阶段 (Foraging Behaviour)
for i=1:SearchAgents
I = round(1 + rand); % 随机生成 1 或 2
% eq(3): X_newP1 = X(i,:) + rand*(PZ - I.*X(i,:))
X_newP1 = X(i,:) + rand(1,dimension).*(PZ - I.*X(i,:));
% 检查越界
X_newP1 = max(X_newP1, lowerbound);
X_newP1 = min(X_newP1, upperbound);
% 计算新位置适应度
f_newP1 = fitness(X_newP1);
% 如果更优,则保留新位置
if f_newP1 <= fit(i)
X(i,:) = X_newP1;
fit(i) = f_newP1;
end
end
%% (B) 觅食阶段结束
%% (C) 防御阶段 (defense strategies against predators)
% Ps 用于决定使用哪种防御策略
Ps=rand;
% 随机选择一个被攻击的斑马 AZ
k = randperm(SearchAgents,1);
AZ = X(k,:);
for i=1:SearchAgents
if Ps < 0.5
%% (C1) 狮子攻击,斑马选择逃逸策略
R = 0.1;
% eq(5) S1: X_newP2 = X(i,:) + R*(2*rand(...)-1)*(1-t/Max_iterations).*X(i,:)
X_newP2 = X(i,:) + R*(2*rand(1,dimension)-1)*(1 - t/Max_iterations).*X(i,:);
% 边界检查
X_newP2 = max(X_newP2, lowerbound);
X_newP2 = min(X_newP2, upperbound);
else
%% (C2) 其他捕食者攻击,斑马会选择进攻策略
I = round(1 + rand(1,1)); % 1或2
% eq(5) S2: X_newP2 = X(i,:) + rand*(AZ - I.* X(i,:))
X_newP2 = X(i,:) + rand(1,dimension).*(AZ - I.* X(i,:));
% 边界检查
X_newP2 = max(X_newP2, lowerbound);
X_newP2 = min(X_newP2, upperbound);
end
% 计算该新位置适应度
f_newP2 = fitness(X_newP2);
% 若更优,则更新
if f_newP2 <= fit(i)
X(i,:) = X_newP2;
fit(i) = f_newP2;
end
end
%% (C) 防御阶段结束
best_so_far(t) = fbest;
average(t) = mean(fit);
end
Best_score = fbest;
Best_pos = PZ;
ZOA_curve = best_so_far;
end
3. 小结
斑马优化算法(Zebra Optimization Algorithm,ZOA)通过模拟斑马的觅食与防御两大行为,将算法划分为觅食阶段和防御阶段以实现对搜索空间的全局探索和局部开发。算法在每次迭代中更新斑马个体位置,保留更优解并维持全局最优解,不断收敛到最优解。通过上述的完整 MATLAB 代码和详细注释,读者可直接理解并应用此算法到复杂优化问题中,并可针对性地进行扩展和改进。