介绍
HEOA(Harris Hawks Optimization Algorithm,哈里斯鹰优化算法)是一种基于群体智能的优化算法,其灵感来源于哈里斯鹰捕猎兔子的自然行为。该算法主要包括探索阶段和开发阶段,通过模拟鹰的群体行为来动态调整寻优路径。
HEOA算法原理:
探索阶段(Exploration Phase):鹰群会搜索猎物的位置。此阶段哈里斯鹰会根据猎物(即待优化的目标函数)的反馈值,决定靠近还是远离猎物,从而进行全局搜索。利用随机跳跃和 Lévy flight 来在解空间中进行全局探索。
开发阶段(Exploitation Phase):当猎物被围住时,鹰群会进入开发阶段,通过协调行动逐步逼近猎物。此时的搜索将更倾向于局部开发,鹰群通过追踪猎物逐步逼近最优解。
更新公式:哈里斯鹰通过多种策略来更新位置,主要包括平均位置更新、逃逸能量更新等。
HEOA的主要步骤:
初始群体的生成:生成一组随机的鹰群位置(解的候选)。
适应度函数评估:评估每个鹰的适应度。
更新策略选择:根据猎物的逃逸能量和位置,动态选择不同的更新策略。
终止条件:根据设定的迭代次数或达到某种优化准则结束算法。
本文代码
本文代码使用哈里斯鹰优化算法的框架,并以 Rastrigin 函数为优化目标
核心代码
HEOA.m
% HEOA算法实现
function [bestSol, bestFitness, convergence_curve] = HEOA(nPop, maxIter, lb, ub, dim)
% 参数初始化
E0 = 2; % 鹰的能量初始化
bestFitness = inf; % 初始化最优适应度
hawks = lb + (ub-lb) .* rand(nPop, dim); % 初始化鹰群位置
bestSol = zeros(1, dim); % 最优解
fitness = zeros(nPop, 1); % 适应度
convergence_curve = zeros(1, maxIter); % 用于记录每次迭代的最佳适应度
% 主循环
for iter = 1:maxIter
% 计算适应度
for i = 1:nPop
fitness(i) = objective_function(hawks(i, :));
end
% 更新最优解
[minFitness, minIndex] = min(fitness);
if minFitness < bestFitness
bestFitness = minFitness;
bestSol = hawks(minIndex, :);
end
% 记录收敛曲线
convergence_curve(iter) = bestFitness;
% 鹰群位置更新
E = E0 * (1 - iter/maxIter); % 更新鹰的能量
for i = 1:nPop
r = rand(); % 随机数
if abs(E) >= 1 % 探索阶段
q = rand();
else
% 利用平均位置进行探索
x_mean = mean(hawks);
hawks(i, :) = bestSol - r * abs(bestSol - 2 * r * x_mean);
end
else % 开发阶段
if r >= 0.5 && abs(E) < 0.5
% 通过最佳解进行开发
hawks(i, :) = bestSol - E * abs(bestSol - hawks(i, :));
else
end
end
% 边界控制
hawks(i, :) = max(hawks(i, :), lb);
hawks(i, :) = min(hawks(i, :), ub);
end
% 显示迭代信息
fprintf('Iteration %d: Best Fitness = %.6f\n', iter, bestFitness);
end
end
% 目标函数 (例如Rastrigin函数)
function f = objective_function(x)
f = sum(x.^2 - 10 * cos(2 * pi * x) + 10);
end
% Levy飞行分布
function L = levy(dim)
beta = 1.5;
sigma = (gamma(1+beta) * sin(pi*beta/2) / (gamma((1+beta)/2) * beta * 2^((beta-1)/2)))^(1/beta);
u = randn(1, dim) * sigma;
v = randn(1, dim);
L = u ./ abs(v).^(1/beta);
end
RUNHEOA.m
% 主程序 - HEOA算法实现 Harris Hawks Optimization Algorithm with Visualization
% 设置Harris Hawks Optimization算法的参数
nPop = 30; % 种群数量(鹰的数量)
maxIter = 500; % 最大迭代次数
dim = 10; % 问题的维度
lb = -5.12 * ones(1, dim); % 变量的下边界
ub = 5.12 * ones(1, dim); % 变量的上边界
% 调用HEOA算法
[bestSol, bestFitness, convergence_curve] = HEOA(nPop, maxIter, lb, ub, dim);
% 显示优化结果
disp('Best Solution:');
disp(bestSol);
disp('Best Fitness:');
disp(bestFitness);
% 可视化收敛曲线
figure;
plot(convergence_curve, 'LineWidth', 2);
title('Convergence curve');
xlabel('Iteration');
ylabel('Best Fitness');
grid on;
代码说明
主程序部分:
nPop: 设置鹰的种群数量为30。
maxIter: 设定最大迭代次数为500。
dim: 优化问题的维度,这里是10维。
lb 和 ub: 定义了每个维度的上下边界,在这里用Rastrigin函数的标准范围[-5.12, 5.12]。
HEOA主函数:
E0:鹰的初始能量。
hawks: 随机生成的鹰群初始位置。
objective_function: 目标函数为Rastrigin函数,你可以根据需求替换成其他优化问题的目标函数。
边界约束:在每次更新后,确保解在定义的边界内。
Lévy飞行:用于局部搜索的随机跳跃。
效果
Iteration 468: Best Fitness = 12.845356
Iteration 469: Best Fitness = 12.845238
Iteration 470: Best Fitness = 12.844712
Iteration 471: Best Fitness = 12.844712
Iteration 472: Best Fitness = 12.844438
Iteration 473: Best Fitness = 12.838197
Iteration 474: Best Fitness = 12.823426
Iteration 475: Best Fitness = 12.823426
Iteration 476: Best Fitness = 12.823426
Iteration 477: Best Fitness = 12.804359
Iteration 478: Best Fitness = 12.766875
Iteration 479: Best Fitness = 12.757481
Iteration 480: Best Fitness = 12.753654
Iteration 481: Best Fitness = 12.753654
Iteration 482: Best Fitness = 11.383832
Iteration 483: Best Fitness = 9.836875
Iteration 484: Best Fitness = 9.814577
Iteration 485: Best Fitness = 9.806354
Iteration 486: Best Fitness = 9.806328
Iteration 487: Best Fitness = 9.805312
Iteration 488: Best Fitness = 9.805312
Iteration 489: Best Fitness = 9.805310
Iteration 490: Best Fitness = 9.805303
Iteration 491: Best Fitness = 9.805284
Iteration 492: Best Fitness = 9.805280
Iteration 493: Best Fitness = 9.791422
Iteration 494: Best Fitness = 9.781779
Iteration 495: Best Fitness = 9.758012
Iteration 496: Best Fitness = 9.758012
Iteration 497: Best Fitness = 9.758012
Iteration 498: Best Fitness = 9.758009
Iteration 499: Best Fitness = 9.758007
Iteration 500: Best Fitness = 9.758004
Best Solution:
-0.9991 0.9938 0.9346 0.0017 -0.9943 0.9840 -0.9981 -0.0013 -0.9946 0.9211
Best Fitness:
9.7580
完整代码
关注下方公众号,回复HEOA获取完整代码