探索
[Wikipedia|▼Menu]
.mw-parser-output .hatnote{margin:0.5em 0;padding:3px 2em;background-color:transparent;border-bottom:1px solid #a2a9b1;font-size:90%}

この項目では、検索アルゴリズムについて説明しています。動物の探索行動については「探索行動」をご覧ください。

探索(たんさく、: search)とは、特定の制約条件を満たす物を見つけ出す行動のこと。

何か問題を解くに当たって、有効な解析的な解法を用いることのできない場合は、試行錯誤によって解を得る場合もある。

一部のアルゴリズムは、元々、機械学習と並んで人工知能の分野のアルゴリズムであるが、現在はその他の分野にも応用されている。類義語として検索: search)も参照。
概要

探索アルゴリズムとは、大まかに言えば、問題を入力として、考えられるいくつもの解を評価した後、解を返すアルゴリズムである。

まず解くべき問題を状態(: state)と状態変化(行動、: action)に分ける。最初に与えられる状態を初期状態(: initial state)といい、目的とする状態は最終状態(ゴール、: final state, goal)と呼ばれる。初期状態から最終状態に至る、状態及び状態変化の並びが解である。将棋ならば、盤面の駒の配置と指し手の持ち駒が状態であり、交互に駒を動かすことが状態変化に当たる。

問題を解く類として研究されているアルゴリズムの多くは探索アルゴリズムである。ある問題の考えられるあらゆる解の集合を探索空間と呼ぶ。力まかせ探索や素朴な(知識を用いない)探索アルゴリズムは、探索空間を探索する手法としては最も単純で直観的である。一方、知識を用いた探索アルゴリズムはヒューリスティクスを使って探索空間の構造に関する知識を利用し、探索にかかる時間を削減しようとする。
知識を用いない探索

知識を用いない探索(: uninformed search)アルゴリズムは、その問題の性質を考慮しない手法である。そのため汎用的に実装可能であり、抽象化のおかげで幅広い問題に同じ実装を適用可能である。問題は、探索空間が一般に非常に大きいため、問題が小さいものでもそれなりの時間がかかる点である。処理を高速化するため、知識を用いた探索だけを行う場合がある。
リスト探索

線形探索

二分探索

内挿探索

リスト探索(: list search)アルゴリズムは、おそらく最も基本的な探索アルゴリズムである。その目的は、リストから何らかのキーを持つ要素を探すことである。計算機科学では最もよく研究されている分野であり、それらのアルゴリズムの計算量もよく研究されている。

その中でも最も単純なアルゴリズムが線型探索であり、単純にリスト上の各要素を調べていく。その実行時間は O(n) であり、n はリスト上のアイテムの数だが、どんなリストでも適用可能である。

より洗練されたリスト探索アルゴリズムとして二分探索があり、実行時間は O(log n) である。データが多ければ多いほど線型探索よりも性能がよくなるが、探索の前にソートしておく必要があり、またランダムアクセスが可能でなければならない。

特別なデータ構造を使った別の探索法として、平衡2分探索木を使った探索があり、実行時間は二分探索と同様にO(log n) である。これは、二分探索の考え方を拡張して、挿入と削除を高速化できるようにしたものである。

内挿探索は分布が偏っていないソートされた大きなリストでは二分探索よりも性能が良いが、最悪ケースでは O(n) となる。

グローバーのアルゴリズム量子コンピュータ用アルゴリズムで、ソートされていないリストでの線型探索に対して二乗の性能向上をもたらす。しかし、量子コンピュータはまだ実用化されていない。

ハッシュテーブルもリスト探索に使われ、実行時間は平均ケースでO(1)であるが、必要とする領域は他のデータ構造よりも多く、最悪ケースでは O(n) もかかる。リスト探索のデータ構造については、ハッシュテーブルも参照されたい。

なお、線型探索、二分探索、平衡2分探索木といったリスト探索アルゴリズムの多くは、若干のコスト追加で、与えられたキー以下(あるいは以上)の全ての値を探すことができる。このような探索を「範囲探索(: range search)」と呼ぶ。例外はハッシュテーブルであり、そのような探索を効率的には行えない。
文字列探索詳細は「文字列探索」を参照

文字列内のパターンを探索する。接尾辞木などのデータ構造で効率化することもある。

クヌース-モリス-プラット法

ボイヤー-ムーア文字列検索アルゴリズム

エイホ-コラシック法

ラビン-カープ文字列検索アルゴリズム

Bitapアルゴリズム

複数のファイルにまたがる物を全文検索という。
木探索・グラフ探索

木探索・グラフ探索共通

幅優先探索

深さ優先探索

反復深化深さ優先探索

深さ制限探索


均一コスト探索

双方向探索

グラフ探索固有

最短経路問題

ダイクストラ法

ベルマン-フォード法


最小全域木

プリム法

クラスカル法


最大フロー問題・最小カット問題

フォード・ファルカーソンのアルゴリズム

エドモンズ・カープのアルゴリズム


巡回セールスマン問題

最近傍法


連結度

最大隣接順序

最小次数順序

木探索: tree search)アルゴリズムは、探索技法の中心である。のノードを探索するもので、最初から木が明示される場合と動的に木を生成する場合がある。基本原則は、データ構造から1つのノードを選び、その後者を調べてデータ構造に追加していく。このデータ構造の操作にあたっては、同じレベルのノードから順に見ていく幅優先探索と葉ノードまで見ていってバックトラックする深さ優先探索がある。

グラフ理論の問題の多くは、グラフ探索アルゴリズムで解くことができる。いくつかの物は木探索アルゴリズムを拡張したものと見ることもできる。
知識を用いた探索「ヒューリスティクス」も参照

知識を用いた探索(: informed search)では、問題に固有のヒューリスティクス(評価関数)を補助として使う。良いヒューリスティックを使えば、探索は劇的に改善される。知識を用いた探索アルゴリズムの多くは木探索である。最良優先探索A* などがある。知識を用いない探索と同様、これらはグラフ向けにも拡張可能である。

局所探索法山登り法

最良優先探索

A*

メタヒューリスティクス詳細は「メタヒューリスティクス」を参照

汎用的に使えるヒューリスティクスをメタヒューリスティクスという。

焼きなまし法 - 確率的探索アルゴリズムの一種

タブーサーチ - 探索が局所解で停滞するのを防ぐ技法

遺伝的アルゴリズム - 探索空間を縮小させるヒューリスティクスとして進化の考え方を使う。

蟻コロニー最適化

粒子群最適化


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:26 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef