GLPK 求解器引擎
GNU Linear Programming Kit (GLPK) 是一套历史悠久、成熟稳健的单纯形法与内点法求解器软件包,专门用于求解大规模线性规划(LP)和混合整数规划(MIP)问题。
安装
GLPK 通过 glpk.js 作为可选的 peer dependency 提供:
bash
npm install glpk.js许可证注意事项 (GPL-3.0)
GLPK 采用 GNU 通用公共许可证 v3.0 (GPL-3.0) 授权。
- 由于 WaSHI 本体采用 MIT 许可证,
glpk.js绝不会静态打包在核心发布包中。 - 仅当你显式导入或调用
@ohtaman/washi/solvers/glpk时,它才会被动态加载。 - 当你在分发的产品中包含 GLPK 时,请确保项目的分发策略符合 GPL-3.0 许可证的要求。
基本用法
typescript
import { Model, expr, maximize } from "@ohtaman/washi";
import "@ohtaman/washi/solvers/glpk";
const model = new Model({ solver: "glpk" });
const x = model.continuous("x", { lb: 0, ub: 10 });
const y = model.continuous("y", { lb: 0, ub: 20 });
model.objective(maximize(expr`3 * ${x} + 2 * ${y}`));
model.constraint(expr`${x} + ${y} <= 15`, "cap");
await model.solve();
console.log("GLPK Status:", model.status);
console.log("Objective:", model.objectiveValue);结果语义与状态映射
求解器状态映射
GLPK 的返回码严格映射为 WaSHI 的 SolverStatus:
GLP_OPT(5)"Optimal"GLP_FEAS(2)"Feasible"(已找到可行的 MIP 整数解)GLP_INFEAS(3) /GLP_NOFEAS(4)"Infeasible"GLP_UNBND(6)"Unbounded"GLP_UNDEF(1) 及未识别/缺失的状态"Unknown"(绝不会被误判为"Optimal")
解的可用性
- 仅当存在有效的原始可行解(状态为
"Optimal"或"Feasible")时,才会暴露变量取值(model.values、var.value)和目标函数值(model.objectiveValue)。 - 对于求解失败或无可行解的情况(
Infeasible、Unbounded、Unknown、Error),model.objectiveValue为null,且各变量的value保持为null,不会捏造虚假的全零解。
LP 与 MIP 的区别
- 线性规划 (LP):使用单纯形法求解。对于最优解,会填充约束的对偶值(影子价格,通过
constraint.dual访问)和松弛量(constraint.slack)。 - 混合整数规划 (MIP):使用分支切割法(branch-and-cut)求解,生成满足整数约束的原始变量解;由于离散优化中对偶值在数学上未定义,因此省略对偶值。