mcpField
P
pymoo

pymoo

github.com/kalarislabs数据与数据库7746 次安装4 天前更新
代码仓库

关于 pymoo

pymoo 是用于 Python 优化任务的框架,面向需要求解单目标、多目标及约束问题的研究者和工程师。它提供统一接口、进化算法、基准问题与决策分析工具。

主要功能

  1. 01统一的优化调用接口
  2. 02单目标与多目标算法
  3. 03自定义问题与遗传算子
  4. 04约束及混合变量优化
  5. 05基准问题与结果可视化

适用场景

  1. 01寻找多目标问题的 Pareto 解
  2. 02比较 ZDT、DTLZ 等基准算法
  3. 03为离散与连续变量定义优化问题
  4. 04从权衡解中进行多准则决策

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/kalarislabs/research-agent-skills --skill pymoo

安装后在 Claude Code 中输入/pymoo确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
algorithms.md
constraints_mcdm.md
operators.md
parallelization.md
problems.md
quick_start_workflows.md
visualization.md
scripts/
custom_problem_example.py
decision_making_example.py
many_objective_example.py
multi_objective_example.py
single_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-III4-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)
最佳实践:
  1. 对目标进行归一化,尤其是在尺度差异显著时
  2. 设置随机种子,确保结果可复现
  3. 保存历史记录以分析收敛情况:save_history=True
  4. 可视化结果以了解解的质量
  5. 在可用时与真实帕累托前沿进行比较
  6. 使用适当的终止条件(迭代代数、评估次数、容差)
  7. 根据问题特性调整算子参数

资源

此技能包含全面的参考文档和可执行示例:

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)

评论

支持 Markdown