本篇文章Python Optimization Libraries for Operations Research为优化和运筹学领域提供了丰富的Python库选择,适合各种优化问题。文章的技术亮点在于详细介绍了15种优化库,涵盖了从数学编程到元启发式算法的多种方法,帮助用户根据具体需求选择合适的工具。



运筹学问题——调度、路径规划、资源分配、供应链优化——需要通用数值库无法提供的专用算法。Python 的生态系统包含了数十个优化库,从数学规划框架到元启发式求解器应有尽有。

本文将介绍 15 个以上专门用于优化和运筹学的库,而非通用的数据处理工具。每个库都使用不同的方法解决不同类型的问题。

1 数学规划框架

1.1 Pyomo

Pyomo 在 Python 中提供了代数建模语言(AML)功能,类似于 AMPL 或 GAMS。它支持线性规划、混合整数规划、非线性规划和随机规划。

优势:问题公式化与求解器选择分离。只需编写一次模型,即可使用多个求解器(GLPK、CBC、CPLEX、Gurobi、IPOPT)进行测试,无需更改代码。

用途:需要精确解的大规模优化问题、能源系统规划、生产调度、网络设计。

import pyomo.environ as pyo

model = pyo.ConcreteModel()  
model.x = pyo.Var([1,2], domain=pyo.NonNegativeReals)  
model.obj = pyo.Objective(expr = 2*model.x[1] + 3*model.x[2])  
model.constraint1 = pyo.Constraint(expr = 3*model.x[1] + 4*model.x[2] >= 1)
solver = pyo.SolverFactory('glpk')  
solver.solve(model)

1.2 PuLP

PuLP 专注于线性规划和整数规划,语法比 Pyomo 更简单。适用于初学者或不需要非线性功能的问题。

优势:轻量级、易于学习、快速原型开发。

用途:运输问题、分配问题、具有线性约束的生产计划。

1.3 OR-Tools

Google 的 OR-Tools 将约束规划、线性/整数规划、车辆路径规划和图算法整合在一个软件包中。其约束规划求解器可处理不适合 LP/MIP 公式化的调度和分配问题。

优势:生产就绪的路径求解器,具有时间窗、容量约束、多个仓库等功能。用于复杂调度的约束规划。

用途:车辆路径规划、作业车间调度、员工排班、装箱问题。

1.4 CVXPY

CVXPY 专注于凸优化——目标函数和约束条件都是凸函数的问题。它使用规范凸规划(DCP)自动验证问题结构。

优势:根据问题结构自动选择合适的求解器。对凸问题有很强的理论保证。

用途:投资组合优化、控制系统、信号处理、机器学习正则化。

1.5 Python-MIP

Python-MIP 提供高性能的混合整数规划,其语法受 PuLP 启发,但增加了惰性约束、割平面和解池等功能。

优势:通过 C 语言集成实现快速模型生成,可从 Python 访问高级求解器功能。

用途:需要求解器回调或自定义割平面处理的大规模 MIP 问题。

2 元启发式框架

2.1 pymoo

多目标优化库,实现了遗传算法(NSGA-II、NSGA-III)、粒子群优化、差分进化和其他进化算法。专注于具有多个冲突目标的问题。

优势:全面的多目标优化,具有帕累托前沿可视化、性能指标、决策工具。

用途:工程设计优化、具有多个标准的投资组合优化、任何涉及目标之间权衡的问题。

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

problem = get_problem("zdt1")  
algorithm = NSGA2(pop_size=100)  
res = minimize(problem, algorithm, ('n_gen', 200))

2.2 DEAP

Python 中的分布式进化算法。一个灵活的框架,用于实现自定义进化算法、遗传编程、进化策略。

优势:高度可定制,支持并行和分布式计算,包括基准测试功能。

用途:进化计算研究、自定义算法开发、用于符号回归的遗传编程。

2.3 PyGAD

具有简单 API 的遗传算法库。支持通过遗传算法进行神经网络训练,作为梯度下降的替代方案。

优势:易于使用,与 Keras 和 PyTorch 集成,用于神经进化。

用途:梯度信息不可用的优化问题、超参数调优、神经架构搜索。

2.4 simanneal

模拟退火算法的实现,依赖项极少。提供基类;用户定义其问题特定的移动和能量函数。

优势:纯 Python 实现,易于针对特定问题进行定制,算法参数无需学习曲线。

用途:组合优化、旅行商问题、当简单性比性能更重要时的调度问题。

3 专用求解器

3.1 NetworkX

图论和网络优化算法。它不是一个通用优化器,但对于网络流问题、最短路径、匹配和基于图的优化至关重要。

优势:全面的图算法,与可视化工具集成,最大流/最小成本流求解器。

用途:网络设计、交通规划、具有优先约束的项目调度、社交网络分析。

3.2 python-tsp

