logo

線形計画法のシンプレックス法 📂最適化理論

線形計画法のシンプレックス法

ビルドアップ 1

x1,x20x_{1} , x_{2} \ge 0 に関して、次の線形計画問題が与えられたとしよう。 Maximizex1+x2subject tox1+x21x13x22 \begin{matrix} \text{Maximize} & & x_{1} & + & x_{2} \\ \text{subject to} &-& x_{1} & + & x_{2} & \le & 1 \\ & & x_{1} & & & \le & 3 \\ & & & & x_{2} & \le & 2 \end{matrix} つまり、与えられたすべての制約条件を満たしながら x1+x2x_{1} + x_{2} を最大化したい。これを方程式形式に変えるためには、スラック変数 x3,x4,x50x_{3}, x_{4}, x_{5} \ge 0 を導入して Maximizex1+x2subject tox1+x2+x3=1x1+x4=3x2+x5=2 \begin{matrix} \text{Maximize} & & x_{1} & + & x_{2} \\ \text{subject to} &-& x_{1} & + & x_{2} & + & x_{3} & & & & & = & 1 \\ & & x_{1} & & & & & + & x_{4} & & & = & 3 \\ & & & & x_{2} & & & & & + & x_{5} & = & 2 \end{matrix} のように表せばいい。これをもう一度辞書またはテーブルに表すと、元の x1x_{1}x2x_{2}非基底変数となって右側に残り、x3x_{3}x4x_{4}x5x_{5}基底変数になって左側に行く。 ζ=0+x1+x2x3=1+x1x2x4=3x1x5=2x2 \begin{matrix} \zeta & = & & 0 & + & x_{1} & + & x_{2} \\ x_{3} & = & & 1 & + & x_{1} & - & x_{2} \\ x_{4} & = & & 3 & - & x_{1} & & \\ x_{5} & = & & 2 & & & - & x_{2} \end{matrix} N={1,2}B={3,4,5} \mathcal{N} = \left\{ 1, 2 \right\} \\ \mathcal{B} = \left\{ 3, 4, 5 \right\} ここで、ζ=ζˉ+x1+x2\zeta = \bar{\zeta} + x_{1} + x_{2}ζˉ\bar{\zeta} は、最適解に対する目的関数の関数の値、つまり現在どのくらい最適化されているかを意味すると見なせる。以下のいくつかの方程式を通して変数置換を行うと、ζ\zeta の右側にある非基底変数の符号を - に統一できるかもしれない。すると、すべての非基底変数に 00 を代入したとき ζ=ζ?x?1x?2 \zeta = \zeta_{?} - x_{?_{1}} - x_{?_{2}} この形が最大の値になることだ。言い換えれば、これが実行可能基底を得ることだ。非基底変数の符号の中に ++ があるということは、まだ ζ?\zeta_{?} を増やす可能性があることを意味し、すべての符号が - であるということは、これ以上 ζ?\zeta_{?} を大きくすることはできないという意味になる。これがまさにシンプレックス・メソッドのアイデアだ。問題を代数的に解いているように見えるが、スラック変数を加えて方程式形式を作った時点で解空間がシンプレックスになるため、シンプレックスという表現を使う。

実践

ζ=0+x1+x2x3=1+x1x2x4=3x1x5=2x2 \begin{matrix} \zeta & = & & 0 & + & x_{1} & + & x_{2} \\ x_{3} & = & & 1 & + & x_{1} & - & x_{2} \\ x_{4} & = & & 3 & - & x_{1} & & \\ x_{5} & = & & 2 & & & - & x_{2} \end{matrix} N={1,2}B={3,4,5}(x1,x2,x3,x4,x5)=(0,0,1,3,2)ζˉ=0 \mathcal{N} = \left\{ 1, 2 \right\} \\ \mathcal{B} = \left\{ 3, 4, 5 \right\} \\ \left( x_{1} , x_{2} , x_{3}, x_{4} , x_{5} \right) = (0,0,1,3,2) \\ \bar{\zeta} = 0

実際に上の例をシンプレックス・メソッドで解いてみよう。

ζ\zeta の形を見ると x1x_{1}x2x_{2} の両方を増やすことはできるが、制約条件から x4=3x1x_{4} = 3 - x_{1}x5=2x2x_{5} = 2 - x_{2} を知っているので、今のところ大きな意味はなさそうだ。x3x_{3} についての条件を参考にすると x2=1+x1x3 x_{2} = 1 + x_{1} - x_{3} 新しい辞書は次のようになる。

