2. 線形計画と凸2次計画
まずはシンプルで分かりやすいこともあり、線形計画(および凸2次計画)を扱う。また線形問題の中でという前提で双対性など他の最適化問題にも当てはまる理論を少し扱う*1。
2.3 線形計画問題の解法
線形計画問題には、単体法と内点法という代表的な解法が存在する。
2.3.2 2段解法
単体法では、初回の実行可能基底形式が必要だった。しかし一般には、そうした実行可能基底形式が標準形から直接見つかるとは限らない。そこで2段解法が提案された。
2段解法は、第1段階で実行可能性を判定し実行可能基底形式を求める。第2段階では、第1段階で得られた基底形式を初回の実行可能基底形式として、単体法のアルゴリズムを適用して最適解を求める。2段解法では、第1段階と第2段階のいずれでも単体法が用いられる。
線形計画問題の標準形
が与えられたとき、第1段階では、強制的に実行可能基底形式を作るために人為変数と呼ばれる非負変数を導入し、標準形の等式制約を以下のように変形する。
ただし右辺はすべて非負であるとする。そうでない場合は両辺にを掛けてとする。ここで
が上の変形式において実行可能基底解になることは明らかである。この問題に単体法を適用して人為変数がすべて零になるような実行可能解が見つかれば、が元の線形計画問題の実行可能基底解になる。このためには目的関数の代わりに
を最小化することを考える。元の問題が実行可能解を持つならば、の最小値は零であり、そのとき人為変数はすべて零になる。他方でもし最小値がを満たすならば、すべての人為変数を零にすることはできないため、元の問題には実行可能解が存在しないことが分かる。ここまでが第1段階である。
変形式それぞれにおいてについて解き、これをに代入することで
を得る。ここで
とおいて、変形式に
を追加すれば実行可能基底形式が得られる。また第1段階ではを考慮する必要はないものの、第2段階で考慮すべく、当初から第1段階の基底形式に
を追加しておく。
線形計画問題の標準形が退化していない場合、各反復で新しい実行可能基底解に移る際に必ず目的関数の値が減少するため、同じ実行可能基底解が選ばれることはない。また実行可能基底解の選び方は高々通りしかないため、単体法は有限回の反復で最適解を得る、もしくは解が有界でないと判定して終了することが分かる。
他方で、退化している場合、目的関数値が減少せず、実行可能基底解の入れ替えを繰り返して同じ実行可能基底解を選ぶことがあり得る。このために単体法が終了しない現象が生じ得、これを巡回という。これはピボットを選択する際にを選ぶ自由度があることが原因である。
巡回対策を施した単体法のアルゴリズムとして、の巡回対策を用いた単体法がある:
(1) | 相対費用係数がを満たすならば最適解を得たことになるため終了する。そうでなければ(2)に移る。 | |
(2) | とする。 | |
(3) | ならば、目的関数が有界でないため終了する。そうでなければ(4)に移る。 | |
(4) | を満たすような添字を求める。もし最小値を与えるようなが複数存在する場合、そのうち最小のものをとする。 | |
(5) | をピボットとする掃き出しを実行して、の代わりにを基底変換とする新しい実行可能基底形式を構築する。 | |
(6) | (1)に戻る。 |
の巡回対策を用いた単体法は退化しているか否かに関わらず有限回の反復で終了することが知られている。
単体法はたいてい比較的少ない回数で終了するものの、最適解に到達するまでにすべての端点を巡らなければならない例が存在することが知られている。とはいえそのような事態は殆ど生じ得ない。
2.3.3 内点法
単体法と対照的に、内点法はの成分がすべて正であるような点を辿りながら最適解に到達する方法で、1984年にによって提案されたアルゴリズムを契機に大きく発展したものである。以下では内点法の中でも主双対内点法を考える。
標準的な形態での線形計画問題
および双対問題
の最適性条件は、
で与えられる。内点法では、このうち相補性条件にパラメータを導入して変形した
を考える。
この条件でとしたときの極限が最適性条件に帰着できる。ここでを固定すると、上記の解は一意に存在することが知られている。この解をとおくと、を変化させたときのそれらの軌跡は実行可能領域の内部を通る滑らかな曲線となることが知られているが、この軌跡は中心曲線と呼ぶ。中心曲線はで線形計画問題の最適解に収束する。内点法は、この中心曲線を近似的にトレースすることで最適解を得る手法である。
まず初期点をの成分がすべて正であるように選択する。そしてに対して中心曲線上の点
を考える。ただしはより小さくなるように選択する。これを最適性条件に代入することで
が得られる。ここで近似として最後の条件を無視すると、
であり、これらをまとめるとを未知数とする連立方程式
であり、その解は探索方向と呼ぶ。探索方向をで表すと、内点法の位置反復では現在の点を
と更新する。ここではステップ幅と呼ばれ、の成分がすべて正になる範囲の値に決められる。
2.3.4 内点法の多項式性
内点法の本質部分に当たる以下の定理を議論する。
定理2.7 内点法の定理 主双対内点法において、とし、ステップ幅としたものを考える。初期点が、として条件
を満たすものとする。このとき主双対内点は、すべてのについて、として条件
を満たすような内点実行可能解の点列を生成する。
この(i)は双対ギャップがデータの次元のみに依存する1次収束をすることを意味する。これがアルゴリズムの多項式性を担う本質的部分である。(ii)はを要素ごとに掛けたベクトルの各要素が概ね同水準にあることを示し、これがが中心曲線の近くに存在することを具体的に表現している。
(i)より、双対ギャップをある水準からにまで減らすのに反復回数はで抑えることができる。また1回の反復に必要な計算量は約であり、その主要な部分は探索方向の計算である。
2.3.5 Pythonによる実装例
#################### ### 線形計画問題 ### #################### import cvxpy as cp x1, x2 = cp.Variable(), cp.Variable() # 決定変数の定義 obj = cp.Maximize(20 * x1 + 60 * x2) # 目的関数 cons = [5 * x1 + 4 * x2 <= 80, 2 * x1 + 4 * x2 <= 40, 2 * x1 + 8 * x2 <= 64, x1 >= 0, x2 >= 0] # 制約 P = cp.Problem(obj, cons) # 最適化問題の定義 P.solve(verbose = True) # 最適化の実施 print(x1.value, x2.value) # 最適解の実施 print(P.value) # 最適解における目的関数値 # numpyによるベクトル・行列表記 import cvxpy as cp import numpy as np x = cp.Variable(2) # 変数の数を引数に c = np.array([20.0, 60.0]).T G = np.array([[5.0, 4.0], [2.0, 4.0], [2.0, 8.0], [-1.0, 0], [0, -1.0]]) # 制約 h = [80.0, 40.0, 64.0, 0.0, 0.0] obj = cp.Maximize(c.T @ x) cons = [G @ x <= h] P = cp.Problem(obj, cons) P.solve(verbose = True) print(x.value[0]) print(x.value[1]) print(P.value)
参考文献
*1:双対性は別に章を立てて扱う予定である。