旅行商问题求解器,使用各种方法:动态规划、分支定界、Lin-Kernighan 启发式算法、遗传算法。

优势:针对同一问题类型提供多种算法,易于比较不同方法。

用途:车辆路径规划基础、仓库拣货优化、电路板钻孔路径。

3.3 mip

基于 Python-MIP 构建的生产调度和批量大小确定库。实现了带能力约束的批量大小确定、带设置时间的多级批量大小确定算法。

优势:针对常见生产计划问题提供领域特定的实现。

用途:制造计划、库存优化、带设置成本的生产调度。

3.4 scikit-opt

群智能和进化算法:粒子群优化、差分进化、模拟退火、遗传算法、免疫算法。

优势:跨不同元启发式算法的统一 API,包括混合算法。

用途:函数优化、工程设计、无梯度信息系统的参数调优。

4 约束规划与逻辑

4.1 python-constraint

约束满足问题(CSP)求解器,使用带前向检查和约束传播的回溯算法。

优势:声明式问题规范,自动约束传播。

用途:具有复杂约束的调度、配置问题、谜题、时间表安排。

4.2 Numberjack

约束规划建模与多个求解器后端(Mistral、Gecode、SCIP)之间的桥梁。

优势:通过单一接口支持多个求解器后端。

用途:调度、规划、需要约束传播的配置问题。

5 超参数优化

5.1 Optuna

超参数优化框架,使用贝叶斯优化、树结构 Parzen 估计器、进化算法。

优势:自动算法选择、剪枝无前景的试验、分布式优化、可视化工具。

用途:机器学习模型调优、深度学习架构搜索、自动化实验。

5.2 Hyperopt

用于超参数调优的贝叶斯优化库,采用树结构 Parzen 估计器和随机搜索。

优势:成熟的库,在机器学习竞赛中拥有广泛的成功记录。

用途:神经网络超参数搜索、集成模型优化。

6 库选择指南

具有已知结构的线性/整数规划:从 PuLP 开始以求简单,或使用 Pyomo 以求灵活性。如果需要约束规划或路径规划,则升级到 OR-Tools。

多目标优化:pymoo 提供完整的工具包。如果需要没有帕累托分析的简单遗传算法,请使用 DEAP 或 PyGAD。

凸优化:CVXPY 自动验证凸性并选择合适的求解器。

用于黑盒函数的元启发式算法:对于简单问题使用 scikit-opt 或 simanneal,对于自定义算法使用 DEAP,对于多目标问题使用 pymoo。

网络问题:NetworkX 处理图、流、路径。与其他库结合使用以进行网络优化。

具有复杂约束的调度:OR-Tools 约束规划表现出色。python-constraint 适用于较小的问题。

超参数调优:Optuna 适用于当前最佳实践,Hyperopt 是成熟的替代方案。

车辆路径规划:OR-Tools 路径库已可用于生产环境。python-tsp 提供 TSP 基础。

7 实际考虑

求解器依赖:数学规划库(Pyomo、PuLP、CVXPY)需要外部求解器。开源选项(GLPK、CBC)免费但比商业求解器(CPLEX、Gurobi)慢。商业求解器提供学术许可。

问题规模:元启发式算法(pymoo、DEAP、PyGAD)可扩展到数千个变量,但不保证最优性。数学规划(Pyomo、OR-Tools)找到经过验证的最优解,但计算成本随问题规模呈指数增长。

开发时间:高级框架(PuLP、OR-Tools、Optuna)可减少开发时间。低级框架(DEAP、NetworkX)需要更多编码但提供更多控制。

性能:关键应用程序受益于编译型求解器。Python-MIP 和 OR-Tools 的部分内部使用 C++。纯 Python 实现(simanneal、python-constraint)以性能换取简单性。

8 结合使用库

实际问题通常需要多种方法:

  • NetworkX 用于网络预处理 + Pyomo 用于网络上的优化
  • DEAP 用于元启发式搜索 + CVXPY 用于凸子问题
  • OR-Tools 路径规划 + 自定义约束规划用于复杂调度
  • Optuna 用于超参数调优 + 目标函数内的任何优化库

Python 的生态系统使集成变得简单。每个库都专注于特定的问题类型,而不是声称解决所有问题。

9 入门

根据需要安装库:

pip install pyomo pulp ortools cvxpy python-mip  
pip install pymoo deap pygad scikit-opt  
pip install networkx optuna hyperopt

从你的问题类型开始:

  • 已知数学结构?使用 Pyomo 或 PuLP
  • 黑盒函数?使用 pymoo 或 scikit-opt
  • 多目标?使用 pymoo
  • 路径规划?使用 OR-Tools
  • 图?使用 NetworkX

大多数库都提供示例问题和文档。在扩展到生产问题之前,先在小型实例上进行测试。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