金豹算法(GJO)多目标优化(文末附完整免费代码)

1.算法简介

金豹优化算法(Golden Jackal Optimization, GJO)是由Nitish Chopra等人在2022年提出的一种元启发式优化算法,其灵感来源于金豺(Golden Jackal)的协作狩猎行为。该算法模拟金豹(也称为亚洲胡狼)的社会行为和狩猎策略。GJO属于群体智能算法家族,旨在解决复杂的优化问题。
在这里插入图片描述

2.算法原理

金豹算法的核心原理基于金豹的两种主要行为模式: (1) 领导行为:模拟群体中领导者引导其他成员的行为。 (2) 探索行为:模拟个体独立探索新区域的行为

2.1 领导行为

X i n e w = X i + α ∗ ( X j − X i ) X_{i}^{new}=X_i+\alpha*(X_j-X_i) Xinew=Xi+α(XjXi)

其中, X i X_i Xi是当前解, X j X_j Xj是随机选择的另一个解, α \alpha α 是领导率( 0 < α < 1 0<\alpha<1 0<α<1

2.2 探索行为

X i n e w = X i + β ∗ r a n d n ( ) X_{i}^{new}=X_i+\beta*randn() Xinew=Xi+βrandn()

其中, β \beta β 是探索率, r a n d n ( ) randn() randn()是从标准正态分布的随机数。

3.算法主要步骤

金豹算法的主要计算流程如下:

(1) 初始化:

  • 定义目标函数 f ( X ) f(X) f(X)
  • 设置种群大小 N,最大迭代次数 M a x i t e r Max_iter Maxiter ,领导率 α \alpha α,探索率 β \beta β
  • 随机生成初始种群 X 1 , X 2 , … , X N X_1, X_2, \ldots, X_N X1,X2,,XN

(2) 评估:计算每个解的适应度 f ( X i ) f(X_i) f(Xi)

(3) 主循环(重复直到达到 M a x i t e r Max_iter Maxiter ):

① 对每个解 X i X_i Xi

  • 如果 r a n d ( ) < α rand()<\alpha rand()<α
    执行领导行为: X i n e w = X i + α ∗ ( X j − X i ) X_{i}^{new}=X_i+\alpha*(X_j-X_i) Xinew=Xi+α(XjXi)
  • 否则:
    执行探索行为: X i n e w = X i + β ∗ r a n d n ( ) X_{i}^{new}=X_i+\beta*randn() Xinew=Xi+βrandn()

② 边界处理:确保新解 X i n e w X_{i}^{new} Xinew 在搜索空间内

③ 评估新解:计算 f ( X i n e w ) f(X_{i}^{new}) f(Xinew)

④ 更新:如果 f ( X i n e w ) f(X_{i}^{new}) f(Xinew) 优于 f ( X i ) f(X_i) f(Xi),则用 X i n e w X_{i}^{new} Xinew 替换 X i X_i Xi

4.核心代码

金豹优化算法的函数,可以直接拿来用

% GJA 函数:金豺豹算法的实现,用于求解优化问题。
function [bestSol, bestCost, costHistory] = GJA(problem, params)
    
    % 问题信息:提取优化问题的细节。
    CostFunction = problem.CostFunction;       % 要最小化的目标函数。
    nVar = problem.nVar;                       % 决策变量的数量。
    VarMin = problem.VarMin;                   % 每个变量的最小值。
    VarMax = problem.VarMax;                   % 每个变量的最大值。
    
    % 参数设置:设定算法的参数。
    MaxIt = params.MaxIt;                      % 最大迭代次数。
    nPop = params.nPop;                        % 种群大小。
    alpha = params.alpha;                      % 领导阶段的概率。
    beta = params.beta;                        % 探索阶段的步长系数。
    
    % 初始化种群:创建初始种群的解。
    empty_individual.Position = [];            % 定义空位置。
    empty_individual.Cost = [];                % 定义空成本。
    
    pop = repmat(empty_individual, nPop, 1);   % 初始化种群数组。
    
    % 为种群中的每个个体生成初始位置。
    for i = 1:nPop
        pop(i).Position = unifrnd(VarMin, VarMax, [1, nVar]); % 在限定范围内随机生成位置。
        pop(i).Cost = CostFunction(pop(i).Position);          % 评估成本。
    end
    
    % 对种群按成本排序。
    [~, SortOrder] = sort([pop.Cost]);
    pop = pop(SortOrder);
    
    % 找到目前为止发现的最佳解。
    bestSol = pop(1);
    
    % 初始化最佳成本历史记录:准备记录每轮迭代中的最佳成本。
    costHistory = zeros(MaxIt, 1);
    
    % 主循环:迭代优化过程。
    for it = 1:MaxIt
        
        % 更新种群中的每个个体。
        for i = 1:nPop
            if rand < alpha
                % 领导阶段:向随机选定的个体移动。
                j = randi([1, nPop]);          % 选择一个随机个体作为领导者。
                step = (pop(j).Position - pop(i).Position) * rand; % 计算移动步长。
                newPos = pop(i).Position + step;                 % 新位置。
            else
                % 探索阶段:随机探索搜索空间。
                newPos = pop(i).Position + beta * randn(size(pop(i).Position)); % 新的随机位置。
            end
            
            % 应用边界约束,确保新位置在限制范围内。
            newPos = max(newPos, VarMin);
            newPos = min(newPos, VarMax);
            
            % 评估新位置的成本。
            newCost = CostFunction(newPos);
            
            % 将新成本与当前个体的成本进行比较。
            if newCost < pop(i).Cost
                pop(i).Position = newPos;      % 更新个体的位置。
                pop(i).Cost = newCost;         % 更新个体的成本。
                
                % 检查这是否是新的最佳解。
                if pop(i).Cost < bestSol.Cost
                    bestSol = pop(i);          % 更新最佳解。
                end
            end
        end
        
        % 再次对种群排序,更新所有个体之后。
        [~, SortOrder] = sort([pop.Cost]);
        pop = pop(SortOrder);
        
        % 存储当前迭代中的最佳成本。
        bestCost = bestSol.Cost;
        costHistory(it) = bestCost;
        
    end
    
end

5.算法测试

5.1 测试函数

% 测试函数
% (1)Sphere Function (单峰)
function z = Sphere(x)
    z = sum(x.^2);
end

% (2)Rastrigin Function (多峰)
function z = Rastrigin(x)
    z = 10*length(x) + sum(x.^2 - 10*cos(2*pi*x));
end

% (3)Ackley Function (多峰)
function z = Ackley(x)
    n = length(x);
    z = -20*exp(-0.2*sqrt(sum(x.^2)/n)) - exp(sum(cos(2*pi*x))/n) + 20 + exp(1);
end

% (4)Rosenbrock Function (单峰,但具有挑战性)
function z = Rosenbrock(x)
    z = sum(100*(x(2:end)-x(1:end-1).^2).^2 + (x(1:end-1)-1).^2);
end

% (5)Griewank Function (多峰)
function z = Griewank(x)
    z = sum(x.^2)/4000 - prod(cos(x./sqrt(1:length(x)))) + 1;
end

5.2 可视化结果
在这里插入图片描述

MATLAB完整代码(开源免费自取)

完整代码链接为:链接:https://pan.baidu.com/s/11NxHTnMDCaOsHhruLzK1cA
提取码:9999,可自提,完全免费。有用的话麻烦点个赞和关注,谢谢!
欢迎评论区留言~

本篇文章不靠卖代码赚取收益,麻烦给个点赞和关注,后续还会有开源的免费优化算法及其代码,栓Q!同时如果大家有想要的算法可以在评论区打出,如果有空的话我可以帮忙复现

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值