群体智能优化算法-金豺优化算法(Golden Jackal Optimization, GJO,含Matlab源代码)

devtools/2025/3/17 5:40:08/

摘要

金豺优化算法(Golden Jackal Optimization, GJO)是一种基于金豺(Golden Jackal)的群体捕猎行为而提出的新型元启发式算法。该算法通过模拟雄豺与雌豺在狩猎时的协同合作与分工机制,结合莱维(Lévy)飞行等随机扰动,在复杂搜索空间中平衡全局搜索与局部开发。本文提供了 GJO 的核心原理以及完整的 MATLAB 代码中文详细注释,帮助读者快速理解与应用。

1. 算法介绍

1.1 金豺优化算法的灵感与思路

  1. 金豺(Golden Jackal)生态行为
    • 金豺通常以成对(雄豺+雌豺)的形式进行捕猎,并配合协同战术来提高捕食成功率。
    • 雄豺与雌豺在狩猎中常扮演不同角色:雄豺可能负责追击,雌豺进行伏击或反向干扰等。
  2. 算法主要机制
    • 雄豺雌豺分别作为全局最优和次优解,种群的更新都参考这两只“领导豺”的位置;
    • 通过Evading energyLévy飞行等方式实现全局探索与局部开发的动态平衡;
    • 算法更新过程中,通过判断能量(E)大小决定是处于开发阶段(Exploitation)还是探索阶段(Exploration),并对各豺狼个体位置进行相应的计算更新。

1.2 GJO 算法流程概述

  1. 初始化:随机生成一定数量的个体位置(种群),并计算适应度,找出当前最优(雄豺)和次优(雌豺)。
  2. 迭代更新
    • 计算能量(E),判断是开发还是探索。
    • 开发阶段时,通过对雄豺、雌豺位置与随机扰动的结合来更新个体。
    • 探索阶段时,引入更大范围的随机,以避免陷入局部最优。
    • 引入莱维随机数(Lévy)进一步增强搜索多样性。
  3. 更新雄豺、雌豺:若新的个体适应度更优,则替换原有雄豺或雌豺。
  4. 终止:达到最大迭代次数或满足其他条件后结束,输出全局最优解(雄豺)和收敛曲线。

2. MATLAB 代码及中文详细注释

以下是 GJO(金豺优化算法)的完整 MATLAB 源码:
 

function [Male_Jackal_score,Male_Jackal_pos,Convergence_curve] = GJO(SearchAgents_no,Max_iter,lb,ub,dim,fobj)
% GJO - 金豺优化算法(Golden Jackal Optimization)
%
% 输入参数:
%   SearchAgents_no : 种群规模(豺狼个体数量)
%   Max_iter        : 最大迭代次数
%   lb, ub          : 搜索空间的下界、上界(可为标量或向量)
%   dim             : 问题维度
%   fobj            : 目标函数句柄
%
% 输出参数:
%   Male_Jackal_score : 全局最优适应度(由雄豺对应)
%   Male_Jackal_pos   : 对应的雄豺位置向量
%   Convergence_curve : 记录每代迭代后的全局最优适应度值%% ----------------- 1. 初始化关键变量 ----------------- %%
Male_Jackal_pos = zeros(1,dim);  % 雄豺位置
Male_Jackal_score = inf;         % 雄豺适应度,初始设为∞
Female_Jackal_pos = zeros(1,dim);  
Female_Jackal_score = inf;       % 雌豺适应度% 生成初始种群
Positions = initialization(SearchAgents_no, dim, ub, lb);% 用于记录收敛曲线
Convergence_curve = zeros(1,Max_iter);l = 0;   % 迭代计数器%% ----------------- 2. 主循环 ----------------- %%
while l < Max_iter% (A) 先进行边界处理 & 更新雄豺、雌豺for i=1:size(Positions,1)% 如果位置超出上下界,则将其截断到边界Flag4ub = (Positions(i,:)>ub);Flag4lb = (Positions(i,:)<lb);Positions(i,:) = ( Positions(i,:).*(~(Flag4ub+Flag4lb)) ) + ub.*Flag4ub + lb.*Flag4lb;% 计算适应度fitness = fobj(Positions(i,:));% 若当前适应度 < 雄豺最优,则更新雄豺if fitness < Male_Jackal_scoreMale_Jackal_score = fitness;Male_Jackal_pos   = Positions(i,:);end% 若当前适应度 在 (雄豺适应度, 雌豺适应度) 之间,则更新雌豺if fitness > Male_Jackal_score && fitness < Female_Jackal_scoreFemale_Jackal_score = fitness;Female_Jackal_pos   = Positions(i,:);endend% (B) 计算E1,Evading energy 相关参数E1 = 1.5*(1 - (l/Max_iter));RL = 0.05 * levy(SearchAgents_no, dim, 1.5);  % 引入 Lévy 随机数% (C) 更新每只豺狼的位置for i=1:size(Positions,1)for j=1:size(Positions,2)% 生成随机数r1 = rand();  E0 = 2*r1 - 1; E  = E1*E0;   % Evading energy% 若 abs(E)<1 => 开发阶段 (Exploitation)if abs(E) < 1% eqn. (Exploitation)D_male_jackal   = abs((RL(i,j)*Male_Jackal_pos(j) - Positions(i,j)));Male_Positions(i,j)   = Male_Jackal_pos(j) - E*D_male_jackal;D_female_jackal = abs((RL(i,j)*Female_Jackal_pos(j) - Positions(i,j)));Female_Positions(i,j) = Female_Jackal_pos(j) - E*D_female_jackal;else% 若 abs(E) >= 1 => 探索阶段 (Exploration)% eqn. (Exploration)D_male_jackal   = abs( Male_Jackal_pos(j) - RL(i,j)*Positions(i,j) );Male_Positions(i,j)   = Male_Jackal_pos(j) - E*D_male_jackal;D_female_jackal = abs( Female_Jackal_pos(j) - RL(i,j)*Positions(i,j));Female_Positions(i,j) = Female_Jackal_pos(j) - E*D_female_jackal;end% 最终位置取雄/雌位置平均值Positions(i,j) = (Male_Positions(i,j) + Female_Positions(i,j))/2;endendl = l + 1;Convergence_curve(l) = Male_Jackal_score;  % 记录迭代后雄豺最优适应度
end
end%% (D) 种群初始化函数
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;end
end
end%% (E) Lévy分布随机数函数
function [z] = levy(n,m,beta)% 计算 Lévy 飞行分布num = gamma(1+beta)*sin(pi*beta/2); den = gamma((1+beta)/2)*beta*2^((beta-1)/2);sigma_u = (num/den)^(1/beta);u = random('Normal',0,sigma_u,n,m);v = random('Normal',0,1,n,m);z = u./(abs(v).^(1/beta));
end

3. 小结

金豺优化算法(GJO)通过模拟雄豺雌豺在捕食过程中的角色分工与协作,以及随机扰动能量等机制,在全局搜索与局部开发之间找到平衡。结合莱维随机飞行进一步增大搜索多样性,提升了跳出局部最优的概率。本文给出了完整MATLAB实现详细中文注释,读者可在此基础上对算法进行应用或进一步改进,以适应各种实际优化需求。


http://www.ppmy.cn/devtools/167743.html

相关文章

MambaTab:表格数据处理的新利器

——基于结构化状态空间模型的特征增量学习框架 摘要 本文提出MambaTab&#xff0c;一种基于结构化状态空间模型&#xff08;SSM&#xff09;的表格数据处理框架。通过创新的嵌入稳定化设计与轻量化SSM架构&#xff0c;MambaTab在普通监督学习和特征增量学习场景中均表现优异&…

【C语言系列】C语言内存函数

C语言内存函数 一、memcpy使用和模拟实现1.1memcpy函数1.2memcpy函数的模拟实现 二、memmove使用和模拟实现2.1memmove函数2.2memmove函数的模拟实现 三、memset函数的使用3.2memset函数及使用 四、memcmp函数的使用4.1memcmp函数及使用 五、总结memcpy 函数memmove 函数memset…

数据结构与算法-图论-欧拉路径和欧拉回路(有向图和无向图,骑马修栅栏,单词游戏 play on words)详细代码注解

基础前置知识&#xff1a; 有向图&#xff1a; 欧拉路径&#xff1a; 定义&#xff1a;在有向图中&#xff0c;从一个顶点出发&#xff0c;经过每条边恰好一次&#xff0c;并且遍历所有顶点的路径称为有向图的欧拉路径。 特征&#xff1a;有向图存在欧拉路径&#xff0c;当…

【开原宝藏】30天学会CSS - DAY1 第一课

下面提供一个由浅入深、按步骤拆解的示例教程&#xff0c;让你能从零开始&#xff0c;逐步理解并实现带有旋转及悬停动画的社交图标效果。为了更简单明了&#xff0c;以下示例仅创建四个图标&#xff08;Facebook、Twitter、Google、LinkedIn&#xff09;&#xff0c;并在每一步…

不用 Tomcat?SpringBoot 项目用啥代替?

在SpringBoot框架中&#xff0c;我们使用最多的是Tomcat&#xff0c;这是SpringBoot默认的容器技术&#xff0c;而且是内嵌式的Tomcat。 同时&#xff0c;SpringBoot也支持Undertow容器&#xff0c;我们可以很方便的用Undertow替换Tomcat&#xff0c;而Undertow的性能和内存使…

【小沐学Web3D】three.js 加载三维模型(React)

文章目录 1、简介1.1 three.js1.2 react.js 2、three.js React结语 1、简介 1.1 three.js Three.js 是一款 webGL&#xff08;3D绘图标准&#xff09;引擎&#xff0c;可以运行于所有支持 webGL 的浏览器。Three.js 封装了 webGL 底层的 API &#xff0c;为我们提供了高级的…

在 Linux 64 位系统上安装 Oracle 11g R2 数据库的完整指南

linux.x64_11gR2_database 是 Oracle 数据库 11g 第 2 版&#xff08;11g Release 2&#xff09;的安装包&#xff0c;适用于 64 位 Linux 操作系统。这个安装包包含了在 64 位 Linux 系统上安装 Oracle 数据库所需的全部文件和组件。 安装步骤概述 以下是在 Linux 系统上安装…

(七)Spring Boot学习——Redis使用

有部分内容是常用的&#xff0c;为了避免每次都查询数据库&#xff0c;将部分数据存入Redis。 一、 下载并安装 Redis Windows 版的 Redis 官方已不再维护&#xff0c;你可以使用 微软提供的 Redis for Windows 版本 或者 使用 WSL&#xff08;Windows Subsystem for Linux&a…