JP / EN

Simplex Method

線形計画法(Linear Programming)の基礎:頂点を渡り歩くアルゴリズム

1. イントロダクション:最適化への幾何学的アプローチ

線形計画法(Linear Programming; LP)とは、一次不等式で表される制約条件の下で、一次関数の目的関数(コストや利益)を最小化または最大化する数理最適化手法です。

その幾何学的な意味は明確です。制約条件によって定義される多面体(Polytope:実行可能領域)の「頂点(Vertex)」を探索することに他なりません。LPの基本定理により、「最適解が存在するならば、それは必ず領域の頂点のいずれかにある」ことが保証されています。

シンプレックス法(単体法)は、この性質を利用し、ある頂点からスタートして、目的関数値が改善される隣接頂点へと次々に移動(ピボット演算)を繰り返すことで、有限回の手順で最適解に到達するアルゴリズムです。

2. 一般形式(General Form)

$n$ 個の変数 $\boldsymbol{x} = (x_1, x_2, \dots, x_n)^T$ に対する線形計画問題の標準形は、以下のように記述されます。

目的関数(Objective Function)

\[ \text{Maximize } Z = \boldsymbol{c}^T \boldsymbol{x} \]

(ここで $\boldsymbol{c}$ は利益係数ベクトル)

制約条件(Constraints)とスラック変数

シンプレックス法を適用するためには、不等式制約 $\boldsymbol{Ax} \le \boldsymbol{b}$ を等式制約に変換する必要があります。非負のスラック変数 $\boldsymbol{s} = (s_1, \dots, s_m)^T$ を導入し、以下のような連立一次方程式の形(正準形)に変形します。

\[ \boldsymbol{Ax} + \boldsymbol{I}\boldsymbol{s} = \boldsymbol{b} \] \[ \boldsymbol{x} \ge 0, \quad \boldsymbol{s} \ge 0 \]
単位行列 $I$ の重要性:
ここで $\boldsymbol{I}$ は $m \times m$ の単位行列(Identity Matrix)です。各制約式($m$ 本)に対してそれぞれ独立したスラック変数が係数 $1$ で加わるため、スラック変数部分の係数行列は対角成分がすべて $1$、それ以外が $0$ となります。これにより、計算の初期段階で $\boldsymbol{x}=\boldsymbol{0}, \boldsymbol{s}=\boldsymbol{b}$ という「自明な実行可能基底解」を即座に見つけることができます。

3. アルゴリズムの一般手順

  1. 初期化(Initialization): 実行可能基底解(通常は原点 $\boldsymbol{x}=0$)を見つけ、初期シンプレックス表(Tableau)を作成する。
  2. 最適性判定(Optimality Test): 目的関数の行($Z$行)を見る。係数がすべて非負であれば、現在の解が最適解であるため終了する。
  3. 入替変数の決定(Pivot Column): 目的関数を最も改善させる変数(係数が最も負である変数)を選び、これを「入替変数」とする。
  4. 離脱変数の決定(Pivot Row): 制約条件を破らずにその方向にどれだけ進めるか、定数項と係数の比(Ratio)を計算する(最小比テスト)。比率が最小となる行の基底変数を「離脱変数」とする。
  5. ピボット演算(Pivot Operation): ガウスの消去法を用いて、選ばれたピボット要素を「1」に、それ以外の列要素を「0」にする。
  6. ステップ2に戻る。

4. 具体的な計算例(Example Problem)

理論の理解を深めるため、以下の具体的な生産計画問題を解いてみましょう。

目的関数(利益最大化):
\[ \text{Max } Z = 4x_1 + 3x_2 \]
制約条件:
\[ \begin{cases} x_1 + x_2 \le 40 \quad \dots (1) \\ 2x_1 + x_2 \le 60 \quad \dots (2) \\ x_1, x_2 \ge 0 \end{cases} \]

5. Step 1: 初期シンプレックス表の作成

スラック変数 $s_1, s_2$ を導入して等式化し、表を作成します。
($Z - 4x_1 - 3x_2 = 0$ と変形)

基底 $Z$ $x_1$ $x_2$ $s_1$ $s_2$ 定数項 備考 (Ratio)
$s_1$ 0 1 1 1 0 40 $40/1=40$
$s_2$ 0 2 1 0 1 60 $60/2=30$ (Min)
$Z$ 1 -4 -3 0 0 0

判定: $Z$行に負の値があるため最適ではありません。$x_1$列(係数-4)を入替変数、$s_2$行(比率最小)を離脱変数とします。ピボットは 「2」 です。

6. Step 2: ピボット操作(1回目)

ピボット行全体を2で割り、他の行から $x_1$ を消去(掃き出し法)します。

基底 $Z$ $x_1$ $x_2$ $s_1$ $s_2$ 定数項 備考 (Ratio)
$s_1$ 0 0 0.5 1 -0.5 10 $10/0.5=20$ (Min)
$x_1$ 0 1 0.5 0 0.5 30 $30/0.5=60$
$Z$ 1 0 -1 0 2 120

判定: $Z$行にまだ負の値(-1)があります。$x_2$列を入替変数、$s_1$行を離脱変数とします。次のピボットは 「0.5」 です。

7. Step 3: ピボット操作(2回目・収束)

同様に行列演算を行います。

基底 $Z$ $x_1$ $x_2$ $s_1$ $s_2$ 定数項 備考
$x_2$ 0 0 1 2 -1 20
$x_1$ 0 1 0 -1 1 20
$Z$ 1 0 0 2 1 140 完了

結論:最適解の到達

$Z$行の係数がすべて非負(0以上)になったため、計算終了です。

  • 最適解: $x_1 = 20, \quad x_2 = 20$
  • 最大利益: $Z = 140$

幾何学的には、原点 $(0,0)$ から出発し、頂点 $(30,0)$ を経由して、最適頂点 $(20,20)$ に到達したことを意味します。