Python 中关于运筹优化库的整理清单
本篇文章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
大多数库都提供示例问题和文档。在扩展到生产问题之前,先在小型实例上进行测试。
更多推荐

所有评论(0)