PlatEMO多目标优化工具箱实战:从安装到自定义算法对比

📅 2026/8/26 13:07:06
PlatEMO多目标优化工具箱实战:从安装到自定义算法对比
之前在做一个多目标调度项目时我需要在同一种实验环境下快速对比 NSGA-II、MOEA/D、SPEA2 这类经典进化算法的效果。如果每换一个算法就从头手写一套种群初始化、交叉变异、非支配排序代码工作量非常大而且很容易因为实现细节不一致导致对比结果不可信。后来我把实验统一迁移到了基于 MATLAB 平台的 PlatEMO 工具箱上整个对比流程被大幅简化算法、测试问题、评价指标、可视化和实验数据归档都能在一个框架里完成。这篇文章就来完整拆解 PlatEMO 的使用方法。内容覆盖 PlatEMO 是什么、如何安装、GUI 与命令行两种运行方式、如何自定义测试问题、如何封装自己的算法以及实际使用中最容易踩的坑和工程建议。无论你是刚接触进化多目标优化的新手还是已经写了大量 MATLAB 优化代码的老手只要想提高算法实验效率这篇文章都值得收藏。1. 为什么做多目标优化需要 PlatEMO 这类工具箱1.1 多目标优化问题的基本场景多目标优化问题在工程中非常常见。比如设计一个机械结构既要让重量最轻又要让强度最高比如安排车间生产计划既希望完工时间最短又希望设备负载均衡再比如做投资组合既希望收益最大又希望风险最小。这些问题的共同点是多个目标之间往往互相冲突不存在一个解让所有目标同时达到最优。这种情况下我们需要的不再是单个最优解而是一组“帕累托最优解集”。所谓帕累托最优是指在不牺牲至少一个其他目标的前提下无法进一步改进某个目标的解。多目标进化算法Multi-objective Evolutionary Algorithm, MOEA的核心任务就是在一次运行中搜索出尽可能逼近真实帕累托前沿的一组解。常见的进化多目标优化算法包括基于支配关系NSGA-II、NSGA-III、SPEA2基于分解MOEA/D、MOEA/D-DE基于指标IBEA、SMS-EMOA基于粒子群MOPSO、SMPSO基于代理模型Kriging 辅助算法、昂贵多模态优化算法如果每个算法都要自己实现并且要求实现方式公平统一实验成本非常高。这正是 PlatEMO 这类开源平台存在的意义。1.2 PlatEMO 是什么PlatEMO 的全称是 “Evolutionary multi-objective optimization platform”中文一般叫“进化多目标优化平台”。它是由国内学者开发并在 GitHub 上开源的 MATLAB 工具箱目前已经集成了上百种进化优化算法和几十个经典测试问题同时内置了 IGD、HV、GD、SP 等常用性能评价指标。PlatEMO 的设计目标非常明确让研究者把精力放在算法本身和问题建模上而不是重复造轮子。无论是复现论文实验、对比多种算法还是验证自己提出的新算法都可以直接在 PlatEMO 上进行。用一句话概括PlatEMO 是一个开源、可扩展、算法丰富、指标完善的 MATLAB 多目标优化实验平台。1.3 PlatEMO 解决的核心痛点我在实际使用中觉得 PlatEMO 解决了下面几个核心痛点。第一个痛点是算法实现不统一。很多论文的对比实验不同算法来自不同作者的开源代码数据结构不同、终止条件不同、种群更新逻辑不同对比结果很难公平。PlatEMO 把所有算法统一在一个框架下所有算法共享同一套个体、种群、评估函数和终止条件实验公平性有保障。第二个痛点是测试问题不规范。自己做实验时ZDT、DTLZ、WFG 这些测试问题看起来简单写起来其实很繁琐尤其是 DTLZ 系列的目标函数转换和约束处理。PlatEMO 内置了完整的测试问题库直接选择即可。第三个痛点是实验流程碎片化。跑算法、算指标、画帕累托图、保存数据每个环节都散落在不同脚本里。PlatEMO 把这些流程整合在一起运行一次实验结果、指标、图像、数据文件都能自动输出。2. 环境准备与工具箱安装2.1 MATLAB 版本与系统要求PlatEMO 是纯 MATLAB 工具箱不依赖额外的第三方库。由于它使用了 classdef 面向对象语法、较新的绘图函数和部分统计工具建议使用相对较新的 MATLAB 版本。结合我实际使用和其他用户反馈来看比较稳妥的组合是项目建议操作系统Windows 10/11、Ubuntu 20.04 及以上、macOSMATLAB 版本R2020a 及以上内存建议 8GB 以上工具箱依赖不需要额外安装官方 Toolbox如遇到绘图问题可检查 Statistics Toolbox如果你的 MATLAB 版本比较旧比如 R2016a 之前部分 classdef 语法和函数可能不兼容。这种情况建议先升级 MATLAB或者运行官方示例时留意报错信息。2.2 下载与配置 PlatEMOPlatEMO 是开源项目托管在 GitHub 上。下载方式很简单git clone https://github.com/BIMK/PlatEMO.git如果你不习惯用命令行也可以直接在 GitHub 仓库页面点击 “Code - Download ZIP”下载后解压到本地。下载完成后需要把工具箱目录添加到 MATLAB 搜索路径中。打开 MATLAB在“主页 - 设置路径 - 添加并包含子文件夹”中选择你解压后的 PlatEMO 根目录或者直接在命令行执行addpath(genpath(D:/tools/PlatEMO)); savepath;这里要特别注意路径中不要包含中文或特殊符号。MATLAB 对中文路径的兼容性不太好尤其是涉及文件读写和图窗输出时很容易出现莫名其妙的报错。2.3 PlatEMO 目录结构说明配置好之后建议先浏览一下 PlatEMO 的目录结构。了解每个文件夹的用途后面自定义算法、自定义问题时才能快速定位。典型的 PlatEMO 目录结构如下PlatEMO/ ├── Algorithms/ % 已实现的多目标优化算法 ├── Problems/ % 测试问题集 │ ├── ZDT/ │ ├── DTLZ/ │ ├── WFG/ │ ├── LZ09/ │ └── ... ├── Metrics/ % 性能指标计算函数 ├── Operator/ % 遗传算子、差分算子、粒子群算子等 ├── GUI/ % MATLAB 图形界面相关代码 ├── Data/ % 运行结果数据保存目录 ├── PlatEMO.m % 工具箱入口函数 └── README.md其中Algorithms和Problems是我们最常接触的两个目录。如果你后续要添加自己的算法或测试问题也应该放在这两个目录下而不是去修改工具箱核心代码。3. PlatEMO 核心构成与运行机制在动手跑实验之前有必要先理解 PlatEMO 的核心构成。很多刚接触的人一上来就点 GUI虽然也能跑通但一旦涉及到自定义问题或批量实验就容易迷路。3.1 核心对象与数据结构PlatEMO 建立在一套面向对象的数据结构之上。无论用什么算法、跑什么问题最终都离不开几类核心对象。PROBLEM 类是所有测试问题的基类。它定义了问题的目标个数 M、决策变量个数 D、变量上下界 lower/upper、约束处理方式等。每一次算法评估都是在 PROBLEM 对象上调用目标函数。ALGORITHM 类是所有进化算法的基类。算法的主循环、种群更新、终止判断都封装在 ALGORITHM 子类中。运行一个算法时PlatEMO 会调用该算法对象的mainLoop方法迭代优化。Population / SOLUTION 类表示种群中的一个个体。每个 SOLUTION 保存了决策变量、目标值、约束值、适应度等属性。种群则是 SOLUTION 的集合。用一张简单的流程图来理解 PlatEMO 运行过程选择算法(Algorithm) - 生成初始种群 - 调用问题目标函数(Problem) - 进化操作(交叉、变异、选择) - 更新种群 - 判断是否达到最大评估次数 - 输出结果和指标这个程序和“从头写一遍 NSGA-II”最大的区别在于算法与问题被彻底解耦。算法只负责操作种群问题只负责计算目标值和约束两者通过统一的接口交互。3.2 测试问题、算法与算子之间的关系PlatEMO 把“问题”和“算法”分得非常清楚。问题Problem负责定义搜索空间和目标函数。算法Algorithm负责定义进化策略例如选择谁、交叉谁、变异谁。算子Operator是算法调用的具体操作例如模拟二进制交叉 SBX、多项式变异 PM、差分进化算子 DE。指标Metric负责在实验结束时计算算法性能例如 IGD、HV、GD。这种解耦设计带来的好处是你可以用同一个 NSGA-II 算法去运行 ZDT1、DTLZ2、WFG4 等任意测试问题你也可以把同一个测试问题交给 NSGA-II、MOEA/D、SPEA2 等不同算法运行从而公平地比较算法性能。3.3 PlatEMO 的三种使用方式我通常把 PlatEMO 的使用方式分成三种适合不同场景。方式一GUI 图形界面。在 MATLAB 命令行输入platemo会弹出图形界面。你可以在界面上选择算法、问题、种群大小、目标个数、最大评价次数然后点击运行。这种方式最适合快速验证、现场演示和初学者入门。方式二命令行脚本。通过platemo函数传入键值对参数例如指定算法为NSGAII、问题为ZDT1。这种方式适合批量实验和自动化处理是论文实验的推荐用法。方式三自定义扩展。在Problems中添加自己的问题类或者在Algorithms中添加自己的算法类。这是 PlatEMO 最强大的能力也是进阶使用必须掌握的技能。下面分别展开。4. 实战一使用 GUI 一键运行进化多目标优化算法如果你是第一次接触 PlatEMO建议先通过 GUI 把整个流程跑通。4.1 启动 GUI在 MATLAB 命令行输入platemo正常情况下会出现 PlatEMO 的主界面。界面左侧是算法列表中间是配置参数右侧会显示测试问题信息。在算法列表中你可以看到很多常见算法。例如算法缩写算法全称NSGAIINon-dominated Sorting Genetic Algorithm IIMOEADMulti-objective Evolutionary Algorithm based on DecompositionSPEA2Strength Pareto Evolutionary Algorithm 2MOPSOMulti-objective Particle Swarm OptimizationNSGAIIIReference-point-based NSGA-IIIIBEAIndicator-based Evolutionary Algorithm4.2 选择算法和问题假设我们要运行 NSGA-II 算法在 ZDT1 测试问题上的表现可以这样配置Algorithm选择NSGAIIProblem选择ZDT1N种群大小例如100M目标个数固定为2ZDT1 只有两个目标D决策变量个数默认30maxFE最大函数评估次数例如10000配置完成后点击运行按钮。PlatEMO 会打开一个动态图窗实时显示当前种群在目标空间中的分布情况。运行结束后命令行会输出类似下面的摘要信息NSGAII on ZDT1: IGD : 0.0251 HV : 0.6612这里的 IGD 是反世代距离HV 是超体积指标。IGD 越小说明算法得到的近似前沿越接近真实帕累托前沿HV 越大说明解集在目标空间中的覆盖范围越好。4.3 观察 Pareto 前沿GUI 运行结束后图窗中会同时展示近似帕累托前沿和真实帕累托前沿如果问题提供了参考解集。对 ZDT1 来说真实前沿是一条平滑的凹曲线NSGA-II 的近似解集分布在这条曲线附近。如果你是第一次做多目标优化实验可以多换几个算法看看效果。例如跑一下 MOEA/D、SPEA2、MOPSO对比不同算法的收敛性和分布性差异。4.4 GUI 方式的局限性GUI 方式适合演示和入门但在论文实验场景中并不够用。因为论文实验通常需要多次独立运行取平均结果。固定随机种子保证可复现。批量对比多个算法在多个问题上的表现。自动保存指标数据到文件。这些需求都需要用命令行脚本来完成。5. 实战二命令行方式批量运行算法PlatEMO 的命令行方式非常灵活。通过platemo函数我们可以传入算法、问题、参数和保存路径。5.1 单次命令行运行在 MATLAB 命令行中执行platemo(-algorithm, NSGAII, ... -problem, ZDT1, ... -N, 100, ... -M, 2, ... -D, 30, ... -maxFE, 10000, ... -save, 1);参数说明参数含义-algorithm要运行的算法值为函数句柄-problem测试问题值为函数句柄-N种群规模-M目标个数-D决策变量个数-maxFE最大函数评估次数-save是否保存结果1 表示保存需要注意不同版本的 PlatEMO 中算法名可能有细微差别。比如 NSGA-II 对应的类名可能是NSGAII也可能是NSGA-II。建议运行前先看看PlatEMO/Algorithms目录下的实际文件夹名以实际名为准。5.2 批量对比实验脚本做算法对比实验时我们可以写一个循环脚本把多个算法、多个问题、多次独立运行一次跑完。下面是一个可复制的示例脚本% 文件路径run_comparison.m clear; clc; algorithms {NSGAII, MOEAD, SPEA2}; problems {ZDT1, DTLZ2}; N 100; M 3; D 12; maxFE 30000; runs 10; for p 1:length(problems) for a 1:length(algorithms) for r 1:runs rng(r, twister); platemo(-algorithm, algorithms{a}, ... -problem, problems{p}, ... -N, N, ... -M, M, ... -D, D, ... -maxFE, maxFE, ... -save, 1); end end end这里有一个很重要的细节rng(r, twister)用来固定随机种子。多目标进化算法是随机算法如果不固定随机种子每次运行结果都不一样实验结果无法复现。固定种子后别人用相同的代码和种子可以完全复现你的实验数据这也是学术研究的基本要求。5.3 结果文件说明运行过程中PlatEMO 会在当前工作目录下创建Data文件夹保存每一次运行的.mat结果文件。文件名通常包含算法名、问题名、种群大小、目标个数、决策变量数、最大评估次数等关键信息。加载结果文件的方法data load(Data/NSGAII_ZDT1_100_2_30_10000_1.mat); result data.result;result结构体中通常包含以下字段字段含义algorithm算法名称problem问题名称N种群规模M目标个数D决策变量个数maxFE最大评估次数PF算法求得的近似帕累托前沿TruePF问题的真实帕累托前沿如果问题提供metric本次运行的 IGD、HV 等指标值不同版本的 PlatEMO 字段名可能略有差异你可以先disp(fieldnames(result))查看实际字段。5.4 计算多次运行的平均指标单独一次运行的结果随机性太强通常需要计算多次运行的平均值和标准差。下面是一个计算 IGD 均值和标准差的示例% 文件路径calc_metric.m igd_list zeros(1, runs); for r 1:runs filename sprintf(Data/NSGAII_ZDT1_100_2_30_10000_%d.mat, r); data load(filename); result data.result; igd_list(r) result.metric.IGD; end fprintf(IGD mean: %.4f\n, mean(igd_list)); fprintf(IGD std : %.4f\n, std(igd_list));当然你也可以在循环内直接调用 PlatEMO 内置的指标函数igd_value IGD(result.PF, result.TruePF); hv_value HV(result.PF, result.TruePF);IGD 和 HV 这两个指标一个强调收敛性一个强调分布性和覆盖范围建议在论文实验中同时报告。6. 实战三自定义自己的多目标测试问题PlatEMO 内置了大量测试问题但在实际业务或科研中我们经常需要把自己的目标函数封装成 PlatEMO 可识别的问题。掌握自定义问题是 PlatEMO 进阶使用的关键一步。6.1 理解 PROBLEM 类接口在 PlatEMO 中自定义测试问题需要创建一个继承自PROBLEM的类。这个类至少需要实现两个方法Setting设置问题的基本信息包括目标个数obj.M、决策变量个数obj.D、决策变量下界obj.lower和上界obj.upper。CalObj根据传入的决策变量矩阵计算目标函数值。其中CalObj的输入PopDec是一个大小为N x D的矩阵N 是种群个体数。每一行代表一个个体每一列代表一个决策变量。输出PopObj是一个大小为N x M的矩阵每一行是一个个体在 M 个目标上的目标值。6.2 编写一个简单的双目标问题为了演示方便我们构造一个类似 ZDT1 的双目标最小化问题。真实业务中你只需要替换掉CalObj里的计算公式即可。在PlatEMO/Problems/MyProblem.m中创建如下文件% 文件路径PlatEMO/Problems/MyProblem.m classdef MyProblem PROBLEM methods function Setting(obj) % 目标个数 obj.M 2; % 决策变量个数 obj.D 10; % 所有决策变量的下界 obj.lower zeros(1, obj.D); % 所有决策变量的上界 obj.upper ones(1, obj.D); end function PopObj CalObj(obj, PopDec) % 输入 PopDec: N x D 的决策变量矩阵 % 输出 PopObj: N x M 的目标函数矩阵 x PopDec; % 目标1最小化第一个决策变量 f1 x(:, 1); % 辅助函数 g用于构造目标2 g 1 9 * sum(x(:, 2:end), 2) / (obj.D - 1); % 目标2与 f1 相互冲突的最小化目标 f2 g .* (1 - sqrt(f1 ./ g)); % 拼接为 N x 2 的目标值矩阵 PopObj [f1, f2]; end end end这段代码中obj.M 2告诉 PlatEMO 这是双目标问题。obj.D 10说明有 10 个决策变量。obj.lower和obj.upper定义了搜索空间范围。CalObj中先计算两个目标再用[f1, f2]拼成矩阵返回。注意CalObj内部要使用向量化运算尽量避免使用 for 循环遍历整个种群否则当种群规模和评估次数增大时运行效率会非常低。6.3 在 PlatEMO 中运行自定义问题保存并添加路径后执行platemo(-algorithm, NSGAII, ... -problem, MyProblem, ... -N, 100, ... -M, 2, ... -D, 10, ... -maxFE, 10000, ... -save, 1);运行后结果会像内置问题一样输出指标并保存数据。6.4 自定义约束问题如果你的业务问题带约束比如不能超过某个资源上限、满足某种安全阈值那么还需要在类中实现CalCon方法。function PopCon CalCon(obj, PopDec) % 约束值所有元素必须小于等于0才算满足约束 x PopDec; PopCon x(:, 1) x(:, 2) - 1; endPlatEMO 的约束处理逻辑是PopCon中所有值均小于等于 0 时该个体才被认为是可行解。正值表示约束违反程度。当然这个接口的细节在不同版本中可能有调整。我的建议是直接查看PlatEMO/Problems目录下自带约束问题的实现代码仿照它写自己的约束问题。6.5 关于 PlatEMO 新版本的问题定义差异PlatEMO 从较早的面向对象版本逐渐发展不同版本之间PROBLEM类的定义方式可能会发生变化。有些新版本推荐使用基于函数的接口把一个问题写成一个.m文件中的多个子函数而不是 classdef。遇到这种情况不要慌。判断标准很简单如果你当前版本的Problems目录中自带问题是 classdef 风格就用 classdef。如果自带问题是函数风格就仿照函数风格写。在自定义问题前打开一个自带问题文件看一下永远是最保险的做法。7. 实战四自定义算法并与内置算法对比PlatEMO 更强大的地方在于它允许我们把自己的算法封装成与内置算法完全相同的接口然后直接参与对比。7.1 ALGORITHM 类的最小模板自定义算法需要继承ALGORITHM类并实现mainLoop方法。下面是一个最简算法模板只保留基本的进化循环结构% 文件路径PlatEMO/Algorithms/MyAlgorithm.m classdef MyAlgorithm ALGORITHM methods function mainLoop(obj) % 获取问题信息 problem obj.problem; % 生成初始种群 Population problem.Initialization(obj.N); % 进入进化循环 while obj.notTerminated(Population) % 选择父代 MatingPool obj.Selection(Population); % 生成子代 Offspring obj.Variation(Population(MatingPool)); % 更新种群 Population obj.EnvironmentalSelection(Population, Offspring); end end end end这里面很多方法例如Initialization、Selection、Variation、EnvironmentalSelection、notTerminated都是 PlatEMO 提供给算法类的公共方法。实际编写算法时对于 NSGA-II 这类算法通常需要自行实现非支配排序和拥挤距离计算对于 MOEA/D 这类算法需要维护权重向量和邻域表。建议先从修改内置算法代码开始而不是完全从零写。7.2 继承内置算法做小改动很多时候我们只需要对现有算法做一个小改进比如改进变异算子、加入新的选择压力、改变环境选择策略。这种情况下更推荐继承内置算法然后重写其中个别方法。% 文件路径PlatEMO/Algorithms/MyNSGAII.m classdef MyNSGAII NSGAII methods function mainLoop(obj) % 先调用原算法逻辑 mainLoopNSGAII(obj); % 在自己的改进逻辑中增加新操作 end end end这种方式能最大程度复用 PlatEMO 提供的框架也更容易调试。很多论文里的“改进算法”都是这么实现的而不是把所有代码重写一遍。7.3 运行自定义算法自定义算法保存到Algorithms目录后运行方式和内置算法完全一致platemo(-algorithm, MyNSGAII, ... -problem, ZDT1, ... -N, 100, ... -M, 2, ... -D, 30, ... -maxFE, 10000, ... -save, 1);8. 常见问题与排查思路使用 PlatEMO 的过程中我整理了一些高频问题按“现象、原因、解决思路”整理成下表方便你遇到问题时快速定位。问题现象常见原因解决思路输入platemo报错Undefined function platemo工具箱路径未添加或添加失败重新执行addpath(genpath(PlatEMO路径))并savepath运行算法后没有弹出图形界面工作目录下已有同名数据文件或 GUI 被关闭检查工作目录重新执行platemo算法列表中没有自己想用的算法该算法未下载或算法文件不在Algorithms目录下检查目录必要时从 GitHub 更新自定义问题报错Setting或CalObj方法未定义自定义问题的类签名或方法名写错打开自带问题文件对比接口差异按模板重写运行结果中 IGD 很大最大评估次数过小、种群规模过小或算法未收敛适当增加maxFE和N不同版本运行结果不一致MATLAB 版本或 PlatEMO 版本不同随机数算法差异固定随机种子rng记录版本信息数据文件保存在哪个目录找不到PlatEMO 默认在Data文件夹下保存结果查看当前 MATLAB 工作目录下的Data文件夹绘图乱码或中文显示不正常MATLAB 字体设置或中文路径问题将工作目录和路径改为纯英文检查系统字体排查建议遵循从简到繁的顺序先看路径和文件名再看版本和接口最后检查算法逻辑和数据格式。不要一上来就怀疑代码逻辑70% 的问题出在路径和版本不匹配上。9. 最佳实践与工程建议9.1 实验可复现性进化算法是随机算法实验可复现性是底线。无论做研究还是做项目都要在脚本开头固定随机种子rng(42, twister);如果做多组对比实验每组实验最好使用不同的随机种子并记录种子编号。这样别人复现时可以按照种子编号逐组核对。9.2 多目标优化结果统计不要拿单次运行结果下结论。建议每个算法在每个问题上至少独立运行 10 到 30 次计算指标的平均值和标准差并做显著性检验。PlatEMO 本身可以快速跑完批次实验配合mean、std和 Wilcoxon 秩和检验可以形成比较完整的实验报告。9.3 自定义问题的高效写法CalObj是每次评估都要调用的核心函数性能至关重要。编写时注意使用矩阵运算和向量化操作避免逐行 for 循环。提前预分配输出矩阵。如果目标函数计算量特别大考虑减少maxFE或使用代理模型辅助优化。不要在工作区反复打印调试信息会拖慢大批量实验速度。9.4 版本管理与备份PlatEMO 版本更新较快不同版本的接口差异可能导致旧脚本失效。建议记录使用时的 PlatEMO 版本号。论文复现时尽量锁死工具箱版本。不要直接修改工具箱源码。如果非要改先备份原始文件或者把修改封装成子类。9.5 数据集与问题选择如果你是做真实工程优化建议同时保留一组标准测试问题实验和一组真实问题实验。标准测试问题用于与其他算法公平对比真实问题用于验证工程实用性。PlatEMO 对两者的支持方式是一样的核心区别只在自定义问题上。9.6 关于昂贵优化问题和代理模型如果你的真实问题每次评估都要跑一次仿真软件比如有限元仿真、流体仿真那么一次进化代可能需要几十分钟甚至几天。这种情况下建议结合代理模型辅助优化例如 Kriging 模型配合 EI 准则。PlatEMO 里也包含部分代理模型辅助算法可以优先查看Algorithms目录中是否有相关实现。10. 总结与下一步学习建议这篇文章从零开始梳理了 PlatEMO 的完整使用流程核心内容包括多目标优化问题和 PlatEMO 工具箱的基本概念。PlatEMO 的安装、目录结构和运行机制。GUI 方式和命令行方式运行内置算法。自定义测试问题、自定义算法的方法。常见问题和实验工程建议。按照我的经验学习 PlatEMO 的合理路径是先跑通 GUI再研究命令行批量脚本然后尝试修改内置算法最后把自己的业务问题封装成自定义问题。其中最容易卡住的环节是自定义问题时的接口理解解决方法是“先模仿再创新”直接把自带问题文件打开看一遍仿照着改。如果你接下来想更深入可以从这几个方向继续学习 NSGA-II 和 MOEA/D 的算法原理理解 PlatEMO 内部的选择、交叉、变异、环境选择实现。研究性能指标 IGD、HV、GD 的计算细节理解为什么多目标优化结果必须同时报告收敛性和分布性。尝试把 DTLZ、WFG 等复杂测试问题跑通熟悉高维目标优化。如果业务问题评估代价高深入了解 PlatEMO 与代理模型结合的使用方式。最后给一个非常实用的小建议遇到问题时优先看PlatEMO/Examples或自带问题的源码而不是去网上搜零散资料。PlatEMO 的自带代码本身就是最好的文档官方示例和模板比你看到的任何二手教程都可靠。先把 ZDT1 跑通再把自己的目标函数填进去这个工具箱基本上就吃透了。