動的計画法とは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > デジタル大辞泉 > 動的計画法の意味・解説 

どうてき‐けいかくほう〔‐ケイクワクハフ〕【動的計画法】


動的計画法

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/06/02 02:33 UTC 版)

動的計画法(どうてきけいかくほう、: Dynamic Programming, DP)は、計算機科学の分野において、アルゴリズムの分類の1つである。対象となる問題を複数の部分問題に分割し、部分問題の計算結果の記録を利用して全体の問題を解く手法を総称してこう呼ぶ。

定義

細かくアルゴリズムが定義されているわけではなく、下記2条件を満たすアルゴリズムの総称である。

  1. 帰納的な関係の利用:より小さな問題例の解や計算結果を帰納的な関係を利用してより大きな問題例を解くのに使用する。
  2. 計算結果の記録:小さな問題例、計算結果から記録し、同じ計算を何度も行うことを避ける。帰納的な関係での参照を効率よく行うために、計算結果は整数、文字やその組みなどを見出しにして管理される。

概要

「動的計画法(dynamic programming)」という言葉は1940年代リチャード・E・ベルマンが最初に使いはじめ、1953年に現在の定義となった[1]

効率のよいアルゴリズムの設計技法として知られる代表的な構造の一つである。対象となる問題を帰納的に解く場合にくり返し出現する小さな問題例について、解を表に記録し表を埋めていく形で計算をすすめ、冗長な計算をはぶくアルゴリズムのことをいう。特定のアルゴリズムを指すのではなく、上記のような手法を使うアルゴリズムの総称である。一般的に、帰納的な定義にしたがって再帰法でアルゴリズムを作ると計算結果の再利用は行わないが、入力が単純な構造で解が等しくなることの確認が容易であるとき、同じ入力について計算済であることの確認、結果の再利用をメモリ領域を消費して行い、計算を高速化する。初歩的な説明で使われるフィボナッチ数の計算、ハノイの塔の必要移動回数の計算などでは、一次元の表(列)によって指数オーダーの計算時間を入力の数の大きさに対して線形時間に落とすことができる。(ただし、これらの級数の計算では、漸化式で参照するのは高々 2 つ前の計算結果だけなので、変数を1, 2 個用意してループすればことたりる。)効果が顕著なのが組合せ問題で、文字列の近似照合(編集距離の計算)、ナップサック問題の解法などが、二次元の表により指数時間の手続きが多項式時間に効率化される有名な例である。マルチプルアラインメントのように表が三次元以上必要になると、時間に対するトレードオフとなるメモリ領域量が大きくなりすぎるため、規模の大きな入力には実用的でなくなる。

近似アルゴリズムの分野では、多項式時間での解法が存在しないと思われる一部の問題に対して、この方法を適用することで、擬似多項式時間では最適解を得ることができる。

実現方法

以下の2種類の実現方法がある。

  • 履歴管理を用いるトップダウン方式(: top-down with memoization) - 分割統治法において、計算結果を記録(メモ化)して再利用する方法。再帰を併用する場合はメモ化再帰: memoized recursion)とも呼ばれる。
  • ボトムアップ方式: bottom-up method) - 先に部分問題を解いていく方法

適用条件

最適化問題に適用する場合、一般的に、以下の2つが適用する問題に成立していないといけない。(厳密には成立しなくても動的計画法の定義は満たせる)

  • 部分構造最適性: optimal substructure)や最適性原理: principle of optimality[2]
  • 部分問題重複性: overlapping subproblems

部分構造最適性とは、以下の2条件が成立していることをさす。

  1. 部分問題も同じ最適化問題が成立している
  2. 部分問題間が独立している

部分問題を解き、それを利用して、全体の最適化問題を解く戦略のため、部分構造最適性が動的計画法には必要である。部分構造最適性の例として、最短経路問題では、A → B → C という最短経路において、A → B や B → C も最短経路でないといけない(このことは背理法により証明可能)。また、部分問題間が独立であるためには、部分問題で資源の共有があってはならない。最短経路問題では A → B と B → C で同じ辺が出現しないため(同じく背理法により証明可能)、資源の共有が発生していない。貪欲法においても厳密解を求めるのなら部分構造最適性は必要である。

部分問題重複性とは、同一の部分問題が繰り返し出現することである。動的計画法では重複する部分問題の計算結果を記録し再利用する事により計算量を削減する。

厳密なことを書くと、全体問題と部分問題は完全に同一である必要性はなく、また、部分問題間が独立でなくても、それらが何らかの計算式により依存関係を解決し結合させる方法があれば、部分構造最適性が成立しなくても動的計画法の定義を満たすアルゴリズムは作れる。しかし、そのような実用例は少ない。

