IHAOAVOA:天鹰优化算法与非洲秃鹫优化算法的混合算法(Matlab实现)

一、算法原理概述

1. 算法背景

IHAOAVOA(Improved Hybrid Aquila Optimizer and African Vulture Optimization Algorithm)是一种结合了天鹰优化算法(AO)和非洲秃鹫优化算法(AVOA)优势的混合元启发式算法。该算法旨在解决单一算法可能存在的早熟收敛、局部最优陷阱等问题,通过智能混合策略平衡全局探索和局部开发能力。

2. 核心混合策略

采用自适应权重混合策略,在迭代过程中动态调整两种算法的参与比例:

  • 早期阶段:偏向AO算法,利用其强大的全局探索能力
  • 中期阶段:平衡AO和AVOA,兼顾探索与开发
  • 后期阶段:偏向AVOA算法,加强局部精细搜索

二、Matlab代码实现

1. 主函数:IHAOAVOA

matlab 复制代码
function [Best_score, Best_pos, Convergence_curve] = IHAOAVOA(N, Max_iter, lb, ub, dim, fobj)
% IHAOAVOA: 天鹰优化算法与非洲秃鹫优化算法的混合算法
% 输入参数:
%   N: 种群大小
%   Max_iter: 最大迭代次数
%   lb: 变量下界 (1×dim向量)
%   ub: 变量上界 (1×dim向量)
%   dim: 问题维度
%   fobj: 适应度函数句柄
% 输出参数:
%   Best_score: 最优适应度值
%   Best_pos: 最优解位置
%   Convergence_curve: 收敛曲线

    % 初始化参数
    alpha = 0.1;      % AO算法权重系数
    beta = 0.9;       % AVOA算法权重系数
    w_max = 0.9;      % 最大惯性权重
    w_min = 0.2;      % 最小惯性权重
    
    % 初始化种群
    X = initialization(N, dim, ub, lb);
    
    % 计算初始适应度
    fitness = zeros(1, N);
    for i = 1:N
        fitness(i) = fobj(X(i, :));
    end
    
    % 记录最优解
    [Best_score, index] = min(fitness);
    Best_pos = X(index, :);
    
    % 初始化收敛曲线
    Convergence_curve = zeros(1, Max_iter);
    
    % 主迭代循环
    for iter = 1:Max_iter
        
        % 计算自适应权重
        w = w_max - (w_max - w_min) * (iter / Max_iter);
        
        % 计算混合比例 (动态调整)
        if iter <= Max_iter/3
            % 早期阶段: 偏向AO
            rho_AO = 0.7;
            rho_AVOA = 0.3;
        elseif iter <= 2*Max_iter/3
            % 中期阶段: 平衡
            rho_AO = 0.5;
            rho_AVOA = 0.5;
        else
            % 后期阶段: 偏向AVOA
            rho_AO = 0.3;
            rho_AVOA = 0.7;
        end
        
        % 更新每个个体
        for i = 1:N
            
            % 生成随机数决定使用哪种算法更新
            r = rand();
            
            if r < rho_AO
                % 使用天鹰优化算法(AO)更新策略
                X_new = update_by_AO(X(i, :), Best_pos, iter, Max_iter, dim, lb, ub, alpha);
            else
                % 使用非洲秃鹫优化算法(AVOA)更新策略
                X_new = update_by_AVOA(X(i, :), Best_pos, X, fitness, iter, Max_iter, dim, lb, ub, beta);
            end
            
            % 应用惯性权重
            X_new = w * X_new + (1 - w) * X(i, :);
            
            % 边界处理
            X_new = max(X_new, lb);
            X_new = min(X_new, ub);
            
            % 计算新位置的适应度
            f_new = fobj(X_new);
            
            % 贪婪选择
            if f_new < fitness(i)
                X(i, :) = X_new;
                fitness(i) = f_new;
                
                % 更新全局最优
                if f_new < Best_score
                    Best_score = f_new;
                    Best_pos = X_new;
                end
            end
        end
        
        % 记录当前最优适应度
        Convergence_curve(iter) = Best_score;
        
        % 显示迭代信息
        if mod(iter, 50) == 0
            disp(['迭代次数: ', num2str(iter), ' | 最优适应度: ', num2str(Best_score)]);
        end
    end
