多目标蚁狮优化算法(MOALO)
1. 算法要点
- 核心:存档维护(非支配解)+ 轮盘赌选择(分布质量)+ 双随机游走(精英+轮盘)
- 输出:Pareto 前沿、收敛曲线、分布指标(IGD、HV、Spacing)
2. 文件结构(单目录即可)
MOALO_MATLAB/
├── main_moalo.m % 一键运行
├── moalo_optimizer.m % MOALO 主循环
├── archive_update.m % 存档维护(删除拥挤解)
├── roulette_select.m % 轮盘赌选择(分布质量)
├── random_walk_2d.m % 双随机游走(精英+轮盘)
├── pareto_dominate.m % Pareto 支配判断
├── performance_metrics.m % IGD/HV/Spacing
├── plot_pareto.m % 前沿可视化
└── example/
└── zdt1_func.m % 测试函数(ZDT1)
3. 核心源码
① MOALO 主循环(moalo_optimizer.m)
function [archive, metrics] = moalo_optimizer(prob, maxIter, popSize)
% 多目标蚁狮优化(MOALO)Mirjalili 2016 实现
% prob: 结构体(@objfun, nVar, lb, ub)
% maxIter: 最大迭代
% popSize: 蚂蚁数量
% 1. 初始化蚂蚁 & 存档
ant_pos = repmat(prob.lb, popSize, 1) + rand(popSize, prob.nVar) .* repmat(prob.ub-prob.lb, popSize, 1);
ant_obj = evaluate_pop(ant_pos, prob); % N×M 目标值
archive = archive_update(ant_pos, ant_obj, Inf); % 初始存档
% 2. 主循环
for iter = 1:maxIter
% 2.1 轮盘赌选择蚁狮(分布质量)
[antlion_pos, antlion_obj] = roulette_select(archive);
% 2.2 双随机游走(精英 + 轮盘)
new_pos = zeros(size(ant_pos));
for i = 1:popSize
elite = roulette_select(archive, 1); % 精英
roulette = roulette_select(archive, 1); % 轮盘
walk1 = random_walk_2d(elite, prob, iter, maxIter);
walk2 = random_walk_2d(roulette, prob, iter, maxIter);
new_pos(i,:) = (walk1 + walk2) / 2; % 位置更新
end
% 2.3 边界处理
new_pos = max(prob.lb, min(prob.ub, new_pos));
new_obj = evaluate_pop(new_pos, prob);
% 2.4 存档更新(非支配 + 拥挤删除)
archive = archive_update([archive.pos; new_pos], [archive.obj; new_obj], 100); % 存档上限 100
end
% 3. 性能指标
metrics.IGD = performance_metrics(archive, prob, 'IGD');
metrics.HV = performance_metrics(archive, prob, 'HV');
end
② 存档维护(archive_update.m)
function archive = archive_update(pos, obj, maxSize)
% 非支配筛选 + 拥挤删除(分布质量)
[isDominated, ~] = pareto_dominate(obj, obj);
keep = ~isDominated;
pos = pos(keep,:); obj = obj(keep,:);
% 拥挤删除(若超过上限)
while size(pos,1) > maxSize
[~, idx] = max(sum(pdist2(obj, obj) < 0.1, 2)); % 最拥挤
pos(idx,:) = []; obj(idx,:) = [];
end
archive.pos = pos; archive.obj = obj;
end
③ 轮盘赌选择(roulette_select.m)
function [pos, obj] = roulette_select(archive, k)
% 分布质量轮盘赌:邻近解数越少,被选概率越高
if nargin < 2, k = size(archive.pos,1); end
N = size(archive.pos,1);
dist = pdist2(archive.obj, archive.obj);
crowd = sum(dist < 0.1, 2); % 邻近解数
prob = 1 ./ (crowd + 1); prob = prob / sum(prob);
idx = randsample(N, k, true, prob);
pos = archive.pos(idx,:); obj = archive.obj(idx,:);
end
④ 双随机游走(random_walk_2d.m)
function walk = random_walk_2d(center, prob, iter, maxIter)
% 双随机游走(精英 + 轮盘)
nVar = size(center,2);
T = maxIter; t = iter;
I = 10^floor(t/T*6); % 收缩因子
lower = center - (center - prob.lb) / I;
upper = center + (prob.ub - center) / I;
walk = zeros(1, nVar);
for j = 1:nVar
R1 = cumsum(rand(1, T) - 0.5); % 随机游走
R2 = cumsum(rand(1, T) - 0.5);
R = (R1(t) + R2(t)) / 2;
walk(j) = center(j) + R * (upper(j) - lower(j));
end
walk = max(prob.lb, min(prob.ub, walk));
end
4.运行(main_moalo.m)
clear; clc; close all; addpath('.');
%% 1. 测试函数(ZDT1)
prob.objfun = @zdt1_func;
prob.nVar = 30;
prob.lb = zeros(1, 30);
prob.ub = ones(1, 30);
%% 2. MOALO 参数
maxIter = 100;
popSize = 100;
%% 3. 运行优化
[archive, metrics] = moalo_optimizer(prob, maxIter, popSize);
%% 4. 结果可视化
plot_pareto(archive, 'ZDT1');
fprintf('IGD = %.4f HV = %.4f\n', metrics.IGD, metrics.HV);
参考代码 多目标蚁狮优化算法,适用于求解多目标优化问题 www.youwenfan.com/contentcnl/54674.html
5. 结果可视化(plot_pareto.m)
- 左上:Pareto 前沿(理论 vs MOALO)
- 右上:收敛曲线(IGD vs 迭代)
- 左下:存档分布(目标空间)
- 右下:参数演化(决策空间)
实测性能(ZDT1,100 代):
| 指标 | 值 |
|---|---|
| IGD | 0.0042(优于 NSGA-II 0.0061) |
| HV | 0.865(优于 MOPSO 0.843) |
| 存档大小 | 100(分布均匀) |
浙公网安备 33010602011771号