貪欲法

貪欲法(どんよくほう、: greedy algorithm)は、アルゴリズムの一種、欲張り法(よくばりほう)、グリーディ算法(グリーディさんぽう)ともいう。

概要

貪欲法は局所探索法と並んで近似アルゴリズムの最も基本的な考え方の一つである。

このアルゴリズムは問題の要素を複数の部分問題に分割し、それぞれを独立に評価を行い、評価値の高い順に取り込んでいくことで解を得るという方法である。動的計画法と異なり保持する状態は常に一つであり、一度選択した要素を再考する事は無い。このため得られる解は最適解であるという保証は無いが部分問題の解法と単純なソートのみでプログラムを実装することが可能であり、多くの問題に対して多項式時間での近似アルゴリズムとなる。

問題を複数に分割する方法は特に組合せ最適化問題と相性が良い。問題によっては厳密解(最適解)を得られたりするものや最低限の精度保証(近似度)が算出可能なものもある。このため、現在でもしばしば同問題の研究に用いられている。

厳密解(最適解)が求まる例

いくつかのアルゴリズムは貪欲法を基本戦略としているものの、厳密解が求まることが証明されている。

最適化問題で厳密解となるには、動的計画法同様、部分構造最適性(: optimal substructure)、つまり、部分問題を解き、それを利用して最適化問題の厳密解が解けることが必要である。

厳密解(最適解)が求まらない例

以下にナップサック問題での適用例を示す。この問題の場合は各荷物ごとに分割して評価することで適用可能である。

  1. ナップサック問題の各荷物の評価値を決定する。(価値)÷(容積)という数字がよく使われる。
  2. 評価値の一番高い荷物を選ぶ。
  3. その荷物をナップサックに入れても最大容量を越えないならナップサックに入れる。
  4. 全ての荷物を評価値の順に選び上記の操作を繰り返す。

なお、この問題に関しては貪欲法では最適解を得られない。

擬似コード

以下の擬似コードでは荷物の数を n とし、荷物 i の容量と価値はそれぞれ w[i]、c[i] に格納されているとする。評価値は e[i] ナップサックの現在の容量は W 最大容量は max に格納されており、返すコストを C とする。

for i := 1 .. n
  e[i] := c[i] / w[i]

e[i] の値を降順にソートして、 c[i], w[i] をそれに合わせて並び替える。

C := 0; W := 0
for i := 1 .. n
  if w[i] + W < max then
    W := W + w[i]
    C := C + c[i]
return C
非線形(無制約)
… 関数 
勾配法
収束性
準ニュートン法
その他の求解法
ヘッセ行列
  • 最適化におけるニュートン法(英語版)
The graph of a strictly concave quadratic function is shown in blue, with its unique maximum shown as a red dot. Below the graph appears the contours of the function: The level sets are nested ellipses.
Optimization computes maxima and minima.
非線形(制約付き)
一般
微分可能
凸最適化
凸縮小化
  • 切除平面法(英語版、デンマーク語版、ドイツ語版、スペイン語版)
  • 簡約勾配法
  • 劣勾配法(英語版)
線型 および
二次
内点法
ベイズ-交換
  • 単体法
  • 改訂シンプレックス法(英語版)
  • 十字法(英語版)
  • レムケの主ピボット操作法(英語版)
組合せ最適化
系列範例
(Paradigms)
グラフ理論
最小全域木
最大フロー問題
メタヒューリスティクス
  • カテゴリ(最適化 • アルゴリズム) • ソフトウェア(英語版)
ソート
比較ソート
線形時間ソート
並行ソート
非効率的
グラフ
探索
リスト
木・グラフ
文字列
最短経路問題
最小全域木
最大フロー問題
最小カット問題
線型計画問題
順序統計量
計算幾何学
種類
その他
カテゴリ