end

function X = initialization(N, dim, ub, lb)
% 初始化种群
    X = zeros(N, dim);
    for i = 1:N
        X(i, :) = lb + (ub - lb) .* rand(1, dim);
    end
end

2. 天鹰优化算法(AO)更新函数

matlab 复制代码
function X_new = update_by_AO(X, Best_pos, iter, Max_iter, dim, lb, ub, alpha)
% 天鹰优化算法更新策略
% 参考: Aquila Optimizer: A novel meta-heuristic optimization algorithm

    % 计算探索参数
    Levy = levyFlight(dim);
    
    % 随机选择更新策略
    r1 = rand();
    
    if iter < (0.6 * Max_iter)
        % 扩展探索阶段
        if r1 < 0.5
            % 策略1: 高空俯冲
            X_mean = mean(X, 1);
            X_new = Best_pos .* (1 - iter/Max_iter) + ...
                   (X_mean - Best_pos) .* rand(1, dim);
        else
            % 策略2: 轮廓飞行
            X_rand = lb + (ub - lb) .* rand(1, dim);
            X_new = Best_pos .* Levy + X_rand + ...
                   (rand(1, dim) - 0.5) * 2;
        end
    else
        % 缩小探索与开发阶段
        if r1 < 0.5
            % 策略3: 低速攻击
            X_new = alpha * Best_pos - ...
                   (Best_pos - X) .* rand(1, dim) - ...
                   Levy .* rand(1, dim);
        else
            % 策略4: 行走与抓取
            QF = iter^((2*rand()-1)/(1-Max_iter)^2);
            G2 = 2*rand() - 1;
            G1 = 2*(1 - iter/Max_iter);
            
            X_new = QF * Best_pos - G1 .* X .* rand(1, dim) - ...
                   G2 .* Levy + rand(1, dim) * G1;
        end
    end
end

function L = levyFlight(dim)
% Levy飞行分布
    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);
    step = u ./ (abs(v).^(1/beta));
    L = 0.01 * step;
end

3. 非洲秃鹫优化算法(AVOA)更新函数

matlab 复制代码
function X_new = update_by_AVOA(X, Best_pos, X_all, fitness, iter, Max_iter, dim, lb, ub, beta)
% 非洲秃鹫优化算法更新策略
% 参考: African vulture optimization algorithm: A new nature-inspired metaheuristic algorithm

    % 计算饥饿率
    F = 2 * rand() * (1 - iter/Max_iter);
    
    % 选择最佳秃鹫(领导者)
    [sorted_fitness, sorted_idx] = sort(fitness);
    Best_vulture1 = X_all(sorted_idx(1), :);
    Best_vulture2 = X_all(sorted_idx(2), :);
    
    % 随机选择领导者
    if rand() < 0.5
        R1 = Best_vulture1;
    else
        R1 = Best_vulture2;
    end
    
    % 计算探索与开发参数
    P1 = 0.6;  % 探索概率
    P2 = 0.4;  % 开发概率
    P3 = 0.2;  % 竞争概率
    
    % 随机数决定更新阶段
    rand_R1 = rand();
    rand_R2 = rand();
    rand_R3 = rand();
    
    if abs(F) >= 1
        % 探索阶段
        if rand_R1 < P1
            % 策略1: 随机飞行
            X_new = R1 - abs(2 * rand() * R1 - X) * F;
        else
            % 策略2: 螺旋飞行
            X_new = R1 - F + rand(1, dim) * (ub - lb) * 0.2;
        end
    else
        % 开发阶段
        if abs(F) >= 0.5
            if rand_R2 < P2
                % 策略3: 竞争觅食
                S1 = R1 .* (rand(1, dim) .* X ./ (2*pi)) .* cos(X);
                S2 = R1 .* (rand(1, dim) .* X ./ (2*pi)) .* sin(X);
                X_new = R1 - (S1 + S2);
            else
                % 策略4: 聚集觅食
                A1 = Best_vulture1 - (Best_vulture1 .* X ./ (Best_vulture1 - X.^2)) * F;
                A2 = Best_vulture2 - (Best_vulture2 .* X ./ (Best_vulture2 - X.^2)) * F;
                X_new = (A1 + A2) / 2;
            end
        else
            if rand_R3 < P3
                % 策略5: 激烈竞争
                X_new = abs(2 * rand() * R1 - X) * (F + rand()) - (R1 - X);
            else
                % 策略6: 旋转飞行
                cos_theta = cos(2*pi*rand());
                sin_theta = sin(2*pi*rand());
                X_new = R1 * (F + rand()) * (cos_theta + sin_theta) + X;
            end
        end
    end
    
    % 应用开发系数
    X_new = beta * X_new + (1 - beta) * X;
