如何在 Python 中 5 分钟集成 HiGHS:highspy 求解 LP/MIP/QP 的完整指南
【免费下载链接】HiGHSLinear optimization software项目地址: https://gitcode.com/GitHub_Trending/hi/HiGHS
如果你在 Python 项目里需要解线性规划、混合整数规划或二次规划,highspy 值得认识一下——它就是 HiGHS 开源高性能求解器的官方 Python 接口,让你不碰 C++ 编译环境,直接在脚本里求解 LP/MIP/QP 三类问题。
它能替你解决什么问题
先看它承接的三类典型业务,再谈 API:
- 生产排产:输入产能、订单量与工时,输出成本最低的每日生产计划;
- 物流运输:输入供需点与线路成本,输出总运费最小的调运方案;
- 组合优化(背包型):输入物品价值与重量,输出总价值最大的选取集合。
这三类问题分别对应数学规划中的 LP、MIP 与 QP,而 HiGHS 在这三条线上都有成熟实现,highspy 则把 C++ 核心的完整能力包装成了 Python 对象。
三步拿到第一个可行解
建模思路固定为「定义变量 → 写目标 → 写约束」,与三个 API 一一对应:
| 建模步骤 | highspy 调用 | 要提供的东西 |
|---|---|---|
| 变量 | addVars | 变量个数、上下界 |
| 目标 | changeColsCost | 变量下标、目标系数 |
| 约束 | addRows | 行上下界 + 稀疏矩阵(COO 形式) |
import highspy import numpy as np h = highspy.Highs() inf = highspy.kHighsInf h.addVars(2, np.array([-inf, 0]), np.array([inf, 10])) # 变量 x, y h.changeColsCost(2, [0, 1], np.array([0, 1])) # 目标 max y h.addRows(2, np.array([1, 2]), np.array([inf, inf]), 4, np.array([0, 2]), np.array([0, 1, 0, 1]), np.array([-1, 1, 1, 1])) # -x+y>=1, x+y>=2 h.run() print(h.modelStatusToString(h.getModelStatus())) print(h.getInfo().objective_function_value)读懂求解状态:getModelStatus()返回枚举,用modelStatusToString(...)转成可读字符串,常见取值有kOptimal(最优)、kInfeasible(不可行)、kUnbounded(无界);目标值、单纯形迭代次数等量化指标统一从getInfo()读取。上面这个示例的输出应为kOptimal与 10。
安装与验证只需一分钟
pip install highspy一条命令完成 highspy 安装;缺 numpy 时会被自动带上,无需手工编译任何 C++ 库。🚀 装完用三行代码验证:
import highspy print(highspy.__version__) h = highspy.Highs(); h.addVars(1, [0], [1]); h.run() print(h.modelStatusToString(h.getModelStatus()))从示例走向生产
一行读取 MPS 模型文件并求解
模型若已在文件里,直接readModel。仓库自带样例数据check/instances/avgas.mps可供练习:
h = highspy.Highs() h.readModel("check/instances/avgas.mps") h.run() lp = h.getLp() print(lp.num_col_, lp.num_row_, h.getNumNz())打印出的变量数、约束数、矩阵非零元个数,能帮你快速核对读入的模型规模。LP 与 MPS 两种主流文件格式均支持。
用回调钩子写入自定义逻辑
求解器支持"途中停下来问你要决策":setCallback注册函数后,由startCallback指定触发时机。最常用的是日志回调,可实时跟踪 MIP 求解进度;节点级回调则能在搜索过程中注入新约束或收紧变量界,是分支定价等定制算法的入口:
def on_cb(callback_type, message, data_out, data_in, user_data): if callback_type == highspy.cb.HighsCallbackType.kCallbackLogging: print(message) h.setCallback(on_cb, None) h.startCallback(highspy.cb.HighsCallbackType.kCallbackLogging) h.run()选内点法还是单纯形:切换算法选项
用 Python 解线性规划时,HiGHS 默认走单纯形法并叠加 presolve 预处理;部分大规模 LP 上内点法更快,通过 options 切换:
options = h.getOptions() options.presolve = "off" # 关闭 presolve options.solver = "ipm" # 切换到内点法 h.passOptions(options) h.run()⚡ 建议先看日志再调参:默认配置跑通之后,确认瓶颈在哪一项,再决定开关 presolve 或换算法;MIP 求解时 presolve 通常有益,不建议随手关闭。
调参与排坑清单
| 场景 | 做法 |
|---|---|
| 变量上千的大模型 | 坚持addRows的 COO 稀疏形式,不要构造稠密矩阵 |
| 同结构模型反复求解 | 热启动:把上次基/解作为初值传入,加快收敛 |
| 速度不满意 | 调 options:presolve、solver、时限等 |
新手最易踩的两个坑:
- 列主序约定:HiGHS 按列主序组织约束矩阵,
addRows的starts/indices都是"按列"书写,行列写反是约束错位的第一大原因; - options 时机:
passOptions只影响下一次run(),求解中途改动后必须重新运行才生效。
整数变量如何标记、更完整的用法,见 背包示例 与 示例目录;API 细节可查 官方文档。
highspy 把 C++ 级别的高性能 LP/MIP/QP 求解栈压缩成了一个pip可装的 Python 依赖:建模三步、换算法一组 options、控流程一组回调。下一步就去跑一个真实模型——clone 仓库后执行examples/minimal.py,跑通它,调参的事才算真正开始。
【免费下载链接】HiGHSLinear optimization software项目地址: https://gitcode.com/GitHub_Trending/hi/HiGHS
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考