news 2026/10/23 7:27:27

如何在 Python 中 5 分钟集成 HiGHS:highspy 求解 LP/MIP/QP 的完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何在 Python 中 5 分钟集成 HiGHS:highspy 求解 LP/MIP/QP 的完整指南

如何在 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、时限等

新手最易踩的两个坑:

  1. 列主序约定:HiGHS 按列主序组织约束矩阵,addRows的starts/indices都是"按列"书写,行列写反是约束错位的第一大原因;
  2. 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/23 7:25:18

互联网行业35岁现象:技术人的职业突围与转型

1. 行业现象观察:35岁门槛的普遍存在最近几年,国内互联网行业出现了一个值得关注的现象:许多企业在招聘技术岗位时,会设置35岁的年龄上限。这个不成文的规则在业内被称为"35岁门槛",尤其对开发岗位影响最为明…

作者头像 李华
网站建设 2026/10/23 7:25:04

Python Pandas库入门:数据读取与基本操作

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/23 7:17:27

【工程与环境】Linux:死机后如何安全重启

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/23 7:16:30

Windows 11开始菜单“全部”关闭指南:注册表配置与排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/23 7:16:14

操作系统内存管理全链路:虚拟内存、页表、分配器与OOM排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/23 7:15:32

VCD驱动RedHawk动态压降分析:替代vectorless的工程级电源完整性验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华