金豺(GJO)优化算法、matlab代码实现以及与PSO、GWO、SO算法比对

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 1 算法原理
    • 2 算法步骤
      • 2.1 初始化种群
      • 2.2 搜索猎物(全局搜索)
      • 2.3 包围和围捕猎物(局部搜索)
      • 2.4 从全局搜索转向局部搜索
    • 3 算法流程图
    • 4 matlab代码实现
    • 运行F3测试案例
    • 与GWO、PSO、SO算法进行比对——F3算法


前言

金豺(GJO)优化算法是2022年由Nitish Chopra 等人提出,GJO 的灵感来自金豺 (Canis aureus) 的协作狩猎行为。算法的三个基本步骤是猎物搜索、包围和突袭

1 算法原理

该算法主要是由雄雌豺狼带领各个豺狼对猎物进行搜索、包围和围捕。
A:雄雌豺狼对
B:个体搜索猎物
C:包围猎物
D&E:围捕猎物
金豺(GJO)优化算法、matlab代码实现以及与PSO、GWO、SO算法比对_第1张图片

2 算法步骤

2.1 初始化种群

对个体进行初始化,和大部分算法一样,Ymax:表示上界,Ymin:表示下界
在这里插入图片描述
通过上述公式对种群进行初始化。

2.2 搜索猎物(全局搜索)

Ym(t):所有豺狼个体中最好的个体——雄性豺狼

Yfm(t):所有豺狼个体中次好的个体——雌性豺狼

在这里插入图片描述
在这里插入图片描述
E的计算公式:
E:回避能量
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
c1=1.5,E1为从1.5~0线性递减。

rl的计算公式:
在这里插入图片描述
在这里插入图片描述
miu,v 为0-1的随机数,beta=1.5;

ps:τ对应matlab函数中的gamma函数。

豺狼个体更新位置的公式

ps:有点类似于灰狼优化算法个体更新位置的公式

算法的探索阶段(全局搜索)使用如下3个公式对豺狼个体进行位置更新。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.3 包围和围捕猎物(局部搜索)

算法的开发阶段(局部搜索)使用如下3个公式对豺狼个体进行位置更新
金豺(GJO)优化算法、matlab代码实现以及与PSO、GWO、SO算法比对_第2张图片
在这里插入图片描述

2.4 从全局搜索转向局部搜索

主要通过躲避能量的绝对值大小进行改变

当|E|>=1,豺狼对不同部分探索猎物,

当|E|<1,豺狼开始包围和攻击猎物。

3 算法流程图

金豺(GJO)优化算法、matlab代码实现以及与PSO、GWO、SO算法比对_第3张图片

4 matlab代码实现

main函数:

close all;
clear all;
clc;

% N种群大小
% Dim个体维度
% T最大迭代次数
% ub上界
% lb下界
% X_prey最好的个体
% G_best存储每次迭代后的最好个体的适应度值

N=300;
Dim=30;
T=500;
ub=100;
lb=-100;
[Y_prey,G_best]=GJO(Dim,ub,lb,N,T);
figure,
plot(G_best,'Color','blue');
best=G_best';%转置用于origin填充数据使用
xlim([1,500]);

my_function函数:

function my_fitness=my_function(X)
%F3测试问题
dim=size(X,2);
o=0;
for i=1:dim
    o=o+sum(X(1:i))^2;
end
my_fitness=o;
end

GJO主体代码

function [Y_prey,G_best]=GJO(Dim,ub,lb,N,T)
    %% 初始化参数
    c1=1.5;
    beta=1.5;
    %% 初始化种群
    Pop=zeros(N,Dim);
    Pop_size=size(Pop,1);
    for i=1:Pop_size
        for j=1:Dim
            Pop(i,j)=lb+rand*(ub-lb);
        end
    end
    %% 进化
    for t=1:T
        %筛选雄雌豺狼个体
        for i=1:Pop_size
            fit_ness(i)=my_function(Pop(i,:));
        end
        [~,sort_index]=sort(fit_ness);
        Y1=Pop(sort_index(1),:);%雄性豺狼
        Y2=Pop(sort_index(2),:);%雌性豺狼
        Y1_fitness=fit_ness(sort_index(1));%雄性豺狼适应度值
        Y2_fitness=fit_ness(sort_index(2));%雌性豺狼适应度值

        for i=1:Pop_size
            for j=1:Dim
            %eq(6)~eq(8)
            E0=2*rand-1;
            E1=c1*(1-(t/T));
            E=E1*E0;
            
            %eq(9)~eq(10)
            miu=rand;
            v=rand;
            sita=((gamma(1+beta)*sin(pi*beta/2))/(gamma((1+beta)/2)*beta*2.^((beta-1)/2))).^(1/beta);
            LF=0.01*(miu*sita)/(abs(v.^(1/beta)));
            rl=0.05*LF;

            if abs(E)>=1
            Y1_new=Y1(j)-E.*abs(Y1(j)-rl.*Pop(i,j));
            Y2_new=Y2(j)-E.*abs(Y2(j)-rl.*Pop(i,j));
            Y_new(i,j)=(Y1_new+Y2_new)./2;%紧随雄雌豺狼,更新豺狼位置 eq(4)、(5)and(11)
            else
            Y1_new=Y1(j)-E.*abs(rl*Y1(j)-Pop(i,j));
            Y2_new=Y2(j)-E.*abs(rl*Y2(j)-Pop(i,j));
            Y_new(i,j)=(Y1_new+Y2_new)./2;%紧随雄雌豺狼,更新豺狼位置 eq(12)、(13)and(11)
            end
            end
        end
            %% 计算所有新更新个体的适应度值
    for i=1:Pop_size
        Flag4Up=Y_new(i,:)>ub;
        Flag4Lp=Y_new(i,:)<lb;
        Y_new(i,:)=(Y_new(i,:).*(~(Flag4Up+Flag4Lp)))+Flag4Up.*ub+Flag4Lp.*lb;%修正
        y=my_function(Y_new(i,:));
        if y<my_function(Pop(i,:))
            fit_ness(i)=y;
            Pop(i,:)=Y_new(i,:);%替换个体
        end
    end
    %% 更新雄雌豺狼
    [~,sort_index]=sort(fit_ness);
    Y1=Pop(sort_index(1),:);%雄性豺狼
    Y2=Pop(sort_index(2),:);%雌性豺狼
    Y_prey=Y1;%最好的个体
    G_best(t)=my_function(Y1);%每次迭代后计算雄性豺狼个体的适应度值
    end
end

运行F3测试案例

金豺(GJO)优化算法、matlab代码实现以及与PSO、GWO、SO算法比对_第4张图片

与GWO、PSO、SO算法进行比对——F3算法

金豺(GJO)优化算法、matlab代码实现以及与PSO、GWO、SO算法比对_第5张图片
金豺(GJO)优化算法、matlab代码实现以及与PSO、GWO、SO算法比对_第6张图片

你可能感兴趣的:(matlab,算法,开发语言)