HiGHS 从 0 到跑通:3 个业务场景上手线性规划优化求解器

发布时间:2026/10/23 8:34:44
HiGHS 从 0 到跑通:3 个业务场景上手线性规划优化求解器
HiGHS 从 0 到跑通3 个业务场景上手线性规划优化求解器【免费下载链接】HiGHSLinear optimization software项目地址: https://gitcode.com/GitHub_Trending/hi/HiGHS下周的排产计划卡在你桌面上已经两天了两条产线、一台关键设备只有 80 小时可用每个产品赚钱不同各生产多少利润才最大或者你正在做配送——5 个仓库、12 个客户怎么派单总运费最低这类问题的共同结构是一堆变量、一组线性约束、一个要最大化或最小化的目标。这就是线性规划LP问题而 HiGHS 是一款 C 编写的高性能线性规划求解器pip 一行装好Python 里十几行代码就能出结果。HiGHS 能解什么题LP、QP、MIP 边界一览它覆盖三类问题LP变量可连续取值如产量、流量、QP目标函数带二次项如投资组合风险项、MIP部分变量必须取整数如开不开这条航线。求解器内部有单纯形法沿着约束的角点一步步走到最优和内点法从可行域内部直接逼近最优两套算法默认会自动帮你挑。适合的场景排产、运输网络、资源分配、物流路由、组合优化。不适合的场景变量量级爆炸的非凸组合问题整数变量上千且约束极松的 MIP 谁都快不了、非凸二次规划、以及随机规划——后者你得自己拆解成子问题再调用。pip 一行装好30 秒跑通第一个例子pip install highspyimport highspy h highspy.Highs() x1 h.addVariable(lb-highspy.kHighsInf) # 变量可取负值 x2 h.addVariable(lb-highspy.kHighsInf) h.addConstrs(x2 - x1 2, x1 x2 0) # 两条线性约束 h.minimize(x2) # 最小化 x2 h.run() print(h.getInfo().objective_function_value)输出1.0这就是仓库里 examples/ 的最小例子。如果你想在 C 侧编译源码比如嵌进自己的 C 工程拉下仓库后两行 CMake 即可要求 CMake 3.15cmake -S . -B build -DCMAKE_BUILD_TYPERelease cmake --build build --parallel 4三个业务场景实战排产、运输、整数分配场景一车间排产LP连续变量问题设备只有 80 小时A 每件赚 30、B 每件赚 25各生产多少利润最大建模思路变量是两种产品的产量连续即可约束是设备工时上限和产能上限。import highspy h highspy.Highs() x1 h.addVariable(0, 80, 30) # 产品A上限80件单件利润30 x2 h.addVariable(0, 150, 25) # 产品B h.addConstr(4*x1 2*x2 80) # 设备工时 h.maximize(30*x1 25*x2) h.run() print(list(h.getSolution().col_value), h.getInfo().objective_function_value)结果怎么读col_value按变量顺序给出取值。这里解出 A、B 各 10 件利润 550——设备工时刚好用满说明这条约束卡住了多一小时设备就能再多赚钱。场景二运输网络最短路径MIP0-1 变量问题5 个节点的路网从 A 到 D 走哪条边总里程最短建模思路每条边一个 0-1 变量选不选这条边每个节点加一条流量守恒约束——出去的减去进来的起点等于 1、终点等于 -1、其余为 0。这正是仓库 examples/network_flow.py 的写法下面是不依赖 networkx 的版本import highspy h highspy.Highs() h.silent() E {(A,B):2.0, (B,C):3.0, (A,C):1.5, (B,D):2.5, (C,D):1.0} x h.addBinaries(list(E), objE) # 选边边权作目标 out lambda n: h.qsum(x[e] for e in E if e[0]n) inn lambda n: h.qsum(x[e] for e in E if e[1]n) h.addConstrs(out(A)-inn(A)1, out(B)-inn(B)0, out(C)-inn(C)0, out(D)-inn(D)-1) h.minimize() h.run() print([e for e, v in h.vals(x).items() if v 0.5])结果怎么读选中(A,C)和(C,D)即 A→C→D总长 2.5。把边换成仓库-客户、边权换成运费就是完整的运输派单模型。场景三整数约束的资源分配0-1 背包问题预算只够装 11 个单位重量5 件设备价值和重量不同装哪几件总价值最大建模思路整数问题的关键就一步——把连续变量声明成整数/0-1 变量addBinaries其余写法不变。import highspy h highspy.Highs() h.silent() x h.addBinaries(5) h.addConstr((x * [4, 3, 1, 5, 4]).sum() 11) # 重量约束 h.maximize((x * [8, 5, 3, 11, 7]).sum()) # 总价值 h.run() print([int(v) for v in h.val(x)])结果怎么读[1, 0, 1, 1, 0]——选第 1、3、4 件设备价值 22。注意整数问题的耗时随变量数量增长很快几十个 0-1 变量毫秒级上千个就该去调第四节里的开关了。 跑慢了这几个开关先试一遍所有参数用h.setOptionValue(参数名, 值)设置在run()之前调用开关用法什么时候用presolveoff/on默认开预处理会先化简问题大幅提速但调试模型、想看原始变量取值时可关掉solversimplex/ipm/ipx/pdlp大规模稀疏 LP 试试内点法ipm注意 MIP 只认默认值乱设会被忽略并告警time_limit如3600限时求解超时会返回当前最好的可行解parallelonMIP 搜索多线程两个高频报错速查编译报 CMake 版本错误仓库要求 CMake 3.15 起先升级编译不过再确认编译器支持 C11。运行告警Solver ipm is not available for MIPMIP 走的是分支定界不支持指定 LP 求解器删掉这条设置即可。model status返回kInfeasible不是求解器坏了是你的约束互相矛盾先用presolveoff缩小排查范围。接下来往哪走改第一个例子把 30 秒例子里的变量和约束换成你手上真实的数据重点熟悉addVariable/addConstr/getSolution这套三件套API 细节都在 highspy/highspy/highs.py。照着例子抄examples/ 里有多目标、分支定价、网络流等完整脚本每个文件头部的注释就是建模说明。往下钻一层预处理逻辑在highs/presolve/MIP 搜索框架在highs/mip/想验证行为改动可以跑 check/ 里的回归测试。排产表、运输单、分配方案——当你下次再被这类问题卡住时先把变量和约束列成一行行的线性式剩下的交给h.run()。【免费下载链接】HiGHSLinear optimization software项目地址: https://gitcode.com/GitHub_Trending/hi/HiGHS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考