end

4. 测试函数与主程序

matlab 复制代码
%% IHAOAVOA算法测试主程序
clear all;
close all;
clc;

% 测试函数选择
test_function = 'sphere';  % 可选: 'sphere', 'rastrigin', 'ackley', 'rosenbrock'

% 设置测试函数参数
switch test_function
    case 'sphere'
        % Sphere函数: f(x) = sum(x_i^2)
        fobj = @(x) sum(x.^2);
        dim = 30;          % 维度
        lb = -100 * ones(1, dim);  % 下界
        ub = 100 * ones(1, dim);   % 上界
        global_optimum = 0;        % 全局最优值
        
    case 'rastrigin'
        % Rastrigin函数
        fobj = @(x) 10*dim + sum(x.^2 - 10*cos(2*pi*x));
        dim = 30;
        lb = -5.12 * ones(1, dim);
        ub = 5.12 * ones(1, dim);
        global_optimum = 0;
        
    case 'ackley'
        % Ackley函数
        fobj = @(x) -20*exp(-0.2*sqrt(mean(x.^2))) - ...
                    exp(mean(cos(2*pi*x))) + 20 + exp(1);
        dim = 30;
        lb = -32 * ones(1, dim);
        ub = 32 * ones(1, dim);
        global_optimum = 0;
        
    case 'rosenbrock'
        % Rosenbrock函数
        fobj = @(x) sum(100*(x(2:end) - x(1:end-1).^2).^2 + (1 - x(1:end-1)).^2);
        dim = 30;
        lb = -30 * ones(1, dim);
        ub = 30 * ones(1, dim);
        global_optimum = 0;
end

% 算法参数设置
N = 50;           % 种群大小
Max_iter = 500;   % 最大迭代次数

% 运行IHAOAVOA算法
disp('===========================================');
disp(['测试函数: ', test_function]);
disp(['维度: ', num2str(dim)]);
disp(['种群大小: ', num2str(N)]);
disp(['最大迭代次数: ', num2str(Max_iter)]);
disp('===========================================');

tic;
[Best_score, Best_pos, Convergence_curve] = IHAOAVOA(N, Max_iter, lb, ub, dim, fobj);
runtime = toc;

% 显示结果
disp(' ');
disp('============== 优化结果 ==============');
disp(['最优适应度值: ', num2str(Best_score)]);
disp(['理论最优值: ', num2str(global_optimum)]);
disp(['误差: ', num2str(abs(Best_score - global_optimum))]);
disp(['运行时间: ', num2str(runtime), ' 秒']);
disp('最优解位置 (前10维):');
disp(Best_pos(1:min(10, dim)));

