
一句话介绍: 这套工程包含 4 种典型群智能优化算法——蛾火焰优化 MFO、多元宇宙优化 MVO、樽海鞘群优化 SSA 和鲸鱼优化 WOA。程序可以在给定变量范围内不断搜索,使目标函数值尽量减小,并输出找到的最佳变量位置、最佳目标值和收敛过程。
很多优化问题都可以写成:
给定变量 x → 计算目标函数 f(x) → 在允许范围内寻找让 f(x) 尽可能小的 x
如果变量只有一个,而且函数很简单,可以直接求导。
但当:
变量很多;函数非线性;
存在很多局部极值;很难得到解析梯度;
就需要依靠搜索算法不断尝试新的候选解。
这套程序提供 4 种不同的搜索机制:
随机初始化候选解 → 计算目标函数 → 根据各算法规则更新位置 → 保存当前最好解 → 反复迭代 → 输出最优位置和最优目标值
它最大的学习价值是:同一个连续优化框架,可以用 4 种完全不同的自然启发机制实现。
1. 这个工程真正包含哪 4 种算法?
算法 | 中文名称 | 核心搜索思想 |
|---|---|---|
MFO | 蛾火焰优化算法 | 蛾围绕优良“火焰”做对数螺旋搜索 |
MVO | 多元宇宙优化算法 | 白洞/黑洞交换信息,并利用虫洞靠近最优宇宙 |
SSA | 樽海鞘群算法 | 领导者向食物搜索,跟随者形成链式跟随 |
WOA | 鲸鱼优化算法 | 包围猎物、随机搜索与螺旋气泡网捕食 |
每种算法位于自己的文件夹中,并有独立的:main.m
算法核心函数
Get_Functions_details.m
initialization.m
func_plot.m
所以这不是一个统一调用 4 种算法的比较程序,而是 4 套可以分别运行的优化算法 Demo。
2. 程序优化的对象是什么?
四个工程都使用 Get_Functions_details.m 提供测试问题。
用户只需要指定:Function_name = F1~F23
程序就会自动得到:
变量下界 lb、变量上界 ub、问题维数 dim、目标函数 fobj
因此算法本身和具体优化问题是分开的。
整体关系是:
选择测试函数 → 获取搜索范围与维数 → 算法搜索 → 计算 f(x) → 保存较小目标值
如果要换成自己的优化问题,也可以把 fobj 换成自己的目标函数,并重新指定维数和上下界。
3. F1 为什么很适合验证优化算法?
MFO、SSA 和 WOA 的主程序默认都使用:
F1(x) = Σᵢ xᵢ²
当前维数为:dim = 10
每个变量范围:-100 ≤ xᵢ ≤ 100
这是一个非常经典的 Sphere 测试函数。
它的理论最优点非常明确:
x *= [0,0,…,0]
对应:
F1(x) *= 0
所以运行算法以后,可以直接观察:搜索到的最佳目标值能否不断逼近 0。
它的形状比较简单,因此特别适合先验证算法基本搜索过程是否正常。
4. MVO 默认为什么和另外 3 个算法不一样?
MVO 的 main.m 默认设置:Function_name = F17
F17 的源码公式对应经典 Branin 测试函数,搜索范围为:
-5 ≤ x₁ ≤ 10
0 ≤ x₂ ≤ 15
问题维数只有 2。
它的理论全局最小值约为:F17_min ≈ 0.397887
而且存在多个等价全局最优位置。
因此当前工程的默认设置其实是:
算法 | 默认函数 | 维数 | 迭代次数 | 搜索个体 |
MFO | F1 | 10 | 1000 | 30 |
MVO | F17 | 2 | 500 | 60 |
SSA | F1 | 10 | 1000 | 30 |
WOA | F1 | 10 | 500 | 30 |
所以不能直接比较四个默认运行得到的最终函数值。
如果要做公平算法对比,应该先把四个 main.m 的:
Function_name
搜索个体数、最大迭代次数统一。
5. MFO:为什么“蛾围着火焰转”能够搜索最优值?
MFO 中:
蛾 Moth 表示当前候选解;
火焰 Flame 表示当前排序后较优秀的位置。
每轮先计算所有蛾的目标函数值,再按照从小到大排序,让较好的位置成为火焰。
随后蛾沿对数螺旋靠近对应火焰:
X_new = D × exp(b·t) × cos(2πt) + Flame
其中:
D:当前蛾到火焰的距离;
b = 1;
t:随机螺旋参数。
这种更新不是沿一条直线直接冲向最好解,而是:
围绕优秀位置进行螺旋式接近,在靠近和绕行之间保留搜索空间。
6. MFO 为什么会逐渐从“多目标搜索”变成“集中搜索”?
MFO 每一代使用的火焰数量并不固定。
源码按照迭代进度逐渐把火焰数量:
从 N 减少到 1
前期有很多不同火焰,蛾群可以围绕多个优秀区域搜索;
后期火焰数量越来越少,搜索逐渐集中到当前最好的区域。
因此它天然形成:
前期扩大探索 → 后期加强开发
这也是群智能算法中非常重要的“探索与开发平衡”。
7. MVO:怎样用“多元宇宙”寻找最优解?
MVO 把每一个候选解看成一个“宇宙”。
目标函数值在程序中叫:
Inflation rate,膨胀率
程序会先按照目标函数从小到大排序,并始终保存目前最好的宇宙。
MVO 的位置更新主要有两部分:
不同宇宙之间可以交换变量,使较优宇宙中的变量有机会传播到其他候选解。
这种机制负责:让种群共享目前搜索到的有价值信息。
其他宇宙还会围绕当前最佳宇宙进行随机移动。
所以 MVO 既有:
不同个体之间的信息交换
也有:
围绕全局最好位置的局部搜索。
8. MVO 怎样从探索逐渐转向精细搜索?
程序定义两个随迭代变化的量:
WEP = 0.2 + 0.8 × t / T_max
以及:
TDR = 1 - (t / T_max)^(1/6)
其中:
WEP:虫洞存在概率;
TDR:虫洞移动距离比例。
随着迭代进行:
WEP 从 0.2 逐渐增加到 1;
TDR 从较大值逐渐下降到 0。
简单来说:
后期更频繁地围绕最好宇宙搜索,但每次移动距离越来越小。
这使搜索从大范围探索逐渐变成最优区域附近的精细调整。
9. SSA:一群樽海鞘怎样组成搜索链?
SSA 把当前最优解称为:
Food Position,食物位置
种群被分成两部分:
前半部分负责主动围绕食物搜索;
后半部分作为跟随者形成链式移动。
领导部分的位置更新受到一个重要系数控制:
c₁ = 2 × exp[-(4t / T_max)²]
随着迭代次数增加,c₁ 会快速减小。
因此前期领导者可以在食物附近进行较大范围移动,后期移动幅度逐渐收缩。
10. SSA 的跟随者为什么使用“平均位置”?
对于后半部分的樽海鞘,程序采用:
Xᵢ_new = (Xᵢ + Xᵢ₋₁) / 2
也就是说,当前跟随者会向前一个个体靠近。
这样整个种群形成类似链条的结构:
食物位置 ← 前部搜索个体 ← 后部跟随个体
领导者负责产生新的搜索方向,跟随者则让群体信息沿链条传播。
因此 SSA 的核心可以概括成:前部探索 + 后部平滑跟随。
11. WOA:鲸鱼怎样模拟“包围猎物”?
WOA 中当前最好解就是“猎物位置”。
程序定义:
A = 2a·r₁ - a
C = 2r₂
其中:
r₁、r₂:0~1 随机数;
a:从 2 线性下降到 0。
当:
|A| < 1
鲸鱼主要围绕当前最好解移动:
X_new = X_best - A × |C·X_best - X|
这意味着随着 a 逐渐减小,鲸鱼越来越倾向在目前最好的位置附近进行开发搜索。
12. WOA 为什么还需要随机鲸鱼和螺旋运动?
如果算法永远只朝当前最好位置靠近,很容易过早集中到局部最优。
所以 WOA 还设计了两种机制。
当:|A| ≥ 1
程序不再参考当前最好鲸鱼,而是随机选择另一只鲸鱼作为搜索目标。
这主要负责扩大探索范围。
另一种更新方式为:
X_new = D × exp(b·l) × cos(2πl) + X_best
它模拟座头鲸围绕猎物螺旋收缩的捕食过程。
因此 WOA 实际在三种状态之间切换:
随机探索 → 包围最优解 → 螺旋开发
13. 四种算法最核心的区别是什么?
虽然它们最后都在寻找更小的 f(x),但搜索机制完全不同。
算法 | 优秀信息来自哪里 | 位置怎样更新 |
MFO | 排序后的多个火焰 | 围绕火焰做对数螺旋 |
MVO | 最佳宇宙 + 其他宇宙 | 白/黑洞交换 + 虫洞移动 |
SSA | 当前食物位置 | 前部主动搜索 + 后部链式跟随 |
WOA | 当前最好鲸鱼 | 包围、随机个体搜索、螺旋捕食 |
所以这套工程非常适合用来理解:
群智能优化不是只有“随机搜索”,而是通过不同的信息共享和位置更新规则,引导随机搜索逐渐向好解集中。
14. 为什么这些算法不用目标函数梯度?
四个算法调用目标函数时都只需要:
fitness = fobj(position)
也就是说,只要能够输入一组变量并返回一个目标值,就能进行搜索。
程序不需要用户提供:
一阶导数;Hessian 矩阵;解析最优条件。
这使它们特别适合:
目标函数复杂、不可导、难求梯度或者只能够通过仿真得到结果的优化问题。
15. 为什么不能只随机生成很多点,然后选最小值?
纯随机搜索每次产生的新点之间几乎没有经验传递。
而这 4 种算法都会利用历史或群体中的优秀信息:
MFO 利用优秀火焰;
MVO 利用最佳宇宙和宇宙交换;
SSA 利用食物位置和链式结构;
WOA 利用最好鲸鱼和群体 位置。
因此搜索过程不是每一代“重新猜一次”,而是:
根据之前找到的好位置继续调整下一步搜索。
这就是启发式优化相对于纯随机采样的重要区别。
16. F1~F23 有什么作用?
四个算法都配有一套测试函数库。
其中包含不同形式的目标函数,例如:
F1:平方和函数;
F5:具有狭长谷底的非线性函数;
F9:含有大量周期性局部极值;
F10:多峰指数/余弦结构;
F11:平方项与余弦乘积组合;
F17:二维多极值测试函数。
不同测试函数能够考察算法不同能力:
简单单峰函数 → 看收敛速度
多峰函数 → 看跳出局部最优能力
高维函数 → 看维数增加后的搜索能力
所以用户不需要只运行默认 F1 或 F17,可以直接修改 Function_name 在 F1~F23 之间切换。
17. 程序最终会输出什么?
每个算法最终都会给出三个核心结果:
也就是:Best_pos
表示当前找到的最优变量组合。
例如:Best_score
表示把最佳位置代入目标函数后得到的最小值。
记录:每次迭代以后,目前找到的最好目标值。
对于默认 F1:
最佳目标值越接近 0,说明搜索结果越接近理论最优点。
对于 MVO 默认 F17:
最佳值越接近约 0.397887,说明越接近该测试函数的全局最优。
18. 这套程序适合用在哪里?
四种方法结构独立,可以直接比较它们的位置更新机制和收敛逻辑。
F1~F23 已经集成在程序中,可以研究不同算法面对单峰、多峰和不同维数函数时的搜索行为。
只要把 fobj 换成实际工程目标,就可以把搜索变量改成:
控制器参数;结构尺寸;模型超参数;能耗参数;设计变量。
前提是能够给出明确的变量上下界和目标函数。
把 4 个 main.m 的测试函数、种群数量和迭代次数统一以后,可以进一步统计:
最优值;平均值;标准差;多次运行稳定性。
19. 怎么运行?
工程分为 MFO、MVO、SSA、WOA 四个独立目录。
使用某一种算法时:
进入对应算法文件夹;
打开该目录中的 main.m;
设置 Function_name;
直接运行;
查看输出的最佳位置、最佳目标值和收敛过程。
如果要公平比较 4 种算法,建议先统一 Function_name、搜索个体数量和 Max_iteration。
最值得调整的内容其实只有 测试函数、种群规模和迭代次数。这三项分别决定“优化什么问题”“每轮同时搜索多少候选解”和“搜索持续多久”。
20. 一句话看懂这个项目
这是一个 MATLAB 四种群智能连续优化算法合集:MFO 让候选解围绕优秀火焰做螺旋搜索,MVO 通过宇宙交换和虫洞向最佳宇宙靠近,SSA 用领导者与跟随者组成搜索链,WOA 则在随机搜索、包围最优解和螺旋捕食之间切换;四套程序都可以调用 F1~F23 测试函数并输出最佳位置、最佳目标值和收敛过程,但默认实验条件并不统一,因此如果要比较算法优劣,应先把测试函数、种群规模和迭代次数设置一致。