1. 为什么做这个算法:从WAA的瓶颈说起
做过多目标优化的人应该都有这种体会:测试函数跑了一堆,IGD、HV指标算得头皮发麻,最后发现算法之间的差距其实都藏在一些很细节的机制设计上。MOWAA这个工作,本质上是把两个耳熟能详的改进策略——高斯扰动和竞争学习——以一种比较自然的方式嵌进了加权平均算法的框架里,然后放到DTLZ1到DTLZ7这组标准测试函数上做了系统性验证,最后又拿到盘式制动器设计这种带约束的工程问题上检验了一把。
先说清楚一个概念:WAA,也就是加权平均算法,核心逻辑非常朴素。它跟遗传算法那种"二进制交叉+多项式变异"的组合不一样,WAA的思路是直接从当前种群中选取若干个体,按权重线性组合生成新个体。你可以把它理解成一种"向量插值"式的搜索:父代个体在决策空间里围出来的那块区域,就是子代可能落位的地方。这种策略在单目标优化里表现得中规中矩,但在多目标场景下就暴露出了问题。
问题出在哪?多目标优化的难点从来不是"找到最优解",而是"找到一组分布均匀、同时逼近真实Pareto前沿的解"。WAA的线性加权组合天然倾向于生成靠近父代几何中心的子代,这就导致两个后果:第一,种群容易朝某个方向聚集,多样性崩掉;第二,如果父代整体都陷在某个局部前沿附近,加权平均生成的子代大概率还是在同一个局部区域里打转,收敛性也上不去。说白了,它没有一种"向外探索"的机制。
高斯扰动和竞争学习就是冲着这两个缺陷去的。高斯扰动给加权平均生成的子代加了一个随机偏移量,相当于在局部搜索和全局探索之间放了一根可调松紧的弹簧;竞争学习则通过个体之间的比较和淘汰,给种群注入持续的进化压力,让"好区域"的个体获得更多繁殖机会。这两个机制单独拎出来都不算新鲜,但组合在一起,得到的MOWAA在DTLZ系列上的表现确实有点意思。
这篇博文我会按这样的顺序展开:先讲清楚MOWAA的三个核心机制以及它们为什么这么设计,再逐个分析DTLZ1到DTLZ7这七个测试函数分别考察算法的什么能力,然后聊盘式制动器设计问题怎么建模、怎么对接算法,最后给出Matlab代码实现的关键细节和我在复现过程中踩过的一些坑。适合对多目标进化算法有一定基础、想自己动手改进算法并做实验对比的读者,也适合正在做工程优化课题、需要找一个靠谱优化器来用的同学。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. MOWAA算法核心机制拆解
2.1 加权平均的重构:如何生成更好的后代
传统的WAA生成子代的方式很直接:从当前种群里随机挑几个父代个体,按权重求和得到子代。但MOWAA在这里做了一个关键调整——父代的选择不是完全随机的,而是按照个体在目标空间的表现来分配权重。表现好的个体在生成子代时拥有更大的发言权,这其实就是一种隐式的精英选择。
具体来说,假设种群规模为N,决策变量维度为D。MOWAA在每代进化中会对种群中的个体按Pareto支配关系和非支配排序结果打分,分数越高的个体被选为父代的概率越大。选出来的一组父代个体记为x1, x2, ..., xk,对应的权重为w1, w2, ..., wk,权重满足归一化条件,然后子代个体通过加权求和生成。
这个"按表现分配权重"的改动,解决了原始WAA的一个致命问题:如果父代的选择完全随机,那么生成子代的期望位置就是种群中心附近,而多目标算法在进化后期恰恰需要的是"沿着前沿均匀铺开",而不是压缩到中心。按表现加权之后,优秀的边缘个体能更频繁地参与繁殖,种群的前沿覆盖能力会好很多。
2.2 高斯扰动:在收敛与多样性之间加一根弹簧
高斯扰动是MOWAA第二个核心组件。子代生成之后,MOWAA不会直接把加权平均的结果放进下一代,而是先对它施加一个高斯扰动。扰动的幅度由一个参数控制,通常设置为随着进化代数逐渐衰减,类似退火思想。公式上可以这样表述:对每一个子代个体的每个维度,叠加一个均值为0、标准差为(代数相关衰减系数 × 当前维度搜索范围)的高斯随机数。
高斯扰动为什么有效?加权平均本质上是一个收缩操作——多个父代个体线性组合之后,子代落在它们几何张成的凸包内部,这会使得种群在进化过程中不断"收缩",最终失去探索能力。高斯扰动相当于在这个收缩过程中加入了一个"膨胀项",让子代有机会跳出父代张成的凸包,去探索周围更广阔的区域。
有意思的地方在于,高斯扰动和权重衰减是配合使用的。进化初期,种群还没有收敛到某个区域,此时不应该有太大扰动,因为会破坏初步的快速收敛;进化中期,扰动强度达到峰值,帮助算法跳出局部前沿;进化后期,种群已经比较接近真实前沿了,此时扰动又会逐渐减小,让算法在局部精修。说实话,我第一次看这个设计的时候觉得有点"又是退火那一套",但实际跑下来发现效果是真的明显。尤其对于DTLZ3这种带有大量局部前沿陷阱的函数,如果没有高斯扰动,MOWAA大概率会在某个局部前沿上彻底丧