% 绘制收敛曲线
figure('Position', [100, 100, 800, 600]);
plot(1:Max_iter, Convergence_curve, 'b-', 'LineWidth', 2);
hold on;
plot(1:Max_iter, global_optimum * ones(1, Max_iter), 'r--', 'LineWidth', 1.5);
xlabel('迭代次数', 'FontSize', 12);
ylabel('适应度值', 'FontSize', 12);
title(['IHAOAVOA算法收敛曲线 (', test_function, '函数)'], 'FontSize', 14);
legend('IHAOAVOA', '理论最优值', 'Location', 'best');
grid on;

% 绘制搜索空间(仅适用于2维问题)
if dim == 2
    figure('Position', [100, 100, 1000, 400]);
    
    % 子图1: 函数等高线
    subplot(1, 2, 1);
    x1 = linspace(lb(1), ub(1), 100);
    x2 = linspace(lb(2), ub(2), 100);
    [X1, X2] = meshgrid(x1, x2);
    Z = zeros(size(X1));
    for i = 1:size(X1, 1)
        for j = 1:size(X1, 2)
            Z(i, j) = fobj([X1(i, j), X2(i, j)]);
        end
    end
    contour(X1, X2, Z, 50);
    hold on;
    plot(Best_pos(1), Best_pos(2), 'r*', 'MarkerSize', 15, 'LineWidth', 2);
    xlabel('x_1', 'FontSize', 12);
    ylabel('x_2', 'FontSize', 12);
    title('函数等高线与最优解', 'FontSize', 14);
    colorbar;
    grid on;
    
    % 子图2: 3D曲面图
    subplot(1, 2, 2);
    surf(X1, X2, Z, 'EdgeColor', 'none');
    hold on;
    plot3(Best_pos(1), Best_pos(2), Best_score, 'r*', 'MarkerSize', 15, 'LineWidth', 2);
    xlabel('x_1', 'FontSize', 12);
    ylabel('x_2', 'FontSize', 12);
    zlabel('f(x)', 'FontSize', 12);
    title('函数3D曲面图', 'FontSize', 14);
    colorbar;
    grid on;
end

% 性能统计分析(多次运行)
disp(' ');
disp('============== 统计分析 ==============');
num_runs = 10;  % 运行次数
best_scores = zeros(1, num_runs);
run_times = zeros(1, num_runs);

for run = 1:num_runs
    tic;
    [score, ~, ~] = IHAOAVOA(N, Max_iter, lb, ub, dim, fobj);
    runtime_single = toc;
    
    best_scores(run) = score;
    run_times(run) = runtime_single;
    
    disp(['运行 ', num2str(run), '/', num2str(num_runs), ...
          ' | 最优值: ', num2str(score), ...
          ' | 时间: ', num2str(runtime_single), 's']);
end

% 计算统计指标
mean_score = mean(best_scores);
std_score = std(best_scores);
min_score = min(best_scores);
max_score = max(best_scores);
mean_time = mean(run_times);

disp(' ');
disp(['平均最优值: ', num2str(mean_score)]);
disp(['标准差: ', num2str(std_score)]);
disp(['最小值: ', num2str(min_score)]);
disp(['最大值: ', num2str(max_score)]);
disp(['平均运行时间: ', num2str(mean_time), ' 秒']);

% 绘制多次运行结果箱线图
figure('Position', [100, 100, 600, 400]);
subplot(1, 2, 1);
boxplot(best_scores);
hold on;
plot(1, global_optimum, 'r*', 'MarkerSize', 10);
ylabel('适应度值', 'FontSize', 12);
title('多次运行最优值分布', 'FontSize', 14);
grid on;

subplot(1, 2, 2);
boxplot(run_times);
ylabel('运行时间 (秒)', 'FontSize', 12);
title('运行时间分布', 'FontSize', 14);
grid on;

5. 算法比较函数