例題

動的計画法の適用例を示す。

フィボナッチ数列

フィボナッチ数列とは第 n 項の値が第 n - 1 項と第 n - 2 項の和となる数列のことである。この問題は最適化問題ではない。

定義を直接実装したプログラム

定義に基づいてプログラムを作成すると、次のようになる。

int fib(unsigned int n) {
    switch (n) {
        case 0: return 0;
        case 1: return 1;
        default: return fib(n - 1) + fib(n - 2);
    }
}

例えば、このプログラムを使ってフィボナッチ数列の第5項を求める場合を考えてみる。このプログラムは再帰的に呼び出されるので、その様子を以下に示す。

  fib(5) 
= fib(4) + fib(3) 
= (fib(3) + fib(2)) + (fib(2) + fib(1)) 
= ((fib(2) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1)) 
= (((fib(1) + fib(0)) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1)) 

このように最終的に fib(0) と fib(1) の呼び出しに収束し、fib(0) と fib(1) の呼び出し回数の和が結果の値となる。この方法を用いたフィボナッチ数列の計算量は

Optimization computes maxima and minima.
非線形(制約付き)
凸最適化
組合せ最適化
メタヒューリスティクス

動的計画法

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2019/06/08 02:55 UTC 版)

シーケンスアラインメント」の記事における「動的計画法」の解説

動的計画法(英語: dynamic programming)の代表的な手法として、グローバルアラインメントについては Needleman-Wunsch法(ニードルマン=ウンシュ法)、ローカルアライメントについてはSmith-Waterman法(スミスウォーターマン法)がある。例えタンパク質アライメントでは、アミノ酸一致不一致対しして置換マトリックス参照してスコア付与しギャップにはペナルティ付与するような計算である。

※この「動的計画法」の解説は、「シーケンスアラインメント」の解説の一部です。
「動的計画法」を含む「シーケンスアラインメント」の記事については、「シーケンスアラインメント」の概要を参照ください。


動的計画法

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2019/06/08 02:55 UTC 版)

シーケンスアラインメント」の記事における「動的計画法」の解説

動的計画法は、理論的にはいくつシーケンスに対して適用可能である。しかし、n次の時間メモリ空間要するため、3配列上の場合にはそのまま適用されることはほとんどない標準の動的計画法ではまずすべてのクエリペアが使用され、アライメントスペース(英: alignment space)を中間的な位置可能なマッチギャップ考慮して満たす。やがて2つのシーケンスアライメントの間の基本的なアライメント構成されるこの方式は計算コストが高いが、その全体的な最適解保証少数シーケンス正確に配置する必要があるときに有用である。動的計画法の計算コストを減らすためのひとつの方式はそれは「ペア総計」の最適化関数信頼するものだが、ソフトウェアパッケージMSA実装されている。

※この「動的計画法」の解説は、「シーケンスアラインメント」の解説の一部です。
「動的計画法」を含む「シーケンスアラインメント」の記事については、「シーケンスアラインメント」の概要を参照ください。


動的計画法

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2014/10/19 20:24 UTC 版)

多重整列」の記事における「動的計画法」の解説

大局的に最適な多重整列求めるためには動的計画法を用いる。アミノ酸配列場合は、ギャップペナルティと、あるアミノ酸から他のアミノ酸への置換起こりやすさを示す置換行列パラメータとして与える。核酸配列場合にもギャップペナルティ置換行列用いるが、置換行列置換起きか否かのみを考慮した単純なものを使う場合が多い。 独立したn個の配列整列するために、単純にペアワイズアラインメントn次元拡張すれば良い。しかしnの増加伴って計算量指数的に増加し配列長さをLとしてO(Ln))、NP完全であることが示されている。

※この「動的計画法」の解説は、「多重整列」の解説の一部です。
「動的計画法」を含む「多重整列」の記事については、「多重整列」の概要を参照ください。


動的計画法

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/02/28 01:04 UTC 版)

「アルゴリズム」記事における「動的計画法」の解説

部分問題最適解から全体最適解得られるような構造問題や、同じ部分問題最適解様々な問題解法に有効であるよう問題場合、動的計画法を使って既に計算済みの解を再計算するのを避けることができ、解法効率化できる。例え重み付けのあるグラフでの最短経路求め場合始点隣接する全ての頂点について最短経路分かっていれば、容易に最短経路求められる。動的計画法とメモ化密接な関係がある。分割統治法との違いは、分割統治法では部分問題多少なりとも独立しているのに対して、動的計画法では部分問題重複している。単純な再帰との違いは、再帰部分キャッシュ化またはメモ化する点である。部分問題互いに独立している場合メモ化何の役にも立たない。したがって、動的計画法はあらゆる複雑な問題解法とはならない。動的計画法では、メモ化あるいは既に解かれ部分問題の表を使うことによって、指数関数的性質をもつ問題多項式レベル複雑性削減することができる。