ζ=1+2x1x3x2=1+x1x3x4=3x1x5=1x1+x3 \begin{matrix} \zeta & = & & 1 & + & 2x_{1} & - & x_{3} \\ x_{2} & = & & 1 & + & x_{1} & - & x_{3} \\ x_{4} & = & & 3 & - & x_{1} & & \\ x_{5} & = & & 1 & - & x_{1} & + & x_{3} \end{matrix} N={1,3}B={2,4,5}(x1,x2,x3,x4,x5)=(0,1,0,3,2)ζˉ=1 \mathcal{N} = \left\{ 1, 3 \right\} \\ \mathcal{B} = \left\{ 2, 4, 5 \right\} \\ \left( x_{1} , x_{2} , x_{3}, x_{4} , x_{5} \right) = (0,1,0,3,2) \\ \bar{\zeta} = 1

方程式で確認できるように、目的関数の値を元の比較で 11 だけ増やした。この辞書を修正するプロセスを ピボットステップ2と呼び、非基底から基底に入ったx2x_{2} のような変数を入口変数、基底から非基底に出た x3x_{3} のような変数を退出変数3と呼ぶ。ここで混乱してはいけないのは、目的関数自体を変えたわけではなく、これからも変えることはないということだ。ビルドアップからずっとそのように、既存の変数は単に他の変数を代表するだけであり、以前には見えなかった定数項が今見えるようになっただけだ。

今の辞書で私たちがやるべきことはかなり明確だ。x1x_{1} を増やせば、その倍の量だけ目的関数が大きくなりそうだ。同じ理由で x5x_{5} を入口変数として使うと x1=1+x3x5 x_{1} = 1 + x_{3} - x_{5} となり、

ζ=3+x32x5x1=1+x3x5x2=2x5x4=2x3+x5 \begin{matrix} \zeta & = & & 3 & + & x_{3} & - & 2x_{5} \\ x_{1} & = & & 1 & + & x_{3} & - & x_{5} \\ x_{2} & = & & 2 & & & - & x_{5} \\ x_{4} & = & & 2 & - & x_{3} & + & x_{5} \end{matrix} N={3,5}B={1,2,4}(x1,x2,x3,x4,x5)=(1,2,0,2,0)ζˉ=3 \mathcal{N} = \left\{ 3, 5 \right\} \\ \mathcal{B} = \left\{ 1, 2, 4 \right\} \\ \left( x_{1} , x_{2} , x_{3}, x_{4} , x_{5} \right) = (1,2,0,2,0) \\ \bar{\zeta} = 3

となる。ζ\zeta の右側に x3x_{3} がまだ増える余地があるので、x3x_{3} を入口変数として使ってみると x3=2x4+x5 x_{3} = 2 - x_{4} + x_{5} となり、

ζ=5x4x5x1=3x4x2=2x5x3=2x4+x5 \begin{matrix} \zeta & = & & 5 & - & x_{4} & - & x_{5} \\ x_{1} & = & & 3 & - & x_{4} & - & \\ x_{2} & = & & 2 & & & - & x_{5} \\ x_{3} & = & & 2 & - & x_{4} & + & x_{5} \end{matrix} N={4,5}B={1,2,3}(x1,x2,x3,x4,x5)=(3,2,2,0,0)ζˉ=5 \mathcal{N} = \left\{ 4, 5 \right\} \\ \mathcal{B} = \left\{ 1, 2, 3 \right\} \\ \left( x_{1} , x_{2} , x_{3}, x_{4} , x_{5} \right) = (3,2,2,0,0) \\ \bar{\zeta} = 5

となる。これで、ζ\zeta の右側のすべての変数の符号が - であり、どの変数を触っても ζ\zeta が大きくなることはなく、最適化が完了したことがわかる。実際に、最初に与えられた線形計画問題 Maximizex1+x2subject tox1+x21x13x22 \begin{matrix} \text{Maximize} & & x_{1} & + & x_{2} \\ \text{subject to} &-& x_{1} & + & x_{2} & \le & 1 \\ & & x_{1} & & & \le & 3 \\ & & & & x_{2} & \le & 2 \end{matrix} x1=3x_{1} = 3x2=2x_{2} = 2 を代入して再計算してみると、すべての制約条件をよく満たし、目的関数の値も正確に ζ=ζˉ0=5\zeta = \bar{\zeta} - 0 = 5 であることが確認できる。


  1. Matousek. (2007). 線形計画法を理解して使う:p57~60。 ↩︎

  2. Matousek. (2007). 線形計画法を理解して使う:p59。 ↩︎

  3. Vanderbei. (2020). 線形計画法(5版):p0。 ↩︎