mcpField
P
pymoo

pymoo

github.com/leonchaox数据与数据库99470 次安装15 周前更新
代码仓库

关于 pymoo

pymoo 是一项介绍 Python 优化框架 pymoo 的技能,适用于处理单目标、多目标及约束优化问题的开发者。它覆盖 Pareto 解搜索、算法定制、结果可视化和多准则决策。

主要功能

  1. 01运行单目标和多目标优化
  2. 02搜索 Pareto 前沿
  3. 03处理约束与混合变量
  4. 04定制遗传算法算子
  5. 05可视化优化结果

适用场景

  1. 01权衡相互冲突的设计目标
  2. 02为约束问题寻找可行解
  3. 03从 Pareto 解集中选取方案

安装

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

$npx skills add https://github.com/leonchaox/qinyan-academic-skills --skill pymoo

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

包含的文件

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

references/
algorithms.md
constraints_mcdm.md
operators.md
problems.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)、基准问题(ZDT、DTLZ)、可自定义遗传算子和多准则决策方法,求解单目标和多目标优化问题。它擅长为目标相互冲突的问题寻找权衡解(帕累托前沿)。

何时使用此技能

在以下情况下应使用此技能:

  • 求解单目标或多目标优化问题
  • 寻找帕累托最优解并分析权衡关系
  • 实现进化算法(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:包含历史记录的算法对象
问题类型

单目标: 一个需要最小化/最大化的目标
多目标: 2-3 个相互冲突的目标 → 帕累托前沿
多目标(4 个及以上): 4 个或更多目标 → 高维帕累托前沿
有约束: 目标 + 不等式/等式约束
动态: 随时间变化的目标或约束

快速入门工作流

工作流 1:单目标优化

适用情况: 优化一个目标函数

步骤:

  1. 定义或选择问题
  2. 选择单目标算法(GA、DE、PSO、CMA-ES)
  3. 配置终止条件
  4. 运行优化
  5. 提取最佳解

示例:

from pymoo.algorithms.soo.nonconvex.ga import GA
from pymoo.problems import get_problem
from pymoo.optimize import minimize

# Built-in problem
problem = get_problem("rastrigin", n_var=10)

# Configure Genetic Algorithm
algorithm = GA(
    pop_size=100,
    eliminate_duplicates=True
)

# Optimize
result = minimize(
    problem,
    algorithm,
    ('n_gen', 200),
    seed=1,
    verbose=True
)

print(f"Best solution: {result.X}")
print(f"Best objective: {result.F[0]}")

参见: scripts/single_objective_example.py,查看完整示例

工作流 2:多目标优化(2-3 个目标)

适用情况: 优化 2-3 个相互冲突的目标,需要帕累托前沿

算法选择: NSGA-II(双目标/三目标优化的标准算法)

步骤:

  1. 定义多目标问题
  2. 配置 NSGA-II
  3. 运行优化以获取帕累托前沿
  4. 可视化权衡关系
  5. 应用决策方法(可选)

示例:

from pymoo.algorithms.moo.nsga2 import NSGA2
from pymoo.problems import get_problem
from pymoo.optimize import minimize
from pymoo.visualization.scatter import Scatter

# Bi-objective benchmark problem
problem = get_problem("zdt1")

# NSGA-II algorithm
algorithm = NSGA2(pop_size=100)

# Optimize
result = minimize(problem, algorithm, ('n_gen', 200), seed=1)

# Visualize Pareto front
plot = Scatter()
plot.add(result.F, label="Obtained Front")
plot.add(problem.pareto_front(), label="True Front", alpha=0.3)
plot.show()

print(f"Found {len(result.F)} Pareto-optimal solutions")

参见: scripts/multi_objective_example.py,查看完整示例

工作流 3:多目标优化(4 个及以上目标)

适用情况: 优化 4 个或更多目标

算法选择: NSGA-III(专为多目标优化设计)

主要区别: 必须提供用于引导种群的参考方向

步骤:

  1. 定义多目标问题
  2. 生成参考方向
  3. 使用参考方向配置 NSGA-III
  4. 运行优化
  5. 使用平行坐标图进行可视化

示例:

from pymoo.algorithms.moo.nsga3 import NSGA3
from pymoo.problems import get_problem
from pymoo.optimize import minimize
from pymoo.util.ref_dirs import get_reference_directions
from pymoo.visualization.pcp import PCP

# Many-objective problem (5 objectives)
problem = get_problem("dtlz2", n_obj=5)

# Generate reference directions (required for NSGA-III)
ref_dirs = get_reference_directions("das-dennis", n_dim=5, n_partitions=12)

# Configure NSGA-III
algorithm = NSGA3(ref_dirs=ref_dirs)

# Optimize
result = minimize(problem, algorithm, ('n_gen', 300), seed=1)

# Visualize with Parallel Coordinates
plot = PCP(labels=[f"f{i+1}" for i in range(5)])
plot.add(result.F, alpha=0.3)
plot.show()

参见: scripts/many_objective_example.py,查看完整示例

工作流 4:自定义问题定义

适用情况: 求解特定领域的优化问题

步骤:

  1. 扩展 ElementwiseProblem 类
  2. 定义包含问题维度和边界的 __init__
  3. 实现用于计算目标(和约束)的 _evaluate 方法
  4. 与任意算法配合使用

无约束示例:

from pymoo.core.problem import ElementwiseProblem
import numpy as np

class MyProblem(ElementwiseProblem):
    def __init__(self):
        super().__init__(
            n_var=2,              # Number of variables
            n_obj=2,              # Number of objectives
            xl=np.array([0, 0]),  # Lower bounds
            xu=np.array([5, 5])   # Upper bounds
        )

    def _evaluate(self, x, out, *args, **kwargs):
        # Define objectives
        f1 = x[0]**2 + x[1]**2
        f2 = (x[0]-1)**2 + (x[1]-1)**2

        out["F"] = [f1, f2]

有约束示例:

class ConstrainedProblem(ElementwiseProblem):
    def __init__(self):
        super().__init__(
            n_var=2,
            n_obj=2,
            n_ieq_constr=2,        # Inequality constraints
            n_eq_constr=1,         # Equality constraints
            xl=np.array([0, 0]),
            xu=np.array([5, 5])
        )

    def _evaluate(self, x, out, *args, **kwargs):
        # Objectives
        out["F"] = [f1, f2]

        # Inequality constraints (g <= 0)
        out["G"] = [g1, g2]

        # Equality constraints (h = 0)
        out["H"] = [h1]

约束表达规则:

  • 不等式:表示为 g(x) <= 0(≤ 0 时可行)
  • 等式:表示为 h(x) = 0(= 0 时可行)
  • 将 g(x) >= b 转换为 -(g(x) - b) <= 0

参见: scripts/custom_problem_example.py,查看完整示例

工作流 5:约束处理

适用场景: 问题存在可行性约束

可选方法:

1. 可行性优先(默认,推荐)

from pymoo.algorithms.moo.nsga2 import NSGA2

# Works automatically with constrained problems
algorithm = NSGA2(pop_size=100)
result = minimize(problem, algorithm, termination)

# Check feasibility
feasible = result.CV[:, 0] == 0  # CV = constraint violation
print(f"Feasible solutions: {np.sum(feasible)}")

2. 惩罚法

from pymoo.constraints.as_penalty import ConstraintsAsPenalty

# Wrap problem to convert constraints to penalties
problem_penalized = ConstraintsAsPenalty(problem, penalty=1e6)

3. 将约束作为目标

from pymoo.constraints.as_obj import ConstraintsAsObjective

# Treat constraint violation as additional objective
problem_with_cv = ConstraintsAsObjective(problem)

4. 专用算法

from pymoo.algorithms.soo.nonconvex.sres import SRES

# SRES has built-in constraint handling
algorithm = SRES()

参见: references/constraints_mcdm.md,了解全面的约束处理指南

工作流 6:根据 Pareto 前沿进行决策

适用场景: 已有 Pareto 前沿,需要选择首选解

步骤:

  1. 运行多目标优化
  2. 将目标归一化到 [0, 1]
  3. 定义偏好权重
  4. 应用 MCDM 方法
  5. 可视化选定的解

使用伪权重的示例:

from pymoo.mcdm.pseudo_weights import PseudoWeights
import numpy as np

# After obtaining result from multi-objective optimization
# Normalize objectives
F_norm = (result.F - result.F.min(axis=0)) / (result.F.max(axis=0) - result.F.min(axis=0))

# Define preferences (must sum to 1)
weights = np.array([0.3, 0.7])  # 30% f1, 70% f2

# Apply decision making
dm = PseudoWeights(weights)
selected_idx = dm.do(F_norm)

# Get selected solution
best_solution = result.X[selected_idx]
best_objectives = result.F[selected_idx]

print(f"Selected solution: {best_solution}")
print(f"Objective values: {best_objectives}")

其他 MCDM 方法:

  • 折中规划:选择最接近理想点的解
  • 膝点:寻找均衡的权衡解
  • 超体积贡献:选择多样性最高的子集

参见:

  • scripts/decision_making_example.py,查看完整示例
  • references/constraints_mcdm.md,了解详细的 MCDM 方法
工作流 7:可视化

根据目标数量选择可视化方式:

2 个目标:散点图

from pymoo.visualization.scatter import Scatter

plot = Scatter(title="Bi-objective Results")
plot.add(result.F, color="blue", alpha=0.7)
plot.show()

3 个目标:3D 散点图

plot = Scatter(title="Tri-objective Results")
plot.add(result.F)  # Automatically renders in 3D
plot.show()

4 个或更多目标:平行坐标图

from pymoo.visualization.pcp import PCP

plot = PCP(
    labels=[f"f{i+1}" for i in range(n_obj)],
    normalize_each_axis=True
)
plot.add(result.F, alpha=0.3)
plot.show()

解的比较:花瓣图

from pymoo.visualization.petal import Petal

plot = Petal(
    bounds=[result.F.min(axis=0), result.F.max(axis=0)],
    labels=["Cost", "Weight", "Efficiency"]
)
plot.add(solution_A, label="Design A")
plot.add(solution_B, label="Design B")
plot.show()

参见: references/visualization.md,了解所有可视化类型及其用法

算法选择指南

单目标问题
算法最适用于主要特点
GA通用场景灵活,可自定义算子
DE连续优化全局搜索能力强
PSO平滑景观收敛速度快
CMA-ES困难或含噪问题自适应
多目标问题(2-3 个目标)
算法最适用于主要特点
NSGA-II标准基准测试快速、可靠、经过充分测试
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)

问题:计算成本较高

  • 减小种群规模
  • 减少迭代代数
  • 使用更简单的算子
  • 启用并行化(如果问题支持)
最佳实践:
  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:约束处理技术和多准则决策方法

参考文档的搜索模式:

  • 算法详情: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

附加说明

安装:

uv pip install pymoo

**依赖项:**NumPy、SciPy、matplotlib、autograd(基于梯度的方法可选)

**文档:**https://pymoo.org/

**版本:**此技能基于 pymoo 0.6.x

常见模式:

  • 自定义问题始终使用 ElementwiseProblem
  • 约束形式为 g(x) <= 0 和 h(x) = 0
  • NSGA-III 需要参考方向
  • 在 MCDM 之前对目标进行归一化
  • 使用恰当的终止条件:('n_gen', N) 或 get_termination("f_tol", tol=0.001)

评论

支持 Markdown