如何用HiGHS开源线性优化求解器10分钟从零跑通第一个求解:完整实战指南
【免费下载链接】HiGHSLinear optimization software项目地址: https://gitcode.com/GitHub_Trending/hi/HiGHS
Meta Description:HiGHS 是一款免费开源的线性优化求解器,支持线性规划(LP)、混合整数规划(MIP)与凸二次规划(QP),本文带你从安装、跑通第一个求解到结果读取与调优,10 分钟即可上手。
HiGHS 是一款免费开源的线性优化求解器,用 C++ 编写、无第三方依赖,能解线性规划(LP)、混合整数(MIP)和凸二次(QP)三类问题,适合要把大规模稀疏优化问题落地的工程师。
先判断适不适合:HiGHS能解什么、不能解什么
它能接手的三类优化问题
HiGHS 的通用模型形式是min 1/2 x^T Q x + c^T x,约束为L ≤ Ax ≤ U和l ≤ x ≤ u。把不同的部分设为空,就得到三类问题:Q为零矩阵时是线性规划;部分变量取整数值时是混合整数规划;Q半正定且非零时是凸二次规划。可以把它理解成一个"通用后厨":菜谱就这三种,但每种都能做到位——LP 和 MIP 是日常主力,QP 走主动集法。
容易踩的两条边界
两条边界要提前说清,免得白折腾:第一,Q不定(非凸)的二次问题不保证能解,求解前只做对角元检查;第二,"二次目标 + 整数变量"(混合整数二次规划)目前不支持。如果你的问题长这样,先考虑线性化或凸化改写。
什么情况下选它最划算
三个信号:问题规模大且稀疏(变量、约束上千到百万级);需要嵌进自己的系统而非手动跑命令(它有 Python、C、C#、Fortran 等接口);希望 MIT 许可、商用无限制。三条占两条,就值得花十分钟走一遍下面的流程。
确认问题对得上号之后,下一步是把 HiGHS 装到你的机器上。
安装HiGHS:两条路线,Python用户先走pip
一行命令装好 highspy
大多数读者的入口是 Python 包 highspy:
pip install highspy这条命令同时会装好它依赖的 numpy。如果你需要 HiPO 内点求解器,另装pip install highspy[extras](因为它带 Metis 等依赖,该扩展包是 Apache-2.0 许可)。装完后跑一下 examples/call_highs_from_python_highspy.py 即可验证。
从源码编译出 highs 可执行文件
想直接命令行解文件、或用 C/C++ 接口时,需要从源码编译,要求 CMake 3.15 以上:
git clone https://gitcode.com/GitHub_Trending/hi/HiGHS cd HiGHS cmake -S . -B build && cmake --build build产物是可执行文件bin/highs和库libhighs;进 build 目录跑ctest可验证编译结果。HiPO 等开关的完整编译参数在 cmake/README.md 和安装文档里有详细说明。
预编译二进制与其他语言渠道
不想编译的话,项目 release 页提供各平台的预编译静态二进制(分*-mit和*-apache两种许可版本);Julia、C#(nuget 包 Highs.Native)、Rust 也有各自的包管理器渠道,适合直接按语言取用。
安装到位后,别急着看文档,先花一分钟把第一个求解跑出来,建立手感。
1分钟跑通第一个线性规划求解
用5行Python解一个小型LP
examples/minimal.py 是仓库里最小的完整例子,两个变量、两条约束、最小化x2:
import highspy h = highspy.Highs() x1 = h.addVariable(lb = -h.inf) x2 = h.addVariable(lb = -h.inf) h.addConstrs(x2 - x1 >= 2, x1 + x2 >= 0) h.minimize(x2) h.run()整个建模流程固定为三步:定义变量与约束 → 设定目标 →run()。后面不管问题多复杂,骨架都是这三个动作。
或者直接用命令行解一个现成文件
如果你的模型已经是文件,一条命令就够。仓库测试目录里自带一批标准实例,比如 avgas:
highs check/instances/avgas.mps运行完会打印迭代日志和最优目标值,这是最快速的"求解器活没活"体检。
读结果的固定三步
跑完之后,按固定顺序取结果:h.getModelStatus()看求解状态,确认是 Optimal(最优)再往下走,Infeasible 说明没有可行解,Unbounded 说明目标还能一直降;h.getInfo()拿目标值、迭代次数这类标量信息;h.getSolution()拿变量和约束的取值。这套"定义—求解—提取"的三段式是 HiGHS 的核心交互模式,基础功能文档按同样的结构展开。
会跑之后,下一个问题自然是:run()按下之后,HiGHS 在后台到底做了什么。
理解底层流程:预处理、三套算法与热启动
先瘦身再求解:默认开启的presolve
默认情况下 presolve 是开着的。求解器真正开工前,它先对模型做一轮简化:消掉冗余约束、把被边界夹死的变量固定下来、收紧取值范围。对结构松散的大模型,这一步往往比换算法带来的提速更明显。
三套LP算法,默认自动选
HiGHS 内置三类 LP 技术:单纯形法(默认用对偶修正单纯形,稳定、产出基解、支持热启动);内点法有两套,IPX 是串行的、HiPO 是并行的——小问题上 IPX 常常更快,但问题越大 HiPO 的优势越明显,官方文档提到差距可以超过一个数量级;PDLP 是一阶方法,主打 NVIDIA GPU,纯 CPU 上一般不如前两者划算。实际使用不用手动挑,solver选项默认 "choose" 会按问题类型自动决定,细节见求解器文档。
热启动:改过模型不用从头来
模型只改了一点点(比如调了某个右端项)时,单纯形法可以复用上一次的最优基接着解,这个过程叫 hot start,通常比冷启动快很多个量级。做参数扫描、滚动计划这类"同一个模型反复小改"的场景时,这条特性最值钱。
看懂了后台流程,就可以接一个更"真实"的任务:解一个模型文件,把结果落成可交付的产物。
处理真实任务:从MPS文件到结果导出
两种标准模型文件格式
命令行和readModel都认两种格式:.mps(MPS 格式)和.lp(CPLEX LP 格式),按扩展名自动识别,还支持.gz压缩文件。用建模语言生成的模型,导出成其中任意一种就能进 HiGHS。
把解和基写到文件里
命令行用--solution_file写解、--write_basis_file写最终基;Python 里对应writeSolution方法。把结果写成文件的好处是可以交给下游流程分析,也可以留作复现凭证;如果只是想快速看一眼,直接从getSolution取值更快。
状态不是Optimal时的常见排查
碰到 Infeasible,大概率是约束互相打架,可以启用 IIS 功能找出一组最小不可行约束,定位到具体哪几条在冲突;碰到 Unbounded,检查目标方向和某个缺失的边界。另外数据里量级差太大(比如 1e-8 和 1e8 并存)时容易出现数值问题,先做 scaling 再求解通常更稳。
任务跑通后,第一个问题往往是"能不能再快点、稳点"——下面是回报最高的三个调优方向。
求解慢时的3个调优方向 ⚡
最影响结果的三个选项
presolve:取值 on/off/choose,预处理总开关,慢就先查它solver:choose/simplex/ipm/ipx/hipo 等,手动指定算法parallel加threads:开并行、控线程数
命令行里直接拼在末尾即可,例如highs model.mps --presolve=off --time_limit=60,前者关掉预处理、后者限制 60 秒。
用选项文件管理参数
参数一多就别在命令行里堆了,写进选项文件再用--options_file加载;Python 里更灵活,h.setOptionValue("time_limit", 60)一行搞定。仓库里 check/sample_options_file 是一份现成样例,全部选项及其含义见选项定义文档。
大规模问题:时间限制、内存与可复现
三条实用建议:给time_limit设个上限(单位秒),到点提前终止并汇报当前状态,避免无限等待;MIP 的random_seed固定后结果可复现,调参对比时务必先锁住它;模型本身保持稀疏存储,HiGHS 内部按稀疏结构处理,密度太高的系数矩阵会拖慢预处理和分解。
调优属于"用顺手之后的事"。等你准备深入,真正需要的是文档、示例和测试这三类"地图"。
深入下去:文档、示例与测试用例指路
官方文档三个入口
- docs/src/guide/:basic 讲基础流程,advanced 讲进阶用法,numerics 讲数值细节
- docs/src/solvers.md:每个求解器的原理、适用场景和关键选项
- docs/src/interfaces/:Python、C++、C、C#、Fortran 各语言的分篇教程
examples/ 是可以直接跑的教科书
几个值得按顺序读的文件:examples/minimal.py 最小建模;examples/call_highs_from_python_highspy.py 完整"建模—求解—读结果"流程;examples/knapsack.py 二值变量加热启动;examples/network_flow.py 与 examples/multi_objective.py 则示范网络流和多目标。代码比文档短,改一改就能跑,是最快的学习方式。
用 check/ 的测试用例验证行为
check/ 目录是完整的测试套件,check/instances/里还有一批标准小模型(avgas.mps、smalllp.mps 等)。不确定某个行为时,先搜对应的测试(比如 TestPresolve.cpp)看官方是怎么断言的,比自己试错快得多。
HiGHS 的设计思路其实很克制:接口少、三段式流程清晰、其余全部交给选项。走到这里,安装、求解、调优、深入的路径已经完整走了一遍。
下一步:打开 examples/minimal.py,把目标和约束换成你手头正在处理的那个问题,跑一次h.run()——这就是你和 HiGHS 的第一次真正合作。
【免费下载链接】HiGHSLinear optimization software项目地址: https://gitcode.com/GitHub_Trending/hi/HiGHS
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考