news 2026/10/23 1:57:13

HiGHS 线性优化求解器:从建模到出解的 5 分钟上手指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HiGHS 线性优化求解器:从建模到出解的 5 分钟上手指南

HiGHS 线性优化求解器:从建模到出解的 5 分钟上手指南

【免费下载链接】HiGHSLinear optimization software项目地址: https://gitcode.com/GitHub_Trending/hi/HiGHS

HiGHS 是一款用 C++ 实现的开源线性优化求解器,线性规划、混合整数规划、凸二次规划都能处理,核心代码零第三方依赖,MIT 协议可商用。本文带你 5 分钟内装好 highspy、跑通第一个问题,并说明它的能力边界和常用调优参数。

一、它解决什么问题

先看三个高频场景里你通常卡在哪里。

排班与排产:车间要决定每类产品做多少张,受机器产能、人工工时、订单下限约束,目标是最小化成本或最大化利润。这类问题写成线性规划很直接,但变量一多,手工试算和电子表格已经无能为力,需要求解器给出最优解和对偶价格。

配送与资源分配:车辆路径、机组分配、设备选型,决策天然是"选不选、放哪里"。一旦引入整数约束,问题规模稍大就呈指数增长,单纯解一个 LP 松弛不够用,必须靠真正的混合整数规划求解器做分支定界。

资产配置:最小化组合方差、约束期望收益,本质是一个带二次目标的凸 QP。很多团队的卡点不在建模,而在求解器:商业求解器按核收费,部分开源工具依赖链重、升级麻烦。

HiGHS 的位置一句话:一个 MIT 协议、零第三方依赖的 C++ 开源优化求解器,同一套接口覆盖 LP、MIP 和凸 QP。

二、5 分钟跑通最小路径

最短路径只有一条:装 Python 包,直接建模求解。

pip install highspy
import highspy h = highspy.Highs() h.silent() # 例:桌子和椅子,受装配与打磨工时约束,利润最大 x = h.addVariables(['Tables', 'SetsOfChairs'], obj=[10, 25]) h.addConstrs(x['Tables'] + 2*x['SetsOfChairs'] <= 80, x['Tables'] + 4*x['SetsOfChairs'] <= 120) h.setMaximize() h.solve() print('Make', h.vals(x)) print('Optimal profit', h.getObjectiveValue())

运行后你会看到Make [40. 20.]和Optimal profit 900.0:制椅 20 套、制桌 40 张时利润最大。highspy 的简化接口可以直接用比较运算符写约束,这是它比底层矩阵接口快得多的地方。

如果你要源码构建,cmake -S . -B build配置后cmake --build build编译,细节见 cmake/README.md;命令行方式则直接用highs可执行文件求解 MPS 或 LP 文件,无需先建模。

三、能力与边界:一张表看清支持什么

问题类型对应算法适用规模 / 前提条件注意限制
线性规划 LP修正单纯形法、HiPO / IPX 内点法大规模稀疏问题,百万级变量内点法求解器依赖 BLAS,默认编译为可选组件;单纯形稳定性最好
混合整数规划 MIP分支定界 + 割平面 + 启发式整数变量规模是关键,预处理和并行影响明显弱松弛、无界分支空间的问题会慢,注意整数变量取值范围
凸二次规划 QP主动集法目标函数 Hessian 半正定仅支持凸 QP,非凸问题不在能力圈

几个"有但需要主动开启"的特性:并行求解(parallel选项,对 MIP 分支节点生效)、自动预处理(默认开启,见下一章)、不可行性诊断(IIS,可定位冲突约束子集)、敏感性分析(ranging,给出目标系数和右端项的变化范围)、多目标支持。这些不是默认全开的,文档里有说明。

四、建模思路:两个典型场景

场景一:车间排产 LP。每个产品做多少台,受机器产能和人工工时约束,求利润最大。建模要点:决策变量是各产品产量(连续,非负);约束是资源上限(每个资源一行)和订单下限;目标函数是利润线性组合。变量和约束的规模通常是"几十到几千",单纯形秒解。仓库里的 chip.py(桌子和椅子)和 distillation.py(原油调配)就是这个形态,读完这两个文件你基本掌握了 LP 建模的全部套路。

场景二:带时间窗的配送 MIP。决定哪些订单由哪辆车服务、按什么顺序。建模要点:决策变量是"订单-车辆"分配(0/1 整数)和访问顺序;关键约束是车辆容量、每个站点的时间窗、车辆路径的连续性。这类问题的难点不在建模而在规模——整数变量一多,分支定界的时间就上不封顶。可以先用 knapsack.py 熟悉整数变量怎么加,更贴近实际的列生成写法见 branch-and-price.py。

读完这两个场景你应该能判断:如果你的问题能写成"线性目标 + 线性约束 + 部分整数变量",HiGHS 就建得出来。

五、影响求解速度的关键选项

  • presolve— 预处理,默认on。遇到奇怪的数值行为或想对照原始问题排查时,先关掉再看一遍。
  • time_limit— 求解时间上限,单位秒。设上限后,超时会返回当前最优解(MIP)或最佳可行解,便于你判断"再等 10 分钟值不值"。
  • parallel/threads— 并行线程数。MIP 分支阶段加速明显;单纯形基本用不上。
  • output_flag— 控制台日志开关。调试建模时建议保留,批量跑任务时关掉。
  • random_seed— 固定随机种子,保证同样输入下 MIP 的分支顺序可复现。

用options_file可以一次固化一组参数:

highs --options_file my_options.txt model.mps

其中my_options.txt每行一个参数名 = 取值,如presolve = on、time_limit = 600。命令行参数会覆盖文件中的值,方便临时改。

六、跑不通时先查这三处

  • 源码构建失败:多半是 CMake 版本不足 3.15 或编译器太旧。看 configure 阶段第一段报错,cmake/README.md 列了平台要求和可选开关;如果只是想先跑起来,pip install highspy是最快路径。
  • 求解返回 infeasible:先确认约束方向和上下界单位一致("吨"写成"公斤"是最常见的建模事故),再用 HiGHS 的 IIS 功能拿到一组冲突约束子集,对着数据修,文档入口在 docs/src/interfaces/python/index.md。
  • 大规模问题超时:先关掉presolve再开一次,对比预处理前后的规模,判断是模型本身大还是被预处理放大/缩小有异常;MIP 则设time_limit先拿到次优解,再迭代收紧界。求解器行为细节参考 docs/src/solvers.md。

七、继续深入

  • 官方文档入口:docs/src/(安装、接口、选项、算法说明都在这里)
  • Python 接口示例:docs/src/interfaces/python/example-py.md
  • 可直接运行的示例:examples/(LP / MIP / 多目标 / 列生成都有)
  • 测试用例:check/,每个测试对应一种行为,读代码比读文档更快建立直觉

遇到行为疑问、想提改进或贡献代码,直接到仓库提 issue 或 PR 即可。从你的第一个小规模 LP 跑通开始,比收藏十篇教程有用。

【免费下载链接】HiGHSLinear optimization software项目地址: https://gitcode.com/GitHub_Trending/hi/HiGHS

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

神经网络评估指标:准确率、召回率等详解(代码验证)

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

作者头像 李华