一、摘要
多版本优化器(Multi-Verse Optimizer, MVO)是一种受宇宙学理论启发的群体智能优化算法,由 Seyedali Mirjalili 等人在 2015 年提出。该算法基于物理学中的多重宇宙理论(Multi-Verse Theory),模拟了宇宙之间的通道(虫洞)、引力作用和通胀率等现象,以寻找优化问题的最优解。MVO 主要依赖以下三个关键机制:
- 白洞(White Holes):代表高适应度(低能量)的宇宙,通过轮盘赌选择被低适应度(高能量)的宇宙所吸引,从而交换信息。
- 黑洞(Black Holes):代表低适应度的宇宙,被新的个体替换以保持种群的进化。
- 虫洞(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);
- 可扩展至多目标或约束优化。
适用场景:
- 复杂函数优化;
- 高维特征选择;
- 工程设计问题;
- 机器学习模型调优等。