Algorithms > ApproximationAlgorithm

近似アルゴリズム


近似度


入力xに対する近似アルゴリズムAのコストをC_A(x)
また(計算時間を無視すれば求めることのできる)厳密解のコストをO_{OPT}(x)とする。
任意のxに対して、ある定数d \geq 0が存在して、
 C_A(x) \leq rC_{OPT}(x) + d
が成り立つとき、Aの近似度はrであるという。

ここで、コストは計算量を表すのではない。(それだと「近似度」というネーミングが不適切だし)。
例えばビン詰問題においては、ビンの本数をコストとする。

代表的な問題


ビン詰問題 (Bin-Packing Problem)


入力がn個の数(アイテムと呼ばれる)u_1,u_2,\cdots,u_n (0 < u_i < \leq 1.0)で与えられ、
ビンの容量を1.0とする。できるだけ少ないビンを使って、全てのアイテムを詰め込むには?


初適合アルゴリズムの近似度に関する定理
初適合アルゴリズムとは、各アイテムについて、途中までしか詰まってない全てのビンを順に見ていって、
最初に適合した(そのアイテムを詰められる容量が空いている)ビンに詰める方法である。
初適合アルゴリズムの近似度は7/4(=1.75)以下である。(実は、近似度=1.7の証明があるらしい。)

集合被覆問題(Set Cover Problem)


イメージとしては、
複数種類の部品を全て調達するために、最低何社の部品メーカーと契約すればよいか?という問題である。

正確に書くと、入力は集合U={u_1,u_2,\cdots,u_n}
k個のUの部分集合S_1,S_2,\cdots,S_k (S_i \subseteq U)で、
S_{i_1} \cup S_{i_2} \cup \cdots \cup S_{i_j} = Uとなる最小個数の
S_{i_1},S_{i_2},\cdots,S_{i_j}を求めよ、という問題である。

集合被覆問題に対しては、まだカバーできていないUの要素を一番多くカバーするS_iから
順に選んでいくという典型的な貪欲アルゴリズムが非常に有効であり、
これよりも本質的に良いアルゴリズムは知られていない。

定理
上述の貪欲アルゴリズムの近似度は1 + \ln n以下である。

分割問題


整数の集合が与えられたとき、その要素の和が等しくなるように集合を2つに分割せよ、という問題。

形式的に書くと、整数の集合X = {i_1,i_2,\cdots,i_n}が与えられたとき、
その部分集合Y \subseteq Xに対してその中の整数の和を\sigma(Y)
つまり、\sigma(Y) = \sum_{i_j \in Y}i_jとおき、
 \sigma(Y) = \sigma(X - Y)
であるようなYを求めよという問題である。解がない場合も当然起こりうる。

分割問題の多項式時間アルゴリズムに関する存在定理
分割問題に対しては、近似度が1にいくらでも近くなる多項式時間アルゴリズムが存在する。

ちなみに、近似度を1にいくらでも近づけられる近似アルゴリズムは、
PTAS(多項式時間近似図式、 Polynominal-Time Approximation Scheme)と呼ばれる。

近似アルゴリズムの考え方の基本は、
分割の仕方の組み合わせ自体の場合の数は非常に多いのであるが、
その多くの組み合わせについて、要素の和は同じ値を取るので1つにまとめてしまえる、
というところにある。


最終更新:2012年02月07日 11:47