一、算法原理概述
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. 快速开始
- 将上述所有函数保存为独立的.m文件
- 运行测试主程序
- 修改测试函数和参数进行不同问题的优化
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. 参数调优建议
- 种群大小N:通常20-100,问题越复杂需要越大种群
- 最大迭代次数Max_iter:根据问题复杂度设置,通常100-1000
- 混合比例:可通过实验调整rho_AO和rho_AVOA
- 惯性权重:w_max和w_min影响收敛速度
参考代码 【IHAOAVOA】天鹰优化算法和非洲秃鹫混合优化算法(Matlab代码实现) www.youwenfan.com/contentcst/160703.html
四、算法特点
1. 优势
- 平衡探索与开发:动态混合策略有效平衡全局搜索和局部精细搜索
- 避免早熟收敛:两种算法的互补性减少陷入局部最优的风险
- 适应性强:可处理连续、离散、约束优化问题
- 并行潜力:两种算法可并行执行,提高效率
2. 应用领域
- 工程优化设计
- 机器学习超参数调优
- 神经网络训练
- 路径规划问题
- 资源调度优化
3. 注意事项
- 对于高维问题(dim > 100),可能需要增加种群大小和迭代次数
- 混合比例参数需要根据具体问题进行调整
- 算法性能受随机数种子影响,建议多次运行取平均结果
五、扩展与改进
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实现提供了完整的算法框架、测试函数和比较工具,用户可根据具体问题进行调整和应用。