HiGHS 线性优化求解器上手指南:30 秒跑出第一个解
【免费下载链接】HiGHSLinear optimization software项目地址: https://gitcode.com/GitHub_Trending/hi/HiGHS
你手上可能正压着一个 MPS 模型文件:同事导出来的,一跑就报 infeasible,不知道先查哪条约束;或者你想用免费工具解一个大规模稀疏线性规划,却被各家求解器的构建步骤和接口风格劝退。HiGHS 是一款用 C++ 编写的高性能线性优化求解器,一套工具同时覆盖线性规划(LP)、凸二次规划(QP)和混合整数规划(MIP)。🎯
为什么值得关注
- 零第三方依赖:主体为纯 C++,构建不需要任何外部库,编译后得到一个
highs可执行文件,highs model.mps一行命令开始求解。 - 一个求解器解三类问题:LP 有修订单纯形法与内点法可选,QP 用主动集法,MIP 用分支切割,靠
solver等选项切换,不用为每类问题各装一套工具。 - 并行 MIP 求解:分支切割的节点搜索逻辑已重构为多线程运行,
--parallel on即可让多核参与整数问题求解。 - 分析功能内置:模型不可行时可用 IIS(不可行子系统,导致冲突的最小约束集)缩小排查范围;
--ranging on输出目标系数与边界的敏感性区间。 - Python 接口一等公民:highspy 除封装 C API 外还提供
addVariable/addConstr建模接口,建模代码接近数学书写习惯。
核心能力一览
求解线性规划并读取解
- 命令行支持 MPS 与 CPLEX LP 两种模型格式,解出后结果、最终基、日志都可经
--solution_file、--write_basis_file等参数落盘。 --solver simplex与--solver ipm之间可切换,缺省choose交给 HiGHS 自行决定。--time_limit以秒为单位限定求解预算,适合一次跑大批实例。
在 Python 里建模并求解
- 两套接口并存:
addVariable/addConstr/maximize的建模写法适合手搓模型;底层addVars/addRows批量接口适合你已有矩阵数组的情况。 - 求解后从
getSolution()、getInfo()、getBasis()分别取变量取值、目标值与基的有效性。 - 变量建成整数类型后,HiGHS 自动走 MIP 求解路径,无需手动指定。
复现结果与批量处理
- 全部选项可写入选项文件,经
--options_file加载,仓库里check/sample_options_file就是格式样例。 - 设好
random_seed后,含随机路径的求解也能复现。
最快上手路径 ⚡
源码构建三行跑通:
cmake -S . -B build # 生成构建配置(需 CMake >= 3.15) cmake --build build # 编译,产出 bin/highs ./build/bin/highs check/instances/afiro.mps # 解一个仓库自带实例源码构建
如上三条命令。构建细节与可选开关见仓库的cmake/README.md;编译完成后进入 build 目录跑ctest可验证安装是否完好。
Python 包安装
pip install highspy # 缺 numpy 时会一并安装C# 与其他语言绑定
dotnet add package Highs.Native # 内含多平台运行时库C 接口头文件在highs/interfaces/highs_c_api.h,默认构建即包含;Fortran API 不默认编译,需单独配置。最小可运行示例(取自examples/minimal.py):
import highspy h = highspy.Highs() x1 = h.addVariable(lb = -h.inf) # 加变量 x2 = h.addVariable(lb = -h.inf) h.addConstr(x2 - x1 >= 2) # 加约束 h.addConstr(x1 + x2 >= 0) h.minimize(x2) # 以此为目标求解 print(h.modelStatusToString(h.getModelStatus())) # 模型状态 print("x2 =", h.val(x2)) # 取变量取值典型场景速览
生产排产——把 Excel 里的拍脑袋变成可验证的最优解
把各产品产量设为决策变量,产能、需求写成上下界约束,成本做目标。HiGHS 的 LP 求解器一次解出排产方案,--ranging on还能告诉你单位利润浮动多少方案不变,比手工调数有据可依。
投资组合——用凸二次规划平衡风险与收益
协方差矩阵放进 Q(须半正定)、期望收益放进线性项,QP 求解器用主动集法求解;Q 不凸时会被明确拒绝而不是给错解,适合"收益达标前提下风险最小"这类建模。
调度指派——把大整数问题压进时间预算
"分配到哪台设备、是否开机"必须引入整数变量。开启--parallel on用并行分支切割,再给time_limit设预算,即使未收敛也能拿到可行解与界,便于评估还差多远。
不可行模型排错——直接指出互相打架的约束
模型报 infeasible 时,与其一条条删约束试,不如让 HiGHS 通过getIis输出不可行子系统,直接看住那几条冲突约束。
调优与常见坑
让求解更快
| 参数 | 作用 | 何时开 |
|---|---|---|
presolve | 预处理缩减规模、加强界 | 默认 on;数值困难的问题可试 off 对比 |
solver | 在单纯形与内点法间切换 | 大规模稀疏 LP 试ipm |
parallel/threads | 开并行 / 限线程数 | 多核机器解 MIP 时 |
time_limit | 秒级时间预算 | 批量跑批防单例卡死队列 |
random_seed | 固定随机种子 | 结果波动需要复现时 |
遇到异常先查这里
- 现象:模型报 infeasible→ 大概率约束真冲突或上下界写反 → 先核对边界条件,再输出 IIS 定位冲突约束。
- 现象:目标值是异常的小数→ 多为尺度问题 → 检查是否需要重新定标,或
presolve = off对比判断。 - 现象:配置阶段构建失败→ CMake 版本或编译器不达标 → 确认 CMake ≥ 3.15、编译器支持 C++11。
- 现象:两次运行结果略有差异→ MIP 或并行路径带随机性 → 设
random_seed复现。 - 现象:highspy 里用不了 HiPO 内点法→ HiPO 依赖在可选包里 →
pip install highspy[extras]补上。
选项文件写法直接参考仓库中的check/sample_options_file,每行一个选项 = 值。
继续深入
docs/src/— 官方文档源:安装、选项全表、各语言接口与求解器说明都在里面。examples/— 多语言调用示例与最小模型,从minimal.py读起最顺。check/instances/— 一批经典 MPS/LP 测试实例,装好环境后拿它验证。CONTRIBUTING.md— 贡献流程;使用问题与改进建议可直接向仓库提 issue。
下次有人把 MPS 文件丢给你,先编一个highs,再跑一句./build/bin/highs check/instances/afiro.mps,看着控制台打出第一个最优解;要不要开并行、要不要换 QP,跑完心里就有数了。✅
【免费下载链接】HiGHSLinear optimization software项目地址: https://gitcode.com/GitHub_Trending/hi/HiGHS
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考