关于 pymoo
pymoo 是用于 Python 优化任务的框架,面向需要求解单目标、多目标及约束问题的研究者和工程师。它提供统一接口、进化算法、基准问题与决策分析工具。
主要功能
- 01统一的优化调用接口
- 02单目标与多目标算法
- 03自定义问题与遗传算子
- 04约束及混合变量优化
- 05基准问题与结果可视化
适用场景
- 01寻找多目标问题的 Pareto 解
- 02比较 ZDT、DTLZ 等基准算法
- 03为离散与连续变量定义优化问题
- 04从权衡解中进行多准则决策
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ kalarislabs/ research-agent-skills --skill pymoo安装后在 Claude Code 中输入/pymoo确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/algorithms.mdconstraints_mcdm.mdoperators.mdparallelization.mdproblems.mdquick_start_workflows.mdvisualization.mdscripts/custom_problem_example.pydecision_making_example.pymany_objective_example.pymulti_objective_example.pysingle_objective_example.py详细介绍
Pymoo——Python 中的多目标优化
概述
Pymoo 是一个全面的 Python 优化框架,尤其适用于多目标问题。使用先进算法(NSGA-II/III、MOEA/D、SPEA2)、基准问题(ZDT、DTLZ)、可自定义遗传算子和多准则决策方法,求解单目标和多目标优化问题。它擅长为目标相互冲突的问题寻找权衡解(Pareto 前沿)。当前稳定版本:pymoo 0.6.1.6(2025 年 11 月)。
安装
uv pip install pymoo
为确保环境可复现,请固定版本:uv pip install "pymoo==0.6.1.6"。
依赖项: NumPy(自 0.6.1.3 起兼容 2.x)、SciPy、matplotlib(用于可视化)。Autograd 是梯度型功能的可选依赖(自 0.6.1.3 起)。
文档: https://pymoo.org/ — 面向 LLM 的索引:https://pymoo.org/llms.txt
何时使用此技能
在以下情况下应使用此技能:
- 求解单目标或多目标优化问题
- 寻找 Pareto 最优解并分析权衡关系
- 实现进化算法(GA、DE、PSO、NSGA-II/III)
- 处理约束优化问题
- 在标准测试问题(ZDT、DTLZ、WFG)上对算法进行基准测试
- 自定义遗传算子(交叉、变异、选择)
- 可视化高维优化结果
- 根据多个相互竞争的解做出决策
- 处理二进制、离散、连续或混合变量问题
核心概念
统一接口
Pymoo 对所有优化任务都使用一致的 minimize() 函数:
from pymoo.optimize import minimize
result = minimize(
problem, # What to optimize
algorithm, # How to optimize
termination, # When to stop
seed=1,
verbose=True
)
结果对象包含:
result.X:最优解的决策变量result.F:最优解的目标值result.G:约束违反情况(如果存在约束)result.algorithm:包含历史记录的算法对象
问题定义方式
Pymoo 支持三种问题定义方式:
Problem:向量化——_evaluate接收一批解(矩阵)ElementwiseProblem:每次调用处理一个解——推荐用于自定义问题和并行评估FunctionalProblem:将目标和约束定义为独立函数,无需创建子类
问题类型
单目标: 一个需要最小化或最大化的目标
多目标: 2-3 个相互冲突的目标 → Pareto 前沿
多目标(4 个以上): 4 个或更多目标 → 高维 Pareto 前沿
有约束: 目标 + 不等式/等式约束
混合变量: 一个问题中包含连续、整数、二进制和类别变量
动态: 目标或约束随时间变化
快速入门工作流
references/quick_start_workflows.md 中提供了九个可运行的工作流:
| # | 工作流 | 适用场景 |
|---|---|---|
| 1 | 单目标优化 | 一个目标,使用 GA 或 DE |
| 2 | 多目标(2-3 个目标) | 使用 NSGA-II 和 Pareto 前沿 |
| 3 | 多目标(4 个以上目标) | 使用 NSGA-III 或参考方向方法 |
| 4 | 自定义问题定义 | 派生 Problem / ElementwiseProblem 子类 |
| 5 | 约束处理 | 不等式和等式约束 |
| 6 | 基于 Pareto 前沿进行决策 | 标量化和 MCDM 选择 |
| 7 | 可视化 | 散点图、PCP、radviz 和热图视图 |
| 8 | 并行评估 | 对计算开销大的目标使用线程、进程或 Dask |
| 9 | 混合变量优化 | 整数、二进制和类别变量 |
算法选择指南
单目标问题
| 算法 | 最适用于 | 主要特性 |
|---|---|---|
| GA | 通用场景 | 灵活,可自定义算子 |
| DE | 连续优化 | 全局搜索能力强 |
| PSO | 平滑的搜索空间 | 收敛速度快 |
| CMA-ES | 困难/含噪问题 | 自适应 |
多目标问题(2-3 个目标)
| 算法 | 最适用场景 | 主要特性 |
|---|---|---|
| NSGA-II | 标准基准测试 | 快速、可靠、经过充分测试 |
| SPEA2 | 基于档案的多目标优化 | 基于强度的适应度、外部档案 |
| R-NSGA-II | 偏好区域 | 参考点引导 |
| MOEA/D | 可分解问题 | 标量化方法 |
多目标问题(4 个或更多目标)
| 算法 | 最适用场景 | 主要特性 |
|---|---|---|
| NSGA-III | 4-15 个目标 | 基于参考方向 |
| RVEA | 自适应搜索 | 参考向量演化 |
| AGE-MOEA | 复杂景观 | 自适应几何 |
约束问题
| 方法 | 算法 | 适用场景 |
|---|---|---|
| 优先满足可行性 | 任意算法 | 可行区域较大 |
| 专用方法 | SRES、ISRES | 约束繁多 |
| 惩罚法 | GA + 惩罚 | 与算法兼容 |
参见: references/algorithms.md,了解全面的算法参考
基准测试问题
快速访问问题:
from pymoo.problems import get_problem
# Single-objective
problem = get_problem("rastrigin", n_var=10)
problem = get_problem("rosenbrock", n_var=10)
# Multi-objective
problem = get_problem("zdt1") # Convex front
problem = get_problem("zdt2") # Non-convex front
problem = get_problem("zdt3") # Disconnected front
# Many-objective
problem = get_problem("dtlz2", n_obj=5, n_var=12)
problem = get_problem("dtlz7", n_obj=4)
参见: references/problems.md,了解完整的测试问题参考
遗传算子自定义
标准算子配置:
from pymoo.algorithms.soo.nonconvex.ga import GA
from pymoo.operators.crossover.sbx import SBX
from pymoo.operators.mutation.pm import PM
algorithm = GA(
pop_size=100,
crossover=SBX(prob=0.9, eta=15),
mutation=PM(eta=20),
eliminate_duplicates=True
)
按变量类型选择算子:
连续变量:
- 交叉:SBX(模拟二进制交叉)
- 变异:PM(多项式变异)
二进制变量:
- 交叉:TwoPointCrossover、UniformCrossover
- 变异:BitflipMutation
排列(TSP、调度):
- 交叉:OrderCrossover(OX)
- 变异:InversionMutation
参见: references/operators.md,了解全面的算子参考
性能与故障排除
常见问题及解决方案:
问题:算法未能收敛
- 增大种群规模
- 增加迭代代数
- 检查问题是否为多峰问题(尝试不同算法)
- 确认约束的表述正确
问题:帕累托前沿分布不理想
- 对于 NSGA-III:调整参考方向
- 增大种群规模
- 检查是否已消除重复项
- 确认问题已进行缩放
问题:可行解较少
- 使用将约束作为目标的方法
- 应用修复算子
- 对于约束问题,尝试 SRES/ISRES
- 检查约束表述(应为 g <= 0)
问题:计算成本高
- 减小种群规模
- 减少迭代代数
- 使用更简单的算子
- 通过
elementwise_runner启用并行评估(参见工作流 8)
最佳实践:
- 对目标进行归一化,尤其是在尺度差异显著时
- 设置随机种子,确保结果可复现
- 保存历史记录以分析收敛情况:
save_history=True - 可视化结果以了解解的质量
- 在可用时与真实帕累托前沿进行比较
- 使用适当的终止条件(迭代代数、评估次数、容差)
- 根据问题特性调整算子参数
资源
此技能包含全面的参考文档和可执行示例:
references/
深入了解所需的详细文档:
- algorithms.md:完整的算法参考,包含参数、用法和选择指南
- problems.md:基准测试问题(ZDT、DTLZ、WFG)及其特性
- operators.md:遗传算子(采样、选择、交叉、变异)及其配置
- visualization.md:所有可视化类型的示例和选择指南
- constraints_mcdm.md:约束处理技术和多准则决策方法
- parallelization.md:使用 StarmapParallelization 和 JoblibParallelization 进行并行评估
参考文档的搜索模式:
- 算法详情:
grep -r "NSGA-II\|NSGA-III\|MOEA/D" references/ - 约束方法:
grep -r "Feasibility First\|Penalty\|Repair" references/ - 可视化类型:
grep -r "Scatter\|PCP\|Petal" references/
scripts/
展示常见工作流的可执行示例:
- single_objective_example.py:使用 GA 进行基本的单目标优化
- multi_objective_example.py:使用 NSGA-II 进行多目标优化和可视化
- many_objective_example.py:使用 NSGA-III 进行多目标优化和参考方向设置
- custom_problem_example.py:定义自定义问题(有约束和无约束)
- decision_making_example.py:基于不同偏好进行多准则决策
运行示例:
python3 scripts/single_objective_example.py
python3 scripts/multi_objective_example.py
python3 scripts/many_objective_example.py
python3 scripts/custom_problem_example.py
python3 scripts/decision_making_example.py
附加说明
常见模式:
- 使用
ElementwiseProblem定义自定义问题(或使用FunctionalProblem进行基于函数的定义) - 对混合变量问题使用带类型变量的
vars字典 - 约束表示为
g(x) <= 0和h(x) = 0 - NSGA-III 需要参考方向
- 在 MCDM 之前对目标进行归一化
- 使用合适的终止条件:
('n_gen', N)或get_termination("f_tol", tol=0.001)