列生成法
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2025/04/17 06:44 UTC 版)
![]() | この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。(2024年5月) |
列生成法(れつせいせいほう、英: Column generation)は大規模線形計画問題を効率的良く解く解法である。
列生成法が用いられる背景として多くの実用上の線形計画問題は大規模な問題であり、変数の数が非常に多いことから、これらの変数から組み合わされる基底解を生成して最適解を求めるという手続きが現実的でないことが挙げられる。このことから、列生成法では所与の線形計画問題から一部分の変数のみからなる問題について考え、これを解いて目的関数値を改善することができる変数を逐次追加していくアルゴリズムである。ある時点で目的関数を改善できるような変数が見つからなくなった時点で列生成法は終了する。列生成法を適用することで考えられる利点として、解の生成が少ない段階で最適解が求まり早期に終了することが挙げられる。実際線形計画問題では最適解において変数の値がゼロとなる非基底解となる変数が非常に多いことがあるため、非基底変数について考慮せず少数の変数のみゼロでない値、基底解となることを考慮し、最適解を求めることが期待できる。
ほとんどの場合において列生成法は大規模な線形計画問題に対して効果的な解法となる。古くから効果的な例として知られている問題は板取り問題が挙げられる。またダンツィーグ・ウルフ分解は線形計画問題に列生成法を適用する際に度々用いられる技法となっている。他に列生成法が適用される問題として、乗務員スケジューリング問題、配送経路問題、容量制約付きpメディアン問題などが知られている。
アルゴリズム
列生成法では主問題と部分問題からなる二つの問題について考える。主問題とは元の線形計画問題のことを指し、主問題から一部の変数のみを残した問題については限定主問題と呼ばれる[1]。一方、部分問題とは限定主問題の目的関数値を改善することができる新たな変数を求めるために解かれる問題である。
列生成法は以下の手続きによって構成されている:
- (限定)主問題と部分問題を初期化する。
- (限定)主問題を解く。
- 部分問題を解いて(限定)主問題を改善するような新たな変数を求める。
- もし新たな変数が見つかれば、(限定)主問題に新たな変数を加えてステップ2へ戻る。
- そうでなければ、(限定)主問題を解いて求まった最適解が主問題(元の問題)の最適解として列生成法は終了する。
追加する変数を求める
列生成法において最も手間のかかる手続きは限定主問題の目的関数値を改善する新たな変数を求めることが挙げられる。この手続きで新たな変数を求める方法として各変数の目的関数の係数に対応する被約費用が負の中で最も小さいものを求めることが多い(ただし、最小化問題と仮定する[注釈 1]。)。もし負の被約費用を持つ変数が存在しなければ、限定主問題の最適解は元の問題の最適性の条件を満たし、元の問題の最適解が求まったこととなる。
しかしながら、元の問題の変数が非常に多い場合にはすべての被約費用について調べることは効率が悪い。そのため、被約費用が最も小さい変数についてのみ調べて、被約費用が正負について調べれば元の問題の最適解であるかを判定することができる。被約費用の最も小さい変数を調べる方法として価格付け問題を解くことで実現できる。なお価格付け問題は元の問題の構造に依存して構成される問題であり、価格付け問題の解きやすさは問題によって異なっており、価格付け問題が容易に解ける問題に対しては列生成法が効果的な解法となることがある。限定主問題の目的関数値の改善を判定するため部分問題の目的関数は限定主問題に含まれていない変数の被約費用、すなわち双対変数に対応している。また制約条件は主問題の制約条件と同一である。問題の構造を利用した組合せアルゴリズムによって部分問題を容易に解くことで列生成法は効率よく動作することができる。
以下では変数の被約費用の求め方について述べる。ここでは標準形の線形計画問題について考える:
Optimization computes maxima and minima.
一般 | |
---|---|
微分可能 |
凸最小化 | |||||||
---|---|---|---|---|---|---|---|
線形 および 二次 |
|
系列範例 (Paradigms) | |||||
---|---|---|---|---|---|
グラフ理論 |
| ||||
ネットワークフロー (最大流問題) |