GLPK ソルバーエンジン
GNU Linear Programming Kit (GLPK) は、線形計画問題(LP)および混合整数計画問題(MIP)を解くために長年広く使われている実績あるソルバーパッケージです。
インストール
GLPK は glpk.js を介したオプションの peer dependency として提供されます:
bash
npm install glpk.jsライセンスに関する注意点 (GPL-3.0)
GLPK は GNU General Public License 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"と判定されることはありません)
解の取得可否
- 変数の解(
model.values,var.value)および目的関数値(model.objectiveValue)は、有効な主問題解が存在する場合("Optimal"または"Feasible")にのみ格納されます。 - 解が得られなかった場合(
Infeasible,Unbounded,Unknown,Error)、model.objectiveValueおよび各変数のvalueはnullとなり、偽のゼロ埋め解が返されることはありません。
LP と MIP の違い
- 線形計画問題 (LP): シンプレックス法で求解され、最適解では双対変数(潜在価格
constraint.dual)および余剰(constraint.slack)が格納されます。 - 混合整数計画問題 (MIP): 分枝カット法で求解され、整数条件を満たす主問題解が得られます(離散最適化では双対変数は定義されないため省略されます)。