ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

pymoo 九大快速上手工作流实战指南:从单目标优化到混合变量优化的完整路线图

pymoo 九大快速上手工作流实战指南:从单目标优化到混合变量优化的完整路线图 pymoo 九大快速上手工作流实战指南从单目标优化到混合变量优化的完整路线图【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000 scientists worldwide. 165 ready-to-use validated skills plus 100 scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills导读本文以开源仓库 scientific-agent-skills 中 pymoo 技能 的 快速上手工作流文档 为主体系统讲解 pymoo 中九个可立即运行的工作流单目标、多目标2~3 个目标、超多目标4 个及以上、自定义问题定义、约束处理、Pareto 前沿决策、可视化、并行评估与混合变量优化。读者学完后将能独立完成从定义问题—选择算法—配置终止条件—运行优化—分析结果的完整闭环并在工程设计与科学优化场景中直接复用仓库提供的 5 个可执行脚本。环境准备与统一接口本技能要求 Python 3.10 与 pymoo当前稳定版为 0.6.1.6安装方式见 SKILL.mduv pip install pymoo如需可复现环境可锁定版本uv pip install pymoo0.6.1.6。依赖项包括 NumPy0.6.1.3 起兼容 NumPy 2.x、SciPy可选 matplotlib可视化、autograd梯度相关特性、joblibJoblibParallelization。pymoo 的核心哲学是统一的minimize()接口——所有优化任务无论单目标还是多目标都通过同一函数完成from pymoo.optimize import minimize result minimize( problem, # What to optimize algorithm, # How to optimize termination, # When to stop seed1, verboseTrue )从 SKILL.md 可知result对象包含result.X最优解的决策变量、result.F最优解的目标值、result.G约束违反量若有约束、result.algorithm带完整历史的算法对象。终止条件既可以直接传(n_gen, N)这种元组也可以用get_termination(f_tol, tol0.001)基于收敛容差终止。工作流一单目标优化适用场景只有一个目标函数需要最小化/最大化。标准流程定义或选择问题 → 选择单目标算法GA、DE、PSO、CMA-ES→ 配置终止条件 → 运行优化 → 提取最优解。最小示例Rastrigin 函数10 维变量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_var10) # Configure Genetic Algorithm algorithm GA( pop_size100, eliminate_duplicatesTrue ) # Optimize result minimize( problem, algorithm, (n_gen, 200), seed1, verboseTrue ) print(fBest solution: {result.X}) print(fBest objective: {result.F[0]})仓库中的 single_objective_example.py 给出了更完整的可运行版本它使用 Sphere 函数平方和作为测试问题并显式配置了算子组合——FloatRandomSampling()采样、SBX(prob0.9, eta15)模拟二进制交叉、PM(eta20)多项式变异终止条件改为get_termination(n_gen, 100)。运行结束后该脚本还会打印result.algorithm.n_gen代数与result.algorithm.evaluator.n_eval函数评估次数两个收敛诊断指标python3 skills/pymoo/scripts/single_objective_example.py算法选型速查详见 references/algorithms.md 与 SKILL.md 的算法选择指南算法最适合特点GA通用场景算子可自由定制灵活DE连续优化全局搜索能力强PSO平滑目标景观收敛快CMA-ES困难/含噪问题自适应性强的协方差矩阵进化策略工作流二多目标优化2~3 个目标适用场景2~3 个相互冲突的目标需要得到 Pareto 前沿。算法选择NSGA-II 是双/三目标问题的标准算法。流程定义多目标问题 → 配置 NSGA-II → 运行以获得 Pareto 前沿 → 可视化权衡 →可选决策分析。示例ZDT1 双目标基准问题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_size100) # Optimize result minimize(problem, algorithm, (n_gen, 200), seed1) # Visualize Pareto front plot Scatter() plot.add(result.F, labelObtained Front) plot.add(problem.pareto_front(), labelTrue Front, alpha0.3) plot.show() print(fFound {len(result.F)} Pareto-optimal solutions)multi_objective_example.py 补充了两个关键实践一是给 NSGA-II 显式加上eliminate_duplicatesTrue避免种群中产生基因型重复的个体二是通过problem.pareto_front()获取 ZDT1 的真实 Pareto 前沿以红色散点算法结果与黑色半透明散点真实前沿叠加对比直接验证算法收敛质量。脚本还会输出前沿解数量、代数与评估次数并打印前 5 个解。从 problems.md 的角度看ZDT 系列是典型的双目标基准zdt1为凸前沿、zdt2为非凸前沿、zdt3为不连续前沿可用于测试算法在不同前沿几何下的表现。工作流三超多目标优化4 个及以上目标适用场景优化目标数 ≥ 4。算法选择NSGA-III 专为超多目标设计。关键区别必须提供**参考方向reference directions**来引导种群分布——这是 NSGA-III 与 NSGA-II 的本质差异。流程定义超多目标问题 → 生成参考方向 → 配置 NSGA-III → 运行优化 → 用平行坐标图PCP可视化。示例DTLZ25 目标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_obj5) # Generate reference directions (required for NSGA-III) ref_dirs get_reference_directions(das-dennis, 5, n_partitions12) # n_dim is positional # Configure NSGA-III algorithm NSGA3(ref_dirsref_dirs) # Optimize result minimize(problem, algorithm, (n_gen, 300), seed1) # Visualize with Parallel Coordinates plot PCP(labels[ff{i1} for i in range(5)]) plot.add(result.F, alpha0.3) plot.show()这里有一个非常容易踩的坑仓库源码 many_objective_example.py 专门用注释强调get_reference_directions的第一个位置参数是维度数 n_dim如果以n_obj关键字传入会抛出TypeError必须写成位置参数。该脚本在运行时会先打印生成的参考方向数量len(ref_dirs)Das-Dennis 方法在 n_partitions12 时会产生 91 条参考方向并输出各目标的 min/max 统计用于评估目标空间的分布范围。对于超多目标场景SKILL.md 还提示 NSGA-III 适用于 4~15 目标RVEA参考向量进化与 AGE-MOEA自适应几何可作为备选。工作流四自定义问题定义适用场景解决领域特定的优化问题内置基准无法覆盖。流程继承ElementwiseProblem类 → 在__init__中声明问题维度与边界 → 实现_evaluate方法计算目标值和约束→ 与任意算法搭配使用。pymoo 支持三种问题定义风格见 SKILL.mdProblem向量化一次评估一批解、ElementwiseProblem逐解评估推荐用于自定义问题与并行评估、FunctionalProblem无需子类化直接用函数定义目标与约束。本文工作流 4 采用推荐的ElementwiseProblem。无约束示例双目标变量范围 [0,5]²from pymoo.core.problem import ElementwiseProblem import numpy as np class MyProblem(ElementwiseProblem): def __init__(self): super().__init__( n_var2, # Number of variables n_obj2, # Number of objectives xlnp.array([0, 0]), # Lower bounds xunp.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_var2, n_obj2, n_ieq_constr2, # Inequality constraints n_eq_constr1, # Equality constraints xlnp.array([0, 0]), xunp.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]约束公式化规则仓库 constraints_mcdm.md 与 custom_problem_example.py 均有明确示例不等式写成g(x) 0≤0 时为可行等式写成h(x) 00 时为可行将g(x) b转换为-(g(x) - b) 0custom_problem_example.py 给出了一个真实工程示例目标为最小化f1 x1与f2 (1 x2) / x1约束x2 9*x1 6与-x2 9*x1 1。脚本将其改写为g1 -(x[1] 9*x[0] - 6)、g2 -(-x[1] 9*x[0] - 1)后写入out[G]完整演示了数学不等式 → pymoo 约束规范形式的转换手法。工作流五约束处理适用场景问题存在可行性约束等式或不等式。pymoo 提供四种约束处理思路各有适用场景机制与优劣对比详见 constraints_mcdm.md。1. 可行性优先Feasibility First默认且推荐比较规则两个解都可行 → 按目标值比较一可行一不可行 → 可行者胜都不可行 → 按约束违反量比较。对任何基于排序的算法开箱即用无需调参。from pymoo.algorithms.moo.nsga2 import NSGA2 # Works automatically with constrained problems algorithm NSGA2(pop_size100) result minimize(problem, algorithm, termination) # Check feasibility feasible result.CV[:, 0] 0 # CV constraint violation print(fFeasible solutions: {np.sum(feasible)})result.CV是约束违反矩阵custom_problem_example.py 用它统计可行/不可行解数量并分别以绿色可行与红色不可行散点绘制在目标空间中。2. 罚函数法Penalty Method将约束问题包装为无约束问题目标值加上罚函数系数 × 违反量。优点是与任意算法兼容缺点是系数敏感、需要按问题尺度调参。from pymoo.constraints.as_penalty import ConstraintsAsPenalty # Wrap problem to convert constraints to penalties problem_penalized ConstraintsAsPenalty(problem, penalty1e6)3. 约束作为目标Constraint as Objective把约束违反量当作额外的第 M1 个目标。优点是无参数、保留了对决策有用的不可行解特别适合可行域很小的问题缺点是增加问题维度。from pymoo.constraints.as_obj import ConstraintsAsObjective # Treat constraint violation as additional objective problem_with_cv ConstraintsAsObjective(problem)4. 专用约束算法SRES随机排序进化策略通过随机排序在目标与约束之间取得平衡内置约束处理能力ISRES 是其改进版详见 constraints_mcdm.md。from pymoo.algorithms.soo.nonconvex.sres import SRES # SRES has built-in constraint handling algorithm SRES()约束策略选择表来自 constraints_mcdm.md问题特征推荐技术可行域大Feasibility First可行域小Constraint as Objective、Repair约束极多SRES/ISRES、Epsilon-constraint线性约束Repair投影非线性约束Feasibility First、Penalty已知可行解偏置初始化完整约束处理指南见 references/constraints_mcdm.md。工作流六从 Pareto 前沿进行决策MCDM适用场景已得到 Pareto 前沿需要从中选出偏好的解。流程运行多目标优化 → 将目标归一化到 [0,1] → 定义偏好权重 → 应用 MCDM 方法 → 可视化所选解。Pseudo-Weights 示例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(axis0)) / (result.F.max(axis0) - result.F.min(axis0)) # 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(fSelected solution: {best_solution}) print(fObjective values: {best_objectives})其他 MCDM 方法详见 constraints_mcdm.mdCompromise Programming折中规划选择距离理想点最近的解CompromiseProgramming()适合已知/可估计理想点且无明确权重的场景。Knee Point膝点检测找到某一目标小幅改进会引起其他目标大幅退化的平衡解KneePoint()适合无先验偏好、凸 Pareto 前沿。Hypervolume Contribution超体积贡献基于HV(ref_point...)计算每个解的贡献选取贡献最大的 k 个解构成多样性子集。decision_making_example.py 完整演示了三个偏好场景等权 [0.5, 0.5]、偏好 f1 [0.8, 0.2]、偏好 f2 [0.2, 0.8]下 Pseudo-Weights 会选出不同解并用 Scatter星形标记突出所选解与 Petal花瓣图对比不同偏好的选择双重可视化。核心结论与约束-决策集成工作流含feasible_mask过滤、归一化、MCDM、输出最终解的完整代码均收录于 constraints_mcdm.md。决策方法选择表决策者掌握的信息推荐方法明确的目标权重Pseudo-Weights理想的指标值Compromise Programming无先验偏好Knee Point、目视检查冲突准则交互式方法需要多样化解集Hypervolume contribution最佳实践MCDM 前务必归一化目标先可视化 Pareto 前沿理解权衡对权重做敏感性分析。工作流七可视化根据目标数量选择可视化方式完整类型与参数见 references/visualization.md。2 个目标散点图from pymoo.visualization.scatter import Scatter plot Scatter(titleBi-objective Results) plot.add(result.F, colorblue, alpha0.7) plot.show()3 个目标3D 散点图自动渲染为三维plot Scatter(titleTri-objective Results) plot.add(result.F) # Automatically renders in 3D plot.show()4 个目标平行坐标图PCP——每条竖直轴代表一个目标连线代表一个解from pymoo.visualization.pcp import PCP plot PCP( labels[ff{i1} for i in range(n_obj)], normalize_each_axisTrue ) plot.add(result.F, alpha0.3) plot.show()解对比花瓣图Petal——每个花瓣代表一个目标from pymoo.visualization.petal import Petal plot Petal( bounds[result.F.min(axis0), result.F.max(axis0)], labels[Cost, Weight, Efficiency] ) plot.add(solution_A, labelDesign A) plot.add(solution_B, labelDesign B) plot.show()visualization.md 还提供了 Heatmap解密度分布、Radar、Radviz、Star Coordinate 以及 Video优化过程动画等类型。一个实用技巧所有绘图都支持多数据集叠加与 matplotlib 风格参数透传例如用plot.save(my_plot.png, dpi300)保存出版级高清图。平行坐标建议normalize_each_axisTrue以消除目标量纲差异。可视化选择速查问题类型首选图次选图2 目标ScatterHeatmap3 目标3D Scatter平行坐标4~10 目标平行坐标Radviz10 目标RadvizStar Coordinates解对比Petal/Radar平行坐标工作流八并行评估适用场景每次_evaluate调用都很昂贵仿真、ML 模型、外部求解器。对ElementwiseProblempymoo 默认逐解评估可通过向问题传入elementwise_runnerStarmapParallelization或JoblibParallelization实现多解并发评估。线程池示例共享内存适合 I/O 密集型评估from multiprocessing.pool import ThreadPool from pymoo.algorithms.soo.nonconvex.ga import GA from pymoo.core.problem import ElementwiseProblem from pymoo.optimize import minimize from pymoo.parallelization.starmap import StarmapParallelization class MyProblem(ElementwiseProblem): def __init__(self, elementwise_runnerNone, **kwargs): super().__init__( n_var10, n_obj1, xl-5, xu5, elementwise_runnerelementwise_runner, **kwargs, ) def _evaluate(self, x, out, *args, **kwargs): out[F] (x ** 2).sum() # Replace with expensive evaluation pool ThreadPool(4) runner StarmapParallelization(pool.starmap) problem MyProblem(elementwise_runnerrunner) result minimize(problem, GA(), (n_gen, 50), seed1) pool.close()parallelization.md 补充了完整注意事项并行化的前置条件继承ElementwiseProblem而非向量化Problem保持elementwise_evaluationTrueElementwiseProblem 默认如此并在构造函数传入elementwise_runner。进程池multiprocessing.Pool内存隔离适合 CPU 密集型评估但要求问题定义可被 pickle类体内避免使用 lambda。Joblib 接口JoblibParallelization(lambda func, X: Parallel(n_jobs4)(delayed(func)(x) for x in X))需uv pip install joblib。minimize()结束后务必pool.close()加速收益取决于单次评估成本与并行开销的比值。向量化问题批量评估则应在_evaluate内部实现批处理而不是依赖 runner。进程池与 Joblib 完整代码见 references/parallelization.md。工作流九混合变量优化适用场景决策变量同时包含连续、整数、二值和/或类别变量。方法用vars字典声明带类型变量单目标使用MixedVariableGA多目标则追加 MOO 生存算子。示例from pymoo.core.problem import ElementwiseProblem from pymoo.core.variable import Real, Integer, Choice, Binary from pymoo.core.mixed import MixedVariableGA from pymoo.optimize import minimize class MixedProblem(ElementwiseProblem): def __init__(self, **kwargs): vars { b: Binary(), x: Choice(options[nothing, multiply]), y: Integer(bounds(0, 2)), z: Real(bounds(0, 5)), } super().__init__(varsvars, n_obj1, **kwargs) def _evaluate(self, X, out, *args, **kwargs): b, x, z, y X[b], X[x], X[z], X[y] f z y if b: f 100 * f if x multiply: f 10 * f out[F] f algorithm MixedVariableGA(pop_size20) result minimize(MixedProblem(), algorithm, (n_evals, 1000), seed1)注意两点混合变量问题的解X是字典按变量名取值而非数组上例演示了如何解包X[b]、X[x]等。多目标混合变量问题使用MixedVariableGA(pop_size20, survivalRankAndCrowdingSurvival())单目标混合搜索还可通过pymoo.algorithms.soo.nonconvex.optuna.Optuna调用 Optuna 进行搜索终止条件此处使用(n_evals, 1000)即评估次数上限与(n_gen, N)形成互补。MixedVariableGA 与 Optuna 封装的详细参数见 references/algorithms.md。快速运行全部示例仓库在 scripts/ 目录提供了与本文工作流一一对应的 5 个可执行脚本覆盖工作流 1、2、3、4、6含约束示例与决策分析python3 skills/pymoo/scripts/single_objective_example.py # 工作流 1GA Sphere python3 skills/pymoo/scripts/multi_objective_example.py # 工作流 2NSGA-II ZDT1 真实前沿对比 python3 skills/pymoo/scripts/many_objective_example.py # 工作流 3NSGA-III DTLZ2 PCP python3 skills/pymoo/scripts/custom_problem_example.py # 工作流 4/5自定义问题 约束 python3 skills/pymoo/scripts/decision_making_example.py # 工作流 6MCDM Petal 对比性能优化与最佳实践SKILL.md 汇总了常见问题排障与最佳实践不收敛时增大种群规模、增加代数、检查是否为多峰问题换算法、核实约束公式化是否正确。Pareto 前沿分布差NSGA-III 调整参考方向增大种群开启eliminate_duplicates检查问题缩放。可行解太少改用约束即目标方法应用修复算子尝试 SRES/ISRES检查约束是否写成g 0规范形式。计算成本高减小种群、减少代数、换用更简单的算子或启用工作流八的elementwise_runner并行评估。通用最佳实践目标量纲差异大时先归一化设置随机种子保证可复现用save_historyTrue保存历史以分析收敛配合result.history[gen].opt.get(F)绘制逐代前沿可视化验证解的质量有真实前沿如 ZDT/DTLZ时与之对比选择合适的终止条件代数、评估次数、容差f_tol针对问题特征调优算子参数如 SBX 的prob/eta、PM 的eta。若需深入可在仓库中继续查阅 algorithms.md算法全参数参考、problems.mdZDT/DTLZ/WFG 基准问题特性、operators.md采样/选择/交叉/变异算子配置或在各 references 目录下使用grep -r NSGA-II\|NSGA-III\|MOEA/D references/等模式快速检索见 SKILL.md。【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000 scientists worldwide. 165 ready-to-use validated skills plus 100 scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表