当前位置: 首页 > article >正文

群体智能优化算法- 豪猪优化算法 (Crested Porcupine Optimization, CPO,含Matlab源代码)

摘要

豪猪优化算法(Crested Porcupine Optimization, CPO)是一种基于豪猪防御与行为模式的新颖群体智能算法。通过模拟豪猪在遇到威胁时的多重防御机制和群体协同搜索策略,CPO 能在复杂搜索空间中平衡全局探索与局部开发。该算法通过多阶段防御算子最优解交互,实现较强的跳出局部最优的能力与后期收敛速度。本文提供了 CPO 的核心原理以及完整的 MATLAB 代码中文详细注释,以帮助读者快速上手并深入理解。

1. 算法介绍

1.1 灵感来源:豪猪的防御机制

豪猪在自然界中通常通过以下防御机制来应对威胁:

  1. 第一防御机制:用刺抵御攻击并迅速后退或改变方向;
  2. 第二防御机制:与其他豪猪协作,保持安全距离并建立掩护;
  3. 第三防御机制:在较高风险下,进一步采用随机摆尾或刺击等方式;
  4. 第四防御机制:当情况危急时,可能主动进攻或逃离较远距离。

CPO 将多重防御机制抽象为搜索过程中的不同算子,配合最优解和随机个体进行吸引或排斥更新,从而兼顾全局搜索局部开发

1.2 算法主要步骤

  1. 初始化:在 [lb, ub] 范围内随机生成种群,并计算初始适应度。

  2. 多重防御机制更新
    • 第一、第二机制:用于初期的探索阶段,个体随机与最优解或随机个体进行交互。
    • 第三、第四机制:用于后期开发或逃离局部最优,通过指数或正态随机扰动来增强搜索多样性。
  3. 最优解与记忆机制
    • 每次迭代后更新全局最优解(Gb_Sol)及其适应度(Gb_Fit),并对比个体当前解与个人历史最优解,保留较优者。
  4. 动态种群规模
    • 每次迭代根据特定公式,动态调整种群规模,以精细化后期搜索。
  5. 迭代终止:在达到最大迭代次数后输出最优解。

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 实现中文注释,有助于读者在工程优化或科学研究中应用并进一步改进该算法。


http://www.kler.cn/a/591706.html

相关文章:

  • 深入学习恩智浦 GoPoint:探索 AI Demo 与嵌入式 AI 开发
  • IPD解读——IPD重构产品研发与产品管理
  • 25届二本:春招希望不大,要做两手准备了
  • 【多线程】线程不安全问题
  • Couchbase Analytics 的结构
  • CRM企业客户关系管理系统产品原型方案
  • FastJson:JSON JSONObject JSONArray详解以及SimplePropertyPreFilter 的介绍
  • Spring Boot 整合 Nacos 注册中心终极指南
  • JavaSE-String字符串
  • Git 实战指南:本地客户端连接 Gitee 全流程
  • ngx_http_core_srv_conf_t
  • pytorch小记(十二):pytorch中 masked_fill_() vs. masked_fill() 详解
  • 《我的Python觉醒之路》之转型Python(十三)——控制流
  • Trae插件革命:用VSPlugin Helper实现VSCode市场插件全自动安装
  • RabbitMQ常见问题总结
  • Laravel框架下通过DB获取数据并转为数组的方法
  • 宝石PDF,全新 PC 版本,全部免费
  • CSS中z-index使用详情
  • C++和标准库速成(八)——指针、动态数组、const、constexpr和consteval
  • LeetCode 第14~16题