多目标蚁狮优化算法(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(分布均匀)
posted @ 2025-11-18 11:24  小前端攻城狮  阅读(11)  评论(0)    收藏  举报