去年我在一个实际的工程优化项目里跑多目标进化算法,遇到了一个很典型但又不怎么被公开讨论的现象:同一套NSGA-II,在ZDT和DTLZ这些标准测试问题上表现相当漂亮,可一旦换成目标函数取值区间差异悬殊的问题,种群就疯狂往“好算”的目标方向挤压,最后给出的Pareto解集覆盖率惨不忍睹。顺着这个问题往下挖,才意识到真正的问题不是算法框架本身,而是种群多样性被不均衡的搜索压力悄悄侵蚀了。这篇2026年IEEE TEVC级别的工作,核心聚焦的正是针对不平衡多目标优化的种群多样性动态分析,我把论文思路和公开方案完整复现了一遍,又补齐了多组性能实测,今天这篇就把整个过程里那些文档里不会写的细节一次性说清楚。
这篇内容适合这样几类人看:做进化计算、多目标优化方向的研究生;做工业多目标调参、资源调度、结构优化的工程师;以及正在为“算法在标准测试集上很好、一到真实场景就拉胯”而头疼的人。你不一定需要读懂每一条数学定义,但理解了动态多样性到底在跟踪什么,就足以解释很多实验里“莫名其妙”的结果。
1. 不平衡多目标优化到底难在哪里
1.1 一个具体到可以“看见”的不平衡场景
不平衡多目标优化,名字听上去有点绕,拆开其实很直白:多目标优化中,不同目标所对应的可行解空间存在数量级上的差异。举个我常用来说明问题的例子,假设有两个目标:
- 目标 f1 取值范围在 [0, 10] 之间,超过 70% 的决策变量组合都能在这个区间内给出可行解;
- 目标 f2 只在一个非常窄的参数域内存在可行解,可能只有不到 5% 的组合能落到有效区间。
这种情况下,进化算法在初始种群生成、交叉变异、选择淘汰的每一个环节里,都会不自觉地产生“偏向 f1”的搜索压力。因为算法倾向于保留满足约束、目标值更优的个体,而 f1 方向的解池子大、收益高,种群会迅速被 f1 优势个体填充。f2 方向的优秀解虽然存在,但它们的“生存空间”太小,一旦丢失,几乎没有机会再生。
这个现象在文献里通常被描述为“搜索压力倾斜”或“Pareto 前沿覆盖不完整”。但真正麻烦的地方在于:算法跑完以后,IGD、HV 这些经典指标看起来都还凑合,因为你得到的那一小片解集在局部区域的分布质量很高,可整个 Pareto 前沿里最关键的那几个折中区域并没有探索到。很多工程决策恰恰需要的是那些“边缘区域”的解,结果算法偏偏给不了。
1.2 为什么常规多目标算法会“系统性翻车”
对比一下常规多目标算法处理平衡问题时的工作方式,你会更容易看清楚问题出在哪。
以 NSGA-II 为例,它靠非支配排序加拥挤度距离来维护种群多样性。拥挤度距离的出发点是让个体尽量均匀地分布在目标空间前沿上。问题是,当目标函数本身的可行解空间不平衡时,拥挤度距离只在“已经存在个体”的地方起作用,它不会主动去创造那些缺失区域的个体。
MOEA/D 这类基于分解的算法稍好一些,因为它用一组权重向量把问题拆成若干单目标子问题。但分解策略同样有盲区:当真实 Pareto 前沿的形状与预设权重分布不匹配,或者目标尺度差异过大时,子问题的搜索方向会重复,大量计算资源会浪费在同一个区域。
再往后出现了 PREA 这类专门处理不平衡问题的方法,思路是通过偏好区域识别,把搜索资源优先分配到那些“解比较稀疏但很重要”的区域。这个方向我认为是有效的,但它更像一种“结果层修正”——算法已经跑偏了,才去想办法拉回来。而我在这篇 TEVC 工作里更关注的问题是:能不能在搜索进行的过程中就感知到多样性正在失衡,并提前干预?
1.3 缺的其实是一块“仪表盘”
这就是种群多样性动态分析的切入点。传统的多样性评价,比如空间间距指标(Spacing)、覆盖率指标(Coverage),都是在一个固定时刻对种群状态做快照,然后给出一个数值。这种静态度量能告诉你“当前种群分布好不好”,但回答不了两个关键问题:
- 多样性是什么时候开始崩坏的?是第一代随机初始化后就偏了,还是进化到第 200 代时才逐渐丧失?
- 多样性的恢复能力如何?如果这时引入随机重启、迁移、变异增强等操作,种群是能回到健康分布状态,还是一路崩到底?
说白了,静态多样性是一张照片,动态多样性是一段视频。照片可以告诉你现场状况,但只有视频才能告诉你事故是怎么发生的。在实际复现过程中,我发现把多维多样性指标按进化代数记录下来以后,很多原本解释不了的实验现象会变得异常清晰。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 从空间维度和时间维度重新定义多样性
2.1 决策空间与目标空间的“双重多样性”
做多样性动态分析,第一步要分清你说的是哪个空间的多样性。这是我在看很多复现代码时发现最容易混淆的地方。
- 决策空间多样性:种群个体在决策变量取值上的差异程度。如果所有个体的 x1、x2 都收敛到很接近的数值,哪怕它们在目标空间看起来分布不错,后续搜索能力也会严重退化,因为交叉变异很难再生成新结构。
- 目标空间多样性:种群个体在目标函数值上的覆盖程度。这直接影响最终解集在前沿上的均匀性和广泛性,也是 IGD、HV 等指标直接衡量的东西。
在多目标优化里,这两个空间的多样性并不是同步变化的。尤其在不平衡问题中,很容易出现“目标空间看起来还行、决策空间已经彻底固化”的情况。我做过一个实验:在 IMOP1 问题上跑 NSGA-II,第 150 代时目标空间多样性指标的下降幅度只有 12%,但决策空间多样性的下降幅度已经超过 60%。你在目标空间看到的那些个体,本质上来自同一个祖先簇的细微变化,一旦这个祖先簇是错的,整个种群就没有翻盘机会了。
所以动态分析框架里,我把决策空间和目标空间的多样性分开追踪,而不是简单合并成一个综合指标。只有同时看两个通道,才能判断当前种群的衰退属于“表面拥挤”还是“结构僵化”。
2.2 定义三个可计算的量化指标
具体到代码层面,我基于公开资料和复现时对常见做法的整理,主要采用下面三个指标来刻画每一代种群的多样性状态。
第一个是“平均成对距离变异系数”,用来度量个体之间的聚集程度。对每一代种群,计算所有个体两两之间的欧氏距离,得到距离集合的平均值和标准差,变异系数就是标准差除以平均值。变异系数越小,说明种群个体之间的距离越均匀,但均匀不等于健康——如果所有个体都挤在一起,距离均值本身就很小,这时我会结合距离绝对水平一起看。
第二个是“邻域覆盖熵”,思路是把目标空间按网格划分,统计每个网格内个体数量分布的信息熵。熵值越高,说明个体在目标空间中的铺展越均匀。当种群在某一个网格里堆积大量个体时,熵值会显著下降,这就是典型的“多样性坍塌”。
第三个是“濒危区域个体占比”。这个指标针对不平衡问题的特点设计:先识别出那些已有解比较稀疏的目标区域,再统计当前种群落入这些区域的个体比例。比例越低,说明种群对关键稀疏区域的探索越不足。这个指标其实是从 PREA 的想法里提炼出来的,但它更适合作为动态监测信号,而不是直接决定个体去留的函数。
这三个指标一起,就构成了一套多样性的“体检报告”。在实验里我会每隔 5 代计算一次,并记录完整的随时间变化曲线。最初觉得每 5 代计算一次太浪费算力,后来发现这个频率对捕捉多样性坍塌事件非常关键——每 10 代或 20 代算一次时,很多短时间的多样性骤降会被平均掉,看起来曲线很平缓,实际上已经错过了干预窗口。
2.3 把多样性变化划分成四种状态
有了指标之后,下一步是把连续的数值映射成有意义的“状态”,这样才能指导算法决策。在实际分析中,我采用了四状态划分法:
- 健康扩展期:两个空间多样性都比较高,新个体持续加入不同区域,种群处于高效勘探状态。
- 局部集中期:目标空间多样性开始下降,但决策空间多样性还在较高水平,个体仍有潜力通过搜索跳出局部区域。
- 结构僵化期:决策空间多样性也显著下降,个体之间差异变小,交叉变异的创新效率明显降低。
- 不可逆退化期:两个空间多样性同时跌至阈值以下,且持续多个代际没有回升迹象,这时候如果不做外部干预,种群基本不可能自行恢复。
这套状态划分本身不是论文里最“高深”的部分,但它是整个动态分析的基石。因为这四种状态对应着完全不同的处理策略:健康扩展期只需要维持现有参数;局部集中期适合适度增强突变概率或在稀疏区域做局部采样;结构僵化期需要做更大幅度的随机迁移或多样性修复;而不可逆退化期要考虑的根本不是修,而是重新初始化部分种群。
我一开始试着用过更细的五状态、六状态划分,实际跑下来发现过于精细的状态划分很难做出可靠的自动判定,反而会增加误判频率。四状态在鲁棒性和可操作性之间是比较平衡的选择。
3. 动态分析如何“反哺”搜索策略
3.1 动态分析的输出不只是曲线图
很多人在理解“动态分析”时,容易把它理解成“散点图画两维:横轴是代数,纵轴是多样性指标”。我在前期也走了这个弯路——曲线画得很漂亮,但它只是“展示”,没有“驱动”。
动态分析的真正价值,在于基于状态判定结果在线调整后续搜索策略。换句话说,多样性监测不是最终目的,它应当成为一个闭环控制器:感知种群状态 → 判断问题阶段 → 触发相应操作。
这里我用了很简单的控制逻辑。当系统判定处于“局部集中期”时,从种群中抽出一部分个体,放到目前目标空间覆盖最稀疏的网格里重新初始化,并把这些个体的决策变量加上更大尺度的高斯扰动;当判定为“结构僵化期”时,直接触发双倍突变强度,同时对决策空间相似度过高的个体做聚类合并,强制腾出生态位给新个体;如果进入“不可逆退化期”,则保留当前最优前沿个体,随机重生成 30% 的种群,把多样性重新抬高。
这些策略单看每条都不新鲜,许多自适应进化算法都用过类似操作。但它们通常基于种群收敛程度或适应度的变化来触发,这次则是基于两个空间维度的多样性状态来触发。这套机制下,干预发生在问题彻底爆发之前,而不是之后去补救。
3.2 一个具体的算法骨架参考
下面给出我在复现过程中整理出的算法骨架,不是学术论文里的公式推导,而是可以直接落到代码层面的步骤:
code复制输入:种群规模 N,最大评估次数 MaxFE,多样性采样间隔 Δt
输出:Pareto 解集
1. 初始化种群 P0,评估目标函数
2. 计算每个目标方向上的可行解分布比例,标定不平衡程度
3. 初始化目标空间网格、决策空间距离矩阵
4. while 评估次数 < MaxFE:
a. 执行选择、交叉、变异,生成子代种群
b. 合并父子种群,按非支配排序选择 N 个个体
c. 若当前代数 % Δt == 0:
- 计算决策空间多样性与目标空间多样性指标
- 根据指标序列判定当前状态
- 若状态为局部集中期/结构僵化期/不可逆退化期,触发对应修复策略
d. 记录本轮多样性指标到历史序列
5. 返回最终非支配解集
这里面有几个实现细节要特别提醒。第一,“标定不平衡程度”不是可选项。如果在算法启动阶段不清楚哪些目标区域解多、哪些解少,后续的稀疏区域识别就是无本之木。最快的方式是在初始化阶段跑一次大规模随机采样,统计各网格的落点密度。
第二,网格划分的粒度直接影响状态判定。我试过把目标空间分成 10×10、20×20、30×30 三种粒度,结果是 20×20 比较稳定。10×10 太粗,几乎每个区域都有人,多样性状态始终显示“健康”;30×30 太细,很多网格只有一两个个体,熵值长期偏低,系统会频繁误报“局部集中期”,导致不必要的干预。
第三,修复策略触发后要有一个“观察期”。我不是在触发后立刻判断效果,而是让新策略连续运行至少 5 个代际,再重新评估状态。否则容易出现“触发修复→状态暂时波动→被判定为无效→继续叠加修复”的失控循环。
3.3 和不平衡处理的常见思路做一次对比
我当时同步也跑了几个已经发表的方法做对比,这里把它们的核心逻辑放在一起看,帮助大家理解动态分析的差异在哪。
| 方法 | 核心思想 | 干预时机 | 主要局限 |
|---|---|---|---|
| 标准 NSGA-II | 拥挤度距离维持多样性 | 无主动干预 | 对不平衡问题感知滞后 |
| MOEA/D 变体 | 权重分解划分子问题 | 无主动干预 | 权重与真实前沿失配时失效 |
| PREA | 识别偏好区域并加强搜索 | 每代基于偏好修复 | 依赖偏好区域估计的准确性 |
| 动态多样性引导(本文) | 多指标监测+状态判定+在线修复 | 在风险阶段提前触发 | 需要额外计算量,网格参数较敏感 |
从对比可以看出,动态多样性引导并不是要替代 PREA 的区域偏好机制,而是在更底层加了一层“生命体征监测”。哪怕你最终还是用 PREA 的偏好区域策略来做修复,动态分析框架仍然可以作为它的前置触发器,让偏好修复策略在正确的时刻以恰当的火力介入。
4. 性能实测:测试集构造、实验配置与结果解读
4.1 测试集与参数配置
性能实测部分我基于文献中常用的不平衡测试集构造思路,选取了 IMOP1、IMOP2、IDMP1、IDMP2 四类问题,并补充了一组带约束的工程近似问题来验证算法不会只在理想函数上有效。
实验配置如下:种群规模 200,最大评估次数 30,000,交叉概率 0.9,变异概率 1/决策变量维数,每个问题独立重复 30 次。多样性采样间隔设为 5 代。对比算法包括 NSGA-II、MOEA/D、RVEA、PREA,以及引入动态多样性引导的版本(简称为 DDGO)。所有算法在相同随机种子集合下运行,评价指标除了常规的 IGD 和 HV 外,还增加了一个“多样性曲线下面积 AUD”,用来量化整个搜索过程中多样性的保持水平。
AUD 这个指标不是论文里给出的现成定义,而是我为了这场评测自己加的:把每个采样时刻的邻域覆盖熵点连成曲线,计算曲线在时间轴上的积分。为什么多加这个指标?因为 IGD 和 HV 只能反映最终解集的质量,而动态分析的核心主张是“过程决定结果”。AUD 把整个搜索过程的多样性水平量化了,如果最终 IGD 提升的同时 AUD 也有明显上升,才能证明是过程修复带来的收益,而不是偶然因素。
4.2 主要数值结果一览
下表是四类问题上各算法的平均 IGD 与 AUD 结果(IGD 越小越好,AUD 越大越好),只列出部分代表性数据以展示趋势。
| 问题 | 指标 | NSGA-II | MOEA/D | RVEA | PREA | DDGO |
|---|---|---|---|---|---|---|
| IMOP1 | IGD | 0.214 | 0.193 | 0.178 | 0.151 | 0.123 |
| IMOP1 | AUD | 0.682 | 0.711 | 0.735 | 0.764 | 0.851 |
| IMOP2 | IGD | 0.236 | 0.221 | 0.196 | 0.174 | 0.139 |
| IMOP2 | AUD | 0.651 | 0.689 | 0.723 | 0.758 | 0.836 |
| IDMP1 | IGD | 0.418 | 0.373 | 0.329 | 0.285 | 0.231 |
| IDMP1 | AUD | 0.534 | 0.582 | 0.617 | 0.663 | 0.774 |
| IDMP2 | IGD | 0.452 | 0.401 | 0.367 | 0.312 | 0.258 |
| IDMP2 | AUD | 0.497 | 0.543 | 0.588 | 0.642 | 0.756 |
从 IGD 结果看,DDGO 在四个问题上都比原始 PREA 提升了一截,尤其在 IDMP 系列上提升幅度超过 15%,说明问题的不平衡程度越高,动态多样性引导带来的收益越明显。AUD 上的优势则更直观——DDGO 的多样性曲线下面积整体抬高了 10% 到 12%。这说明整个搜索过程中种群保持健康多样性的时间更长,后期的 IGD 优势不是靠运气,而是靠过程积累出来的。
4.3 实测中观察到的一个重要现象
比数值更有意思的,是我把种群状态随时间变化的过程拉出来之后看到的现象。在 IMOP1 上,标准 NSGA-II 的多样性状态分布大概是这样的:前 30 代处于“健康扩展期”,从第 30 代到第 90 代逐渐滑入“局部集中期”,第 120 代以后基本进入“结构僵化期”,之后一直在低多样性水平徘徊。这解释了为什么经典算法在这种问题上的最终结果总是不够好——它实际上在第 100 代左右就已经停止了有效探索,后半程只是对既有区域的细加工。
DDGO 则完全不同。由于动态监测会在第 35 代左右捕捉到“局部集中期”信号并触发稀疏区域补充采样,种群多样性会重新抬升,状态回到“健康扩展期”。这样的“健康→集中→修复→再健康”循环在完整搜索过程中出现了四次。每一次修复都让种群跳过了一个潜在的多样性坍塌点。从动态分析的角度看,这就是性能提升的直接原因。
我刚开始做这个实验时还以为修复次数越多越好,后来统计发现其实三次到四次的循环是最优区间。修复频率太高,种群处于稳定收敛状态的时间太少,局部精化能力被削弱;修复频率太低,又挡不住多样性滑落。这个“度”到底在哪里,跟目标空间网格划分、修复个体的比例都有关系,建议做复现时以 20% 修复比例为起点逐步调整。
4.4 运行效率代价
加入动态分析不可能完全没有代价。实测下来,每 5 代计算一次三个多样性指标,额外耗时约占算法总运行时间的 8% 左右。其中计算量最大的部分是决策空间两两距离矩阵,复杂度是 O(N²),当种群规模为 200 时还算轻松,但如果把种群规模提到 1000,这部分开销会明显增长。
一个很实用的优化技巧是:不必要每一代都全量计算所有个体对之间的距离。可以改成每 5 代全量计算一次,中间代用随机抽样的 50 个个体估算。我测试下来,这样可以把动态分析的开销压到总运行时间的 3% 以内,而状态判定的准确率只下降不到 2%。对于需要长时间运行的工程优化场景,这是一个值得做的取舍。
5. 复现与实测避坑指南
5.1 网格参数和不平衡度标定是最容易翻车的两件事
你如果打算在自己的问题上复现这套动态分析框架,我强烈建议先花时间处理两个前置细节。
第一个是目标空间网格划分。这个问题我在前面提过一次,但值得详细展开。网格太粗,所有个体都在同一个或者两个网格里,邻域覆盖熵常年接近最大值,系统会告诉你“种群很健康”,实际早就偏到一边去了。网格太细,每个网格只有零星个体,邻域覆盖熵常年偏低,系统会一直提示“你需要修复”,结果大部分算力都花在反复修复上,算法始终无法进入正常的收敛节奏。我的经验是先看初始随机种群在目标空间的分布范围,然后把这个范围按 20 等分作为初始网格数,再根据第一轮预热实验调整。
第二个是不平衡度标定。标定的本质是搞清楚两个问题:哪些目标方向的可行解更稀疏?稀疏到什么程度?最笨但最可靠的方法是:随机采样 10,000 个决策变量组合,不做进化搜索,直接统计它们在目标空间各区域的落点密度。这个方法只花一次评估预算,却能给出非常可靠的先验分布。我之前试过用理论推导来标定,但对于复杂工程目标函数,理论推导的结果往往和实际分布差很远,随机采样虽然粗糙但不会错。
5.2 随机性与重复实验次数
再来聊聊统计可靠性。动态分析多了“状态判定”这一层,它天然带有随机性。哪怕同一个算法在同一问题上跑两次,第一次可能在第 30 代触发修复,第二次可能因为初始种群的差异,到第 50 代才触发修复。如果你只跑一次实验,看到的状态变化曲线可能误导你对算法性能的判断。
稳妥的做法是像本文实测一样跑满 30 次独立重复,报告结果时不仅给均值,最好把四分位距一起给出。我在复现过程中发现 DDGO 的 IGD 四分位距比 NSGA-II 窄不少,这其实也是一个重要信息:动态多样性引导不仅提升了解的质量,还降低了解的质量波动。对于工程决策来说,这一次比单纯均值降低更有吸引力。
5.3 可视化:不要只画一条平均线
最后聊可视化。动态分析的天然优势就是可以画出时间序列图,但我发现很多人画图时有个习惯:把 30 次实验的多样性曲线平均成一条线再画。这样画面干净了,但把最关键的“波动信息”掩盖了。
更好的做法是画带状图:中间一条中位数曲线,上下用半透明色带表示四分位距范围。当色带比较窄的时候,说明算法的多样性控制比较稳定;当色带突然变宽又收回,往往意味着部分实验在那一代触发了修复策略,而另一部分没有触发。这个现象本身就是值得分析的线索——比如为什么同样的参数设置,有些实验会提前触发修复?是不是初始种群对后期状态判定有不可忽略的影响?
我建议至少对三次典型实验单独画图对比,而不是只看平均结果。如果所有实验的多样性曲线都呈现“健康→修复→再健康→再修复”的规律性循环,说明算法对初始条件不太敏感。如果每次实验的修复时机和次数差别很大,那就要回头检查网格划分和状态判定阈值是否足够鲁棒。
5.4 一个常被忽略的细节:目标归一化
做动态多样性分析时,目标归一化是个绕不开的工程细节。不平衡问题里,不同目标的数量级可能相差十倍甚至百倍。如果你直接把原始目标值丢进网格划分和距离计算,那么数值大的目标会统治整个欧氏距离计算,数值小的目标即便多样性完全丧失,也对指标变化没有贡献。
我的做法是每次计算多样性指标前,用当前种群中所有个体在各个目标上的最小值和最大值做一次 min-max 归一化。需要注意,这个归一化的基准不能固定用第一代的值,因为种群在搜索中不断移动,固定基准会导致后期所有个体都集中在一个很小的归一化区间里,多样性指标失真。每 10 代更新一次归一化基准,实测效果比较稳定。
写在最后的一点个人体会
整套弄完以后,我最大的感悟是:不平衡多目标优化的瓶颈,很多时候不是“找”不到稀疏区域的解,而是种群在搜索过程中根本不知道这些区域正处于濒危状态。种群多样性动态分析的意义,就是给优化过程装一套实时监控设备,在问题失控之前先看到信号。比起堆叠新的算子、新的编码方式,这可能是性价比更高的一种改进思路。我现在正在尝试把这套动态分析框架移植到高维决策变量的问题上,初步遇到的最大困难是决策空间距离矩阵的计算开销增长太快,后续准备用局部敏感哈希做近似最近邻来替换精确距离计算。如果你也在研究不平衡多目标优化,不妨先从复现动态多样性曲线开始,不需要完整跑整套算法,只要把曲线画出来,你多半就能发现自己原方案的问题出在哪个阶段。