matlab 复制代码
%% 算法性能比较函数
function compare_algorithms()
% 比较IHAOAVOA与其他优化算法

    % 测试函数设置
    fobj = @(x) sum(x.^2);  % Sphere函数
    dim = 30;
    lb = -100 * ones(1, dim);
    ub = 100 * ones(1, dim);
    
    % 算法参数
    N = 50;
    Max_iter = 200;
    
    % 待比较算法列表
    algorithms = {'IHAOAVOA', 'AO', 'AVOA', 'PSO', 'GWO'};
    num_algorithms = length(algorithms);
    
    % 存储结果
    best_scores_all = zeros(num_algorithms, 1);
    convergence_curves = cell(num_algorithms, 1);
    run_times = zeros(num_algorithms, 1);
    
    % 运行每个算法
    for i = 1:num_algorithms
        alg_name = algorithms{i};
        disp(['正在运行 ', alg_name, ' 算法...']);
        
        tic;
        switch alg_name
            case 'IHAOAVOA'
                [score, ~, curve] = IHAOAVOA(N, Max_iter, lb, ub, dim, fobj);
            case 'AO'
                [score, ~, curve] = Aquila_Optimizer(N, Max_iter, lb, ub, dim, fobj);
            case 'AVOA'
                [score, ~, curve] = African_Vulture_Optimizer(N, Max_iter, lb, ub, dim, fobj);
            case 'PSO'
                [score, ~, curve] = PSO_optimizer(N, Max_iter, lb, ub, dim, fobj);
            case 'GWO'
                [score, ~, curve] = GWO_optimizer(N, Max_iter, lb, ub, dim, fobj);
        end
        runtime = toc;
        
        best_scores_all(i) = score;
        convergence_curves{i} = curve;
        run_times(i) = runtime;
        
        disp([alg_name, ' 完成 | 最优值: ', num2str(score), ...
              ' | 时间: ', num2str(runtime), 's']);
    end
    
    % 绘制比较图
    figure('Position', [100, 100, 1200, 500]);
    
    % 子图1: 收敛曲线比较
    subplot(1, 3, 1);
    colors = {'b-', 'r--', 'g-.', 'm:', 'k-'};
    for i = 1:num_algorithms
        plot(1:Max_iter, convergence_curves{i}, colors{i}, 'LineWidth', 1.5);
        hold on;
    end
    xlabel('迭代次数', 'FontSize', 12);
    ylabel('适应度值', 'FontSize', 12);
    title('收敛曲线比较', 'FontSize', 14);
    legend(algorithms, 'Location', 'best');
    grid on;
    
    % 子图2: 最优值比较
    subplot(1, 3, 2);
    bar(best_scores_all);
    set(gca, 'XTickLabel', algorithms);
    ylabel('最优适应度值', 'FontSize', 12);
    title('最优值比较', 'FontSize', 14);
    grid on;
    
    % 子图3: 运行时间比较
    subplot(1, 3, 3);
    bar(run_times);
    set(gca, 'XTickLabel', algorithms);
    ylabel('运行时间 (秒)', 'FontSize', 12);
    title('运行时间比较', 'FontSize', 14);
    grid on;
    
    % 显示统计结果
    disp(' ');
    disp('============== 算法比较结果 ==============');
    for i = 1:num_algorithms
        disp([algorithms{i}, ': 最优值 = ', num2str(best_scores_all(i)), ...
              ', 时间 = ', num2str(run_times(i)), 's']);
    end
end

三、使用说明

1. 快速开始

  1. 将上述所有函数保存为独立的.m文件
  2. 运行测试主程序
  3. 修改测试函数和参数进行不同问题的优化

2. 自定义问题

matlab 复制代码
% 定义自己的适应度函数
function cost = my_problem(x)
    % x: 决策变量向量
    % 示例: 最小化函数 f(x) = sum(|x|) + product(|x|)
    cost = sum(abs(x)) + prod(abs(x));
end

