群体智能优化算法-多版本优化器(Multi-Verse Optimizer, MVO,含Matlab源代码)

发布于:2025-03-26 ⋅ 阅读:(24) ⋅ 点赞:(0)

一、摘要

多版本优化器(Multi-Verse Optimizer, MVO)是一种受宇宙学理论启发的群体智能优化算法,由 Seyedali Mirjalili 等人在 2015 年提出。该算法基于物理学中的多重宇宙理论(Multi-Verse Theory),模拟了宇宙之间的通道(虫洞)、引力作用和通胀率等现象,以寻找优化问题的最优解。MVO 主要依赖以下三个关键机制:

  1. 白洞(White Holes):代表高适应度(低能量)的宇宙,通过轮盘赌选择被低适应度(高能量)的宇宙所吸引,从而交换信息。
  2. 黑洞(Black Holes):代表低适应度的宇宙,被新的个体替换以保持种群的进化。
  3. 虫洞(Wormholes):用于产生全局随机搜索,以增加算法的多样性。

本文将详细介绍 MVO 的数学模型、关键公式,并对 MATLAB 代码进行逐行详细注释,以帮助读者理解 MVO 的工作原理及其在优化问题中的应用。


二、MVO 算法详细介绍

(1)算法的灵感来源

MVO 受宇宙理论的启发,利用虫洞、白洞、黑洞等物理概念来优化搜索过程:

  • 白洞(White Holes):具有较高适应度的宇宙能够向较低适应度的宇宙传输信息(变量值)。
  • 黑洞(Black Holes):适应度较低的宇宙容易被淘汰,并被新的个体替换。
  • 虫洞(Wormholes):为个体提供随机跳跃能力,以提高算法的全局搜索能力。

(2)数学模型及公式

白洞效应

在 MVO 中,白洞效应允许适应度较低的宇宙从适应度较高的宇宙中获得变量值。使用轮盘赌选择决定低适应度个体从哪个高适应度个体中获取信息:

虫洞扰动机制

虫洞存在概率

旅行距离比率

三、MVO 源代码

1. MVO 主函数(Multi-Verse Optimizer)

function [Best_universe_Inflation_rate,Best_universe,Convergence_curve]=MVO(N,Max_time,lb,ub,dim,fobj)
% MVO 主函数(Multi-Verse Optimizer)
% 输入:
%   N          —— 搜索个体数量(宇宙数量)
%   Max_time   —— 最大迭代次数
%   lb, ub     —— 每个变量的上下界
%   dim        —— 决策变量维度
%   fobj       —— 待优化的目标函数句柄
% 输出:
%   Best_universe_Inflation_rate —— 最优宇宙的适应度值(膨胀率)
%   Best_universe                —— 最优宇宙的位置
%   Convergence_curve            —— 收敛曲线记录每代最优适应度

% 初始化最优宇宙位置和其适应度
Best_universe = zeros(1,dim);
Best_universe_Inflation_rate = inf;

% 初始化宇宙种群位置
Universes = initialization(N,dim,ub,lb);

% 设置虫洞存在概率(WEP)的最大最小值(用于局部扰动)
WEP_Max = 1;
WEP_Min = 0.2;

% 初始化收敛曲线
Convergence_curve = zeros(1,Max_time);

% 初始化迭代计数器
Time = 1;