※この「動的計画法」の解説は、「アルゴリズム」の解説の一部です。
「動的計画法」を含む「アルゴリズム」の記事については、「アルゴリズム」の概要を参照ください。


動的計画法

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/08/05 00:36 UTC 版)

強化学習」の記事における「動的計画法」の解説

動的計画法(dynamic programming)は環境ダイナミクス状態遷移確率および報酬)が既知の場合使える手法

※この「動的計画法」の解説は、「強化学習」の解説の一部です。
「動的計画法」を含む「強化学習」の記事については、「強化学習」の概要を参照ください。


動的計画法

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/06/28 01:24 UTC 版)

木分解」の記事における「動的計画法」の解説

1970年代始めに、グラフの上の広い範囲組合せ最適化問題が、グラフ次元(木幅関係するパラメータ)が制限されている場合には動的計画法によって効率的に解けることが知られていた。その後多くNP完全アルゴリズム問題固定され木幅グラフに対して木分解用いた動的計画法で効率的に解けることを、1980年代終わり数人研究者独立発見した。 例として、木幅kのグラフ最大独立集合を見つける問題考える。この問題を解くために、木分解ノード任意に一つ選んで根とする。木分解ノードXiに対してDiXiの下のノードXj全体和集合とする。独立集合S ⊂ Xiに対して、A(S,i)をDi独立集合Iであって、I ∩ Xi = Sを満たす最大のもののサイズとする。同様に隣接するノードXi , Xj(Xjの方が根に近い)と独立集合S ⊂ XiXjに対して、B(S,i,j)をDi独立集合Iであって、I ∩ XiXj = S満たす最大のもののサイズとする。AとBは木をボトムアップにたどることによって以下のように計算することができる: A ( S , i ) = | S | + ∑ j ( B ( S ∩ X j , j , i ) − | S ∩ X j | ) {\displaystyle A(S,i)=|S|+\sum _{j}\left(B(S\cap X_{j},j,i)-|S\cap X_{j}|\right)} B ( S , i , j ) = max S ′ ⊂ X i S = S ′ ∩ X j A ( S ′ , i ) {\displaystyle B(S,i,j)=\max _{S'\subset X_{i} \atop S=S'\cap X_{j}}A(S',i)} ここで、 A ( S , i ) {\displaystyle A(S,i)} の式における和は X i {\displaystyle X_{i}} の子ノード全体をわたる。 各ノードと辺において、A(S,i)やB(S,i,j)を計算べき集合Sの個数高々2k+1である。そのため、kが定数ならば、1ノードおよび1辺あたりの計算定数時間でできる。最大独立集合大きさは根のノード格納されている最大の値であり、最大独立集合自身も(普通の動的計画法のアルゴリズムのように)最大値からバックトラックを行うことで計算できる。そのため、決められ木幅グラフ最大独立集合問題線形時間解ける類似のアルゴリズムによって、他の多くグラフ問題を解くことができる。 この動的計画法によるアプローチは、機械学習において、決められ木幅グラフにおける確率伝搬法を行うen:junction tree algorithm用いられる。また木幅計算し木分解構成するためにも用いられる典型的には、そのようなアルゴリズム最初に木幅近似し、その近似した木幅木分解構成し次にその木分解の上で動的計画法を行うことで正確な木幅計算する

※この「動的計画法」の解説は、「木分解」の解説の一部です。
「動的計画法」を含む「木分解」の記事については、「木分解」の概要を参照ください。

ウィキペディア小見出し辞書の「動的計画法」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

カテゴリ一覧

すべての辞書の索引



Weblioのサービス

「動的計画法」の関連用語


2
100% |||||


4
ディー‐ピー デジタル大辞泉
100% |||||





9
ナップザック問題 デジタル大辞泉
58% |||||


動的計画法のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



動的計画法のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
デジタル大辞泉デジタル大辞泉
(C)Shogakukan Inc.
株式会社 小学館
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアの動的計画法 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaのシーケンスアラインメント (改訂履歴)、多重整列 (改訂履歴)、アルゴリズム (改訂履歴)、強化学習 (改訂履歴)、木分解 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2024 GRAS Group, Inc.RSS