群体智能优化算法HEOA(Harris Hawks Optimization Algorithm,哈里斯鹰优化算法介绍),Rastrigin函数优化

介绍

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获取完整代码

猜你喜欢

转载自blog.csdn.net/u013531166/article/details/143031214