% 开始主迭代循环
while Time < Max_time+1

    % 计算当前迭代的虫洞存在概率(WEP)—— 逐步递增
    WEP = WEP_Min + Time * ((WEP_Max - WEP_Min) / Max_time);

    % 计算当前的跳跃幅度比例(TDR)—— 逐步递减
    TDR = 1 - ((Time)^(1/6) / (Max_time)^(1/6));

    % 初始化当前所有宇宙的适应度数组
    Inflation_rates = zeros(1,size(Universes,1));

    % 遍历每个宇宙个体,计算其适应度
    for i = 1:size(Universes,1)

        % 越界处理(将超出边界的个体重新拉回到范围内)
        Flag4ub = Universes(i,:) > ub;
        Flag4lb = Universes(i,:) < lb;
        Universes(i,:) = (Universes(i,:) .* (~(Flag4ub + Flag4lb))) + ub.*Flag4ub + lb.*Flag4lb;

        % 计算当前宇宙的适应度(膨胀率)
        Inflation_rates(1,i) = fobj(Universes(i,:));

        % 精英策略:更新全局最优解
        if Inflation_rates(1,i) < Best_universe_Inflation_rate
            Best_universe_Inflation_rate = Inflation_rates(1,i);
            Best_universe = Universes(i,:);
        end
    end

    % 对适应度从小到大排序(最优在前)
    [sorted_Inflation_rates, sorted_indexes] = sort(Inflation_rates);

    % 生成排序后的宇宙位置矩阵
    for newindex = 1:N
        Sorted_universes(newindex,:) = Universes(sorted_indexes(newindex),:);
    end

    % 将适应度归一化(用于轮盘赌选择)
    normalized_sorted_Inflation_rates = normr(sorted_Inflation_rates);

    % 精英保留:将最优宇宙直接保留
    Universes(1,:) = Sorted_universes(1,:);

    % 对其他宇宙位置进行更新
    for i = 2:size(Universes,1)  % 从第2个宇宙开始(第1个为精英)

        for j = 1:size(Universes,2)  % 遍历每一维变量

            r1 = rand();
            % 白洞效应(轮盘赌从优秀个体中继承变量)
            if r1 < normalized_sorted_Inflation_rates(i)
                White_hole_index = RouletteWheelSelection(-sorted_Inflation_rates);
                if White_hole_index == -1
                    White_hole_index = 1;
                end
                % 使用白洞个体的该维值更新当前宇宙
                Universes(i,j) = Sorted_universes(White_hole_index,j);
            end

            % 虫洞机制扰动(在当前最优解附近搜索)
            r2 = rand();
            if r2 < WEP
                r3 = rand();
                if size(lb,2) == 1  % 所有变量共享上下界
                    if r3 < 0.5
                        Universes(i,j) = Best_universe(1,j) + TDR * ((ub - lb) * rand + lb);
                    else
                        Universes(i,j) = Best_universe(1,j) - TDR * ((ub - lb) * rand + lb);
                    end
                else  % 每维变量有不同边界
                    if r3 < 0.5
                        Universes(i,j) = Best_universe(1,j) + TDR * ((ub(j) - lb(j)) * rand + lb(j));
                    else
                        Universes(i,j) = Best_universe(1,j) - TDR * ((ub(j) - lb(j)) * rand + lb(j));
                    end
                end
            end
        end
    end

    % 更新收敛曲线
    Convergence_curve(Time) = Best_universe_Inflation_rate;

    % 增加迭代次数
    Time = Time + 1;
end
end

2. 初始化函数 initialization

function X = initialization(SearchAgents_no, dim, ub, lb)
% 初始化搜索个体的位置(即每个宇宙)

Boundary_no = size(ub,2); % 判断是否是统一边界

% 情况1:统一上下界
if Boundary_no == 1
    X = rand(SearchAgents_no, dim) .* (ub - lb) + lb;
end

% 情况2:每个变量有不同的上下界
if Boundary_no > 1
    for i = 1:dim
        ub_i = ub(i);
        lb_i = lb(i);
        X(:,i) = rand(SearchAgents_no,1) .* (ub_i - lb_i) + lb_i;
    end
end
end

3. 轮盘赌选择函数 RouletteWheelSelection

function choice = RouletteWheelSelection(weights)
% 根据权重数组进行轮盘赌选择,返回选中的索引

accumulation = cumsum(weights);         % 累加权重
p = rand() * accumulation(end);         % 生成随机数
chosen_index = -1;                      % 初始化结果

for index = 1:length(accumulation)
    if accumulation(index) > p
        chosen_index = index;
        break;
    end
end

choice = chosen_index;
end

四、总结

MVO 的优点:

  • 易实现,参数较少;
  • 兼顾全局搜索与局部开发;
  • 动态控制搜索范围(TDR/WEP);
  • 可扩展至多目标或约束优化。

适用场景:

  • 复杂函数优化;
  • 高维特征选择;
  • 工程设计问题;
  • 机器学习模型调优等。

网站公告

今日签到

点亮在社区的每一天
去签到