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+α∗(Xj−Xi)
其中, 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+α∗(Xj−Xi) - 否则:
执行探索行为: 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!同时如果大家有想要的算法可以在评论区打出,如果有空的话我可以帮忙复现