% 设置参数
dim = 20;
lb = -10 * ones(1, dim);
ub = 10 * ones(1, dim);
N = 40;
Max_iter = 300;

% 运行IHAOAVOA
[Best_score, Best_pos, Convergence_curve] = IHAOAVOA(N, Max_iter, lb, ub, dim, @my_problem);

3. 参数调优建议

  1. 种群大小N:通常20-100,问题越复杂需要越大种群
  2. 最大迭代次数Max_iter:根据问题复杂度设置,通常100-1000
  3. 混合比例:可通过实验调整rho_AO和rho_AVOA
  4. 惯性权重:w_max和w_min影响收敛速度

参考代码 【IHAOAVOA】天鹰优化算法和非洲秃鹫混合优化算法(Matlab代码实现) www.youwenfan.com/contentcst/160703.html

四、算法特点

1. 优势

  • 平衡探索与开发:动态混合策略有效平衡全局搜索和局部精细搜索
  • 避免早熟收敛:两种算法的互补性减少陷入局部最优的风险
  • 适应性强:可处理连续、离散、约束优化问题
  • 并行潜力:两种算法可并行执行,提高效率

2. 应用领域

  • 工程优化设计
  • 机器学习超参数调优
  • 神经网络训练
  • 路径规划问题
  • 资源调度优化

3. 注意事项

  1. 对于高维问题(dim > 100),可能需要增加种群大小和迭代次数
  2. 混合比例参数需要根据具体问题进行调整
  3. 算法性能受随机数种子影响,建议多次运行取平均结果

五、扩展与改进

1. 算法变体

matlab 复制代码
% 变体1: 精英保留策略
function X_new = elite_hybrid_update(X, Best_pos, fitness, iter, Max_iter)
    % 保留前10%的精英个体直接进入下一代
    [~, idx] = sort(fitness);
    elite_num = ceil(0.1 * length(fitness));
    elite_idx = idx(1:elite_num);
    
    % 对非精英个体进行混合更新
    for i = setdiff(1:length(fitness), elite_idx)
        % 混合更新逻辑...
    end
end

% 变体2: 多群协作
function X_new = multi_swarm_hybrid(N_swarms, ...)
    % 多个子群分别执行AO和AVOA
    % 定期交换信息
end

2. 并行化实现

matlab 复制代码
% 使用parfor并行计算适应度
parfor i = 1:N
    fitness(i) = fobj(X(i, :));
end

% 使用GPU加速
if gpuDeviceCount > 0
    X = gpuArray(X);
    % ... GPU计算
end

六、总结

IHAOAVOA算法通过智能混合天鹰优化算法和非洲秃鹫优化算法,实现了更好的优化性能。本Matlab实现提供了完整的算法框架、测试函数和比较工具,用户可根据具体问题进行调整和应用。

相关推荐
t***5444 小时前
有哪些常见的架构设计模式在现代C++中应用
开发语言·c++
人间打气筒(Ada)4 小时前
「码动四季·开源同行」python语言:用户交互
开发语言·python·基本数据类型·注释·变量·常量·文件头
米粒15 小时前
力扣算法刷题 Day 42(股票问题总结)
算法·leetcode·职场和发展
kaikaile19955 小时前
C# 文件编码转换工具
开发语言·c#
沐雪轻挽萤5 小时前
10. C++17新特性-保证的拷贝消除 (Guaranteed Copy Elision / RVO)
开发语言·c++
河阿里6 小时前
Java-JWT令牌技术深度指南
java·开发语言
文静小土豆6 小时前
Java 应用上 K8s 全指南:从部署到治理的生产级实践
java·开发语言·kubernetes
西西弗Sisyphus6 小时前
Python 在终端里彩色打印
开发语言·python·print·彩色打印
浅念-7 小时前
从LeetCode入门位运算:常见技巧与实战题目全解析
数据结构·数据库·c++·笔记·算法·leetcode·牛客