HiGHS 线性优化求解器实战指南:从建模、求解到读懂 MIP 结果
HiGHS 线性优化求解器实战指南从建模、求解到读懂 MIP 结果【免费下载链接】HiGHSLinear optimization software项目地址: https://gitcode.com/GitHub_Trending/hi/HiGHS凌晨两点你盯着那张排了三天产线的调度表变量上万、约束十几万之前用的工具跑到一半内存爆掉或者干脆给了个时间超限。如果你正被这类模型太大算不动的卡点缠住HiGHS 值得你花十分钟认识一下——它是一款开源的线性优化求解器核心用 C 编写同一套内核同时覆盖线性规划LP、二次规划QP和混合整数规划MIP并提供 Python、C、Fortran、C# 等多语言接口。这篇文章不讲概念堆砌按你实际动手的顺序来先装上再用一道生产计划题完整走一遍回头才去理解它内部到底用了哪些算法最后给你一套让它更快更稳的调法。HiGHS 是什么以及它适不适合你的题一句话定位HiGHS 是一个什么规模的规划题都能接的开源优化求解器。它适合的场景纯连续变量的 LP产能分配、配比、网络流带整数/0-1 变量的 MIP排班、选址、投诚-下不为例的投资组合离散化目标函数里出现变量乘积的凸 QP组合优化、最二次调节你已有.mps或.lp格式模型文件想换个更快的引擎重算。也要说清楚它的边界HiGHS 不处理非凸 QPHessian 必须半正定也不是通用的非线性规划NLP求解器——如果约束里有三角函数、指数这类一般非线性得另找工具。另外它不内置建模语言生态像 PuLP、Pyomo 那种高层建模模型本身还是要你自己用数组或变量表达式搭起来但它对稀疏矩阵的处理效率正是为此优化的。先让它跑起来pip 一条命令 vs 源码编译快速安装 highspy大多数读者的正确入口是 Python 包highspy一条命令搞定不用碰编译器pip install highspy装完别急着写模型先做版本自检这也是后续排查版本不对的基线import highspy print(highspy.HIGHS_VERSION_MAJOR, highspy.HIGHS_VERSION_MINOR, highspy.HIGHS_VERSION_PATCH)能打印出三个整数例如 1 15 1对应仓库里的 Version.txt就说明内核加载正常。源码编译什么时候才需要只有两种情况值得走这条路你要把 HiGHS 链进自己的 C/C 工程或者需要启用 HiPO 内点法这类可选项。HiGHS 用 CMake 构建要求CMake 3.15、编译器支持C11见 CMakeLists.txtgit clone https://gitcode.com/GitHub_Trending/hi/HiGHS cd HiGHS cmake -S . -B build -DCMAKE_BUILD_TYPERelease cmake --build build --parallel 4注意这里CMake 配置阶段拒绝在源码目录内构建in-source build 会直接报错必须像上面这样指定独立的build目录第一次跑就报这个错的人不在少数。更多平台细节可翻 安装文档。拿一道题完整走一遍生产计划建模光装不算会用。用两小时把下面这道题敲完你对 highspy 的手感就有了。题面工厂生产 A、B 两种产品。A 单件利润 30 元B 单件 25 元每件 A 占 1 个工时、B 占 2 个工时日工时上限 180两种产品共用一条原材料线合计日产量不超过 120 件A 日产能上限 100 件、B 上限 150 件。求利润最大的产量组合。建模到出结果整个流程就是建变量 → 加约束 → 定目标 → 求解 → 取数五步import highspy h highspy.Highs() # 1. 决策变量含上下界 x_a h.addVariable(lb0, ub100) # 产品 A 产量 x_b h.addVariable(lb0, ub150) # 产品 B 产量 # 2. 资源约束工时 原材料 h.addConstrs(x_a 2 * x_b 180, x_a x_b 120) # 3. 目标函数最大化利润 h.maximize(30 * x_a 25 * x_b) # 4. 求解 h.run() # 5. 读取结果 print(h.modelStatusToString(h.getModelStatus())) # 应输出 optimal print(最优利润:, h.getInfo().objective_function_value) print(A 产量:, h.variableValue(x_a)) print(B 产量:, h.variableValue(x_b))跑完你会发现getModelStatus()告诉你最优/不可行/无界三态之一getInfo()里能拿到目标值、迭代次数、求解时间这些运行信息单个变量的取值用variableValue()直接读。最偷懒的路径其实是readModel()——如果模型已经是文件一行h.readModel(check/instances/avgas.mps)就能读入仓库自带的那道经典汽油调配题avgas.mps然后照样run()。想上 MIP 也几乎不用换姿势建变量时多一个参数把类型改成整数即可x h.addVariable(lb0, ub10, typehighspy.HighsVarType.kInteger)更多官方写法可以对着 examples/ 里的minimal.py、call_highs_from_python.py逐行看那几段就是本小节代码的直接出处。它内部到底怎么算四把刀各管一段看完上面的用法再回头看内核理解会顺很多。HiGHS 默认策略是solver choose它会按题型自动选算法但你知道刀在哪才能在自己慢的场景下手干预。单纯形法highs/simplex/HiGHS 的原生主力默认跑对偶单纯形因为它比原始单纯形更快也更稳。中小规模、结构一般的 LP它就是答案需要整数解时MIP 的每个节点上解的松弛也是它。内点法highs/ipm/仓库里带了两套——IPX预条件共轭梯度类串行和 HiPO并行内点需要 BLAS 支持。大规模、超稀疏的问题上内点法常常几十次迭代就收敛是题大但连续时的选择。分支定界 MIPhighs/mip/整数问题没有捷径HiGHS 靠预处理收缩问题 分支定界 割平面冲突池、割池、Modk 割等一整套分离器推进。你看到的 MIP 耗时99% 花在这里。预处理 presolvehighs/presolve/所有算法跑之前先过一遍——固定松弛变量、删冗余约束、收紧界。这是默认开启的免费加速别手动关它除非你在做数值实验。对照着 求解器文档看更细的分法QP 走主动集法highs/qpsolver/MIP 用分支定界LP 按规模在单纯形与内点之间切换。经验法则一句话千级变量以下随便用默认几万变量以上的稀疏连续题把内点法放进候选。让它更快更稳三个旋钮和两个高阶开关参数文件与关键选项调优的入口是选项完整清单在 options 定义文档格式示例见 sample_options_file。Python 里逐项设h.setOptionValue(presolve, choose) # 预处理 h.setOptionValue(parallel, choose) # 并行 h.setOptionValue(threads, 0) # 0 自动定线程数 h.setOptionValue(time_limit, 3600.0) # 限时 1 小时写成文件的话就是每行一个选项 值C 侧可以整体传入。三个真正影响速度的旋钮presolve确认它是on或choose别图省事关成offparallel/threadsMIP 是多线程受益最大的场景先放开让它跑再按机器核数收敛threadstime_limit生产调度类任务给求解器设时限超时后 HiGHS 会返回当前最优整数解比干等强。两个容易漏掉的高阶开关多目标当利润最大和工时最省互相打架时HiGHS 支持加权多目标用法可参考仓库里的 multi_objective.py 和 multiple_objective.py思路都是给每个目标定权重再合成求解。敏感性分析ranging想知道利润 30 元降到多少才会换生产方案打开这个开关h.setOptionValue(ranging, on) h.run() status, ranging h.getRanging()ranging会给出目标系数、变量界、约束右端项各自的变化区间以及最优基保持不变的范围——做方案稳健性判断时直接省掉反复重算。卡住了这样排查cmake一跑就报 in-source build 或版本错误两件事挨个查CMake 是否 ≥ 3.15-B build这个输出目录参数是不是漏了。HiGHS 明确禁止在源码目录里直接编译报错信息本身就是提示。编译到一半报一堆语法错误十有八九是编译器没吃到 C11。确认编译选项里有-stdc11以上项目默认就是 C11见 CMakeLists.txt 的CMAKE_CXX_STANDARD。LP 秒回MIP 半小时没影这是正常现象不是坏了——整数问题本质上就是这么贵。能做的确认 presolve 没被关把parallel放开把明显是整数的变量都标成整数而不是只标一部分让 presolve 有更多压缩空间。实在不行就time_limit兜底拿次优解。求解报 infeasible不可行先用最小变量集复现再逐条注释约束定位是哪几条互相打架仓库的check/instances/里就备了infeasible-mip0.mps这类专门用于调试不可行的样例。HiGHS 也内置 IIS不可行不可约子集能力见 HighsIis.h能帮你从上万条约束里揪出真正冲突的那几行。想用 HiPO 但链接报错HiPO 依赖 BLAS这是 HiGHS 少有的外部要求Linux 上apt install libopenblas-dev后加-DHIPOON重新配置细节见 安装文档。下一步往哪走想啃内核入口就一个头文件highs/Highs.hAPI 注释相当完整想看真实模型check/instances/ 里从 8 变量的avgas.mps到几千变量的网络流都有拿来就能readModel()练手要读设计文档docs/src/ 下的 solvers、parallel、installation 三篇优先再按兴趣进 guide学习路线建议先用minimal.py建立手感 → 挑一道check/instances/的 MPS 题跑通读取流程 → 再给自己的题加整数变量体会 MIP 的耗时从哪来 → 最后才去碰 presolve 和选项细节。跑通第一个 MIP 那天你会发现所谓求解器选型其实没那么玄模型写对、presolve 开着、时限设好HiGHS 的默认策略已经替你做了大部分决策。剩下的就是把它嵌进你的排产或调度系统里让它替你把凌晨两点的活干了。【免费下载链接】HiGHSLinear optimization software项目地址: https://gitcode.com/GitHub_Trending/hi/HiGHS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考