群体智能优化算法- 豪猪优化算法 (Crested Porcupine Optimization, CPO,含Matlab源代码)
摘要
豪猪优化算法(Crested Porcupine Optimization, CPO)是一种基于豪猪防御与行为模式的新颖群体智能算法。通过模拟豪猪在遇到威胁时的多重防御机制和群体协同搜索策略,CPO 能在复杂搜索空间中平衡全局探索与局部开发。该算法通过多阶段防御算子与最优解交互,实现较强的跳出局部最优的能力与后期收敛速度。本文提供了 CPO 的核心原理以及完整的 MATLAB 代码和中文详细注释,以帮助读者快速上手并深入理解。
1. 算法介绍
1.1 灵感来源:豪猪的防御机制
豪猪在自然界中通常通过以下防御机制来应对威胁:
- 第一防御机制:用刺抵御攻击并迅速后退或改变方向;
- 第二防御机制:与其他豪猪协作,保持安全距离并建立掩护;
- 第三防御机制:在较高风险下,进一步采用随机摆尾或刺击等方式;
- 第四防御机制:当情况危急时,可能主动进攻或逃离较远距离。
CPO 将多重防御机制抽象为搜索过程中的不同算子,配合最优解和随机个体进行吸引或排斥更新,从而兼顾全局搜索与局部开发。
1.2 算法主要步骤
-
初始化:在
[lb, ub]
范围内随机生成种群,并计算初始适应度。 - 多重防御机制更新:
- 第一、第二机制:用于初期的探索阶段,个体随机与最优解或随机个体进行交互。
- 第三、第四机制:用于后期开发或逃离局部最优,通过指数或正态随机扰动来增强搜索多样性。
- 最优解与记忆机制:
- 每次迭代后更新全局最优解(Gb_Sol)及其适应度(Gb_Fit),并对比个体当前解与个人历史最优解,保留较优者。
- 动态种群规模:
- 每次迭代根据特定公式,动态调整种群规模,以精细化后期搜索。
- 迭代终止:在达到最大迭代次数后输出最优解。
2. 完整 MATLAB 代码与中文详细注释
以下为豪猪优化算法(CPO)的完整 MATLAB 源码:
function [Gb_Fit,Gb_Sol,Conv_curve] = CPO(Pop_size, Tmax, lb, ub, dim, fobj)
% CPO 主函数
% 输入参数:
% Pop_size : 初始种群规模 (豪猪个体数量)
% Tmax : 最大迭代次数
% lb, ub : 搜索空间下界与上界 (可为标量或向量)
% dim : 问题维度 (决策变量个数)
% fobj : 目标 (适应度) 函数句柄
%
% 输出参数:
% Gb_Fit : 全局最优适应度值
% Gb_Sol : 全局最优解对应的位置
% Conv_curve : 每次迭代 (或评估) 的最优适应度值记录
%% ------------------- Definitions & Initialization ------------------- %%
Conv_curve = zeros(1,Tmax); % 用于记录收敛曲线
ub = ub.*ones(1,dim); % 若 ub 是标量,则扩展为 1 x dim
lb = lb.*ones(1,dim); % 若 lb 是标量,则扩展为 1 x dim
% 关键控制参数
N = Pop_size; % 初始种群规模
N_min = round(0.8*Pop_size); % 种群规模动态变化的下限 (80% of Pop_size)
T = 2; % 循环周期,用于动态调整种群规模
alpha = 0.2; % 收敛速率,用于防御机制中的更新系数
Tf = 0.8; % 在后期选择第三或第四防御机制的阈值
% 随机初始化种群的位置
X = initialization(Pop_size,dim,ub,lb);
t = 0; % 迭代计数器
%% --------------------- 初次计算适应度并更新全局最优 -------------------- %%
for i=1:Pop_size
fitness(i) = fobj(X(i,:));
end
[Gb_Fit, index] = min(fitness);
Gb_Sol = X(index,:);
% 个人历史最优位置数组
Xp = X;
%% --------------------- 主要迭代循环 -------------------------------- %%
while t <= Tmax
% 随机数 r2,用于后期某防御机制
r2 = rand;
for i=1:Pop_size
% U1: 随机二进制数组 (判断哪个维度应用防御算子)
U1 = rand(1,dim) > rand;
if rand < rand % Exploration phase (前期探索)
if rand < rand
%% 第一防御机制
% y = (X(i,:)+X(randi(Pop_size),:))/2 用于近似位置
y = (X(i,:) + X(randi(Pop_size),:)) / 2;
% X(i,:) = X(i,:) + (randn).*abs(2*rand*Gb_Sol - y);
X(i,:) = X(i,:) + (randn).*abs(2*rand*Gb_Sol - y);
else
%% 第二防御机制
y = (X(i,:) + X(randi(Pop_size),:))/2;
% X(i,:) = U1.*X(i,:) + (1-U1).*( y + rand*(X(randi(Pop_size),:)-X(randi(Pop_size),:)) );
X(i,:) = (U1).*X(i,:) + (1-U1).*(y + rand*(X(randi(Pop_size),:)-X(randi(Pop_size),:)));
end
else
%% 后期或更紧凑搜索 (第三、第四防御机制)
Yt= 2*rand*(1 - t/(Tmax))^(t/(Tmax));
U2 = rand(1,dim)<(0.5*2-1);
S = rand * U2; % 用于偏移量
if rand < Tf
% 第三防御机制
St = exp(fitness(i)/(sum(fitness)+eps));
S = S .* Yt .* St;
X(i,:) = (1-U1).*X(i,:) + U1.*( X(randi(Pop_size),:) + St*(X(randi(Pop_size),:)-X(randi(Pop_size),:)) - S );
else
% 第四防御机制
Mt = exp(fitness(i)/(sum(fitness)+eps));
vt = X(i,:);
Vtp= X(randi(Pop_size),:);
Ft = rand(1,dim).*( Mt*(-vt+Vtp) );
S = S.*Yt.*Ft;
% X(i,:) = ( Gb_Sol + (alpha*(1-r2)+r2)*( U2.*Gb_Sol - X(i,:) ) ) - S;
X(i,:) = Gb_Sol + (alpha*(1-r2)+r2)*(U2.*Gb_Sol - X(i,:)) - S;
end
end
% 边界处理
for j=1:size(X,2)
if X(i,j) > ub(j)
X(i,j) = lb(j) + rand*(ub(j)-lb(j));
elseif X(i,j) < lb(j)
X(i,j) = lb(j) + rand*(ub(j)-lb(j));
end
end
% 计算新适应度
nF = fobj(X(i,:));
% 如果新解不优于历史解,则回退到之前的个人最优
if fitness(i) < nF
X(i,:) = Xp(i,:);
else
% 否则更新个人历史最优
Xp(i,:) = X(i,:);
fitness(i) = nF;
% 检查是否能更新全局最优
if fitness(i) <= Gb_Fit
Gb_Sol = X(i,:);
Gb_Fit = fitness(i);
end
end
end
% 动态调整种群规模 (N_min <= Pop_size <= N)
Pop_size = fix(N_min + (N - N_min)*(1 - (rem(t, Tmax/T)/(Tmax/T))));
t = t + 1; % 进入下一代
if t > Tmax
break
end
% 记录当前代全局最优适应度
Conv_curve(t) = Gb_Fit;
end
end
% This function initialize the first population of search agents
function Positions = initialization(SearchAgents_no,dim,ub,lb)
% 若 ub, lb 为标量,则扩展到dim维度后随机初始化
Boundary_no= size(ub,2);
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. 小结
豪猪优化算法(CPO)通过模拟豪猪在面临威胁时的多重防御策略,将它们映射为搜索过程中的不同算子,并结合全局最优解交互、随机扰动及动态种群规模等机制,兼顾了搜索的多样性与收敛速度。本文给出了 CPO 的完整 MATLAB 实现及中文注释,有助于读者在工程优化或科学研究中应用并进一步改进该算法。