分枝限定法のソースを表示
←
分枝限定法
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
'''分枝限定法'''(ぶんしげんていほう、{{lang-en-short|branch and bound, BB}})は、各種[[最適化問題]](特に[[離散最適化]]と[[組合せ最適化]])の最適解を求める汎用[[アルゴリズム]]である。'''分枝操作'''({{lang-en-short|branching operation}})と'''限定操作'''({{lang-en-short|bounding operation}})から構成される。全ての解候補を体系的に列挙するもので、最適化された量の上限と下限の概算を使って、最適でない候補は「ひとまとめに」捨てられる。 [[1960年]]、A. H. Land と A. G. Doig が[[線型計画法]]の手法として最初に提案した。 == 概要 == 関数 <math>f(x)</math> の最小値を求める最適化問題を考える。 <math>x \in S</math> とする。 分枝限定法には2つの手続きが必要である。 ; 分枝 : 第一は分枝操作である。場合分けにより部分問題に分割する。つまり、与えられた集合 <math>S</math> に対して、<math>S_1\cup S_2\cup \ldots =S</math> となるような複数の集合 <math>S_1, S_2, \ldots</math> に分割(分枝)する手続きである。<math>S_i</math> における <math>f(x)</math> の最小値を <math>v_i</math> としたとき、<math>S</math> における <math>f(x)</math> の最小値は <math>\min\{v_1, v_2, \ldots\}</math> である。この手続きを再帰的に適用することは'''分枝法''' (branching) と呼ばれ、各ノードが <math>S</math> の部分集合となるような[[木 (数学)|木]]([[探索木]])になる。なお <math>S_i \cap S_j \ne \emptyset</math> でも良い。 ; 限定 : 第二の手続きは、<math>S</math> の1つの部分集合 <math>S_i</math> の <math>f(x)</math> の最小値の上限と下限を計算する手続きである。これを'''限定法''' (bounding) と呼ぶ。 : 分枝限定法の鍵となるのは、あるノード(候補集合) <math>A</math> の下限が別のノード <math>B</math> の上限より大きければ、A は探索するまでもなく捨ててよいという考え方である。この工程を'''刈り込み''' (pruning) と呼び、一般に大域変数 <math>m</math> にそれまでに調べた部分の最小の上限値を保持するような実装で実現する。下限が <math>m</math> より大きいノードは捨てることができる。 : 再帰は候補集合 <math>S</math> が1つの元になった時点で停止するか、<math>S</math> の上限が下限と一致した場合に停止する。どちらにしても、停止したときの <math>S</math> のどの元も関数を最小値にする。 分枝限定法は、限定法の種類によって分類したり、探索木のノードの生成/検査方法で分類したりする。 分枝限定法の設計戦略は、状態空間木を問題を解くのに使うという点で[[バックトラッキング]]とよく似ている。これらの違いは、分枝限定法が木の走査順序を限定していないという点と、分枝限定法が最適化問題でしか使われないという点である。 [[動的計画法]]や[[貪欲法]]は部分問題の最適性が必要であるが、成立しない部分問題に対して、適切に場合分けして分枝することにより、分枝限定法でうまく行くこともある。 分枝が場合分けをするので[[並列コンピューティング|並列]]実装や[[分散コンピューティング|分散]]実装に適している。 == 効率的な分枝 == この手法の効率は、ノード分割手続きと上限および下限を推定する手続きに強く依存する。他の全ての条件が同じなら、オーバーラップしない部分集合に分割するのが最もよい。 理想的には、この手続きは探索木の全てのノードが刈りこまれるか解かれたときに停止する。その時点で刈りこまれていない部分は、上限と下限が関数の大域的最小値と等しくなっている。実際には、ある所定の時間が経過すると手続きを停止することが多く、その時点では刈りこまれていない部分の最大下限値と最小上限値が大域的最小値の[[区間 (数学)|区間]]を定義している。これとは別に時間制限ではなく、アルゴリズムを何らかの誤差基準で停止させる方法もある。例えば (最大 - 最小)/(最大 + 最小)がある特定値以下になった時点で停止させる。 この手法の効率は、分枝法と限定法に使われたアルゴリズムの有効性に強く依存する。間違った選択をすると分枝が繰り返され、全く刈り込みが行われず、あまりにも細かく分割されることになる。それは定義域を総当りするのと何ら変わりないことになり、多くの場合現実的でない。あらゆる問題でうまくいく限定法アルゴリズムは存在しないし、今後見つかるとも思えない。従って、分枝法と限定法のアルゴリズムは問題毎に設計する必要がある。 == 応用 == 分枝限定法は以下のような問題で使われる。 * [[ナップサック問題]] * [[非線型計画法|非線型計画問題]] * [[巡回セールスマン問題]] (TSP) * [[二次割り当て問題]] (QAP) * [[最大充足可能性問題]] (MAX-SAT) * [[最近傍探索]] (NNS) また、各種[[ヒューリスティクス]]の基盤でもある。例えば、上限と下限の差がある値以下になったとき分枝を止めたいという場合もある。これは、「実用には十分な」解を求めるのに使われ、必要な計算量を大幅に減らすことができる。特にコスト関数に[[ノイズ]]がある場合や統計的推定に基づくコスト関数にはこのような手法が現実的である。そのようなコスト関数は[[確率]]的に誤差を生じる可能性がある。例えば[[生物学]]で有機体間の進化的関係を評価する場合、何らかのヒューリスティックを用いないとデータが大きすぎる。 同じ理由で、[[ゲーム木]]の[[探索]]にも分枝限定法がよく使われ、例えば[[アルファ・ベータ法]]は分枝限定法の一種である。 == 関連項目 == * [[A*]] * [[アルゴリズム#設計パラダイムによる分類|設計パラダイムによるアルゴリズムの分類]] {{アルゴリズム}} {{最適化アルゴリズム|state=collapsed}} {{DEFAULTSORT:ふんしけんていほう}} [[Category:最適化アルゴリズムとメソッド]] [[Category:組合せ最適化]] [[Category:数学に関する記事]]
このページで使用されているテンプレート:
テンプレート:Lang-en-short
(
ソースを閲覧
)
テンプレート:アルゴリズム
(
ソースを閲覧
)
テンプレート:最適化アルゴリズム
(
ソースを閲覧
)
分枝限定法
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報