【群智能算法改进】一种改进的金豺优化算法IGJO[1](动态折射反向学习、黄金正弦策略、自适应能量因子)【Matlab代码#94】

文章目录

    • 【`获取资源`请见文章第5节:资源获取】
    • [1. 原始金豺优化算法](#1. 原始金豺优化算法)
      • [1.1 种群初始化](#1.1 种群初始化)
      • [1.2 搜寻接近猎物](#1.2 搜寻接近猎物)
      • [1.3 包围驱赶猎物](#1.3 包围驱赶猎物)
      • [1.4 猛扑并擒获猎物](#1.4 猛扑并擒获猎物)
    • [2. 改进金豺优化算法](#2. 改进金豺优化算法)
      • [2.1 动态折射反向学习](#2.1 动态折射反向学习)
      • [2.2 黄金正弦策略](#2.2 黄金正弦策略)
      • [2.3 自适应能量因子](#2.3 自适应能量因子)
    • [3. 部分代码展示](#3. 部分代码展示)
    • [4. 仿真结果展示](#4. 仿真结果展示)
    • [5. 资源获取](#5. 资源获取)

获取资源请见文章第5节:资源获取】


1. 原始金豺优化算法

金豺优化算法GJO(Golden Jackal Optimization)是 Chopra 等于 2022 年提出的一种元启发式算法,其通过模拟金豺群体协同捕食行为(搜索、包围、攻击)实现优化。 相较传统算法,GJO 具有控制参数少、实现简单等优势,已成功应用于高维特征选择、机器人路径规划、人流量预测及软件定义网络等领域。

1.1 种群初始化

GJO算法中定义了 n 个猎物,每个猎物的位置信息代表一个潜在解。 假设初始时刻猎物在搜索空间上随机均匀分布,可表示为:

Y0为猎物初始种群的位置;rand 是[0,1]范围内的随机数;Ymax 和 Ymin 分别是求解问题的上下边界。

金豺狩猎行为由雄豺领导,雌豺跟随其狩猎,其中最佳位置代表雄豺位置 YM( t),次佳位置的代表雌豺位置 YFM(t)。算法中,选择每次迭代排名前2位结果生成雄、雌金豺更新前的位置,利用猎物的逃脱能量E来更新猎物位置。猎物逃脱能量E的表达式为:

式中:E1表示猎物能量的下降过程;E0表示猎物能量的初始状态;r表示(0,1)间随机数;t表示当前迭代次数;T表示最大迭代次数;c1是等于1. 5的常值。

1.2 搜寻接近猎物

当金豺与食物的距离过大且周围没有食物时,金豺将采用随机游走策略进行位置更新位置,数学模型如下:

1.3 包围驱赶猎物

当猎物遭受攻击时,猎物逃逸能量E持续衰减,触发金豺群体执行协同围捕行为。雄性和雌性金豺一起捕猎的行为的数学模型如下:

1.4 猛扑并擒获猎物

最终迭代完成时,雄豺的位置即为全局最优解。

2. 改进金豺优化算法

2.1 动态折射反向学习

动态折射反向学习策略的思想来自于凸透镜成像的原理。通过基于当前坐标生成一个反向位置来扩展搜索范围,如图1所示。

图1 透镜成像折射反向学习原理图

在二维坐标中,x轴的搜索范围为(a, b), y轴表示一个凸透镜。假设物体A在x轴上的投影为x,高度为h,通过透镜成像,另一侧的图像为A*, A在x轴上的投影为x ,高度为h*。通过以上分析,我们可以得到如下公式:
( a + b ) / 2 − x x ∗ − ( a + b ) / 2 = h h ∗ \frac{(a+b)/2-x}{x^{*}-(a+b)/2 }=\frac{h}{h^{*}} x∗−(a+b)/2(a+b)/2−x=h∗h

对公式(2)进行转换,即可得到反向解x*的表达式为:
x ∗ = a + b 2 + a + b 2 k − x k x^{*} =\frac{a+b}{2}+\frac{a+b}{2k}-\frac{x}{k} x∗=2a+b+2ka+b−kx

其中, k = h / h ∗ k=h/h^{*} k=h/h∗, a a a和 b b b可以视为某维度的上下限。本文中的 k k k是一个与迭代次数相关的动态自适应值。

2.2 黄金正弦策略

受到正弦函数的启发,利用数学中的正弦函数进行迭代寻优,具有较强的全局搜索能力,同时在位置更新过程中引入黄金分割系数来使算法能够对局部区域进行充分搜索,使全局搜索和局部开发能力达到良好的平衡。下面是金豺个体利用黄金正弦策略进行位置更新的公式:

2.3 自适应能量因子

标准 GJO 算法采用线性衰减模式调控能量参数 E1,其固定衰减特性难以有效协调全局勘探与局部开发间的动态平衡。具体表现为:过早进入包围猎物阶段,迫使算法提前锁定局部区域,陷入局部寻优。 因此,本文提出一种自适应变化的 E1 表达式来进行逃逸能量调控:

3. 部分代码展示

matlab 复制代码
%% 清除环境变量
clear;
close all;
clc;

%% 参数设置
N = 30;             % 种群规模
Function_name = 'F4';         % 从F1到F23的测试函数的名称
Max_iteration = 500;           % 最大迭代次数
cnt_max = 2;
% 加载所选基准函数的详细信息
[lb, ub, dim, fobj] = Get_Functions_details(Function_name);

Curve_GJO = zeros(1,Max_iteration);
Curve_IGJO = zeros(1,Max_iteration);


for cnt = 1:cnt_max
    % 初始化种群位置
    X = initialization(N, dim, ub, lb);
    [GJO_Best_score(cnt), GJO_Best_pos(cnt, :), GJO_Curve]= GJO(X,N,Max_iteration,lb,ub,dim,fobj);
    [IGJO_Best_score(cnt), IGJO_Best_pos(cnt, :),IGJO_Curve]=IGJO(X,N,Max_iteration,lb,ub,dim,fobj);

    Curve_GJO = Curve_GJO+GJO_Curve;
    Curve_IGJO = Curve_IGJO+IGJO_Curve;

end


Curve_GJO = Curve_GJO/cnt_max;
Curve_IGJO = Curve_IGJO/cnt_max;


std_GJO = std(GJO_Best_score);
std_IGJO = std(IGJO_Best_score);

worst_GJO = max(GJO_Best_score);
worst_IGJO = max(IGJO_Best_score);


best_GJO = min(GJO_Best_score);
best_IGJO = min(IGJO_Best_score);

mean_GJO = mean(GJO_Best_score);
mean_IGJO = mean(IGJO_Best_score);

%% 画图
% 1、画出所选基准函数的三维立体图形
figure('Position',[454   445   694   297]);
subplot(1,2,1);
func_plot(Function_name);
title(Function_name)
xlabel('x_1');
ylabel('x_2');
zlabel([Function_name,'( x_1 , x_2 )'])

% 2、画出目标函数值变化曲线图
subplot(1,2,2);
t = 1:Max_iteration;
semilogy(t, Curve_GJO, 'g-',t, Curve_IGJO, 'r-','linewidth', 1.5);
title(Function_name);
xlabel('Iteration');
ylabel('Mean of objective function values');
axis fill
grid on
box on
legend( 'GJO', 'IGJO');

%% 显示结果
disp(['函数:', num2str(Function_name)]);
disp(['GJO:最差值: ', num2str(worst_GJO), ', 最优值: ', num2str(best_GJO), ', 平均值: ', num2str(mean_GJO), ', 标准差: ', num2str(std_GJO)]);
disp(['IGJO:最差值: ', num2str(worst_IGJO), ', 最优值: ', num2str(best_IGJO), ', 平均值: ', num2str(mean_IGJO), ', 标准差: ', num2str(std_IGJO)]);

4. 仿真结果展示






5. 资源获取

可更换其他群智能优化算法,获取完整代码资源。👇👇👇👀名片

相关推荐
长桥夜波2 小时前
【第二十三周】统计学习复习笔记
笔记·学习
pandarking2 小时前
[CTF]攻防世界:easy_laravel 学习
java·学习·web安全·laravel·ctf
Han.miracle2 小时前
数据结构与算法--006 和为s的两个数字(easy)
java·数据结构·算法·和为s的两个数字
AA陈超2 小时前
LyraStarterGame 5.6 项目学习路径
c++·笔记·学习·lyra
机器学习之心2 小时前
基于组合赋权法(BWM+CRITIC)与可拓云理论的综合风险评估模型MATLAB代码
matlab·组合赋权法·可拓云理论·综合风险评估模型
AuroraWanderll2 小时前
C++类和对象--访问限定符与封装-类的实例化与对象模型-this指针(二)
c语言·开发语言·数据结构·c++·算法
月明长歌3 小时前
【码道初阶】LeetCode 622:设计循环队列:警惕 Rear() 方法中的“幽灵数据”陷阱
java·算法·leetcode·职场和发展
其美杰布-富贵-李3 小时前
Fluent 网格质量全面评估(完整学习笔记)
笔记·学习·cfd·fluent·网格质量
mit6.8243 小时前
博弈-翻转|hash<string>|smid
算法