動的計画(DP)


Dynamic Programming


再帰呼び出しとコメントの作成


フィボナッチ数列

  • 0と1で始まり、以前の2つの数の和を次項とする数列をフィボナッチ数列
  • と呼ぶ
  • フィボナッチ数列iを計算する関数Fを定義した.
  • F0 = 0, F1 = 1
  • Fi = Fi-1 + Fi-2 For i >= 2
  • フィボナッチ数列のi番目の項を返す関数は、
  • を再帰関数で実現することができる.

    フィボナッチ数の再帰関数を求めます

    fibo(n)
    	if n < 2
        	return n;
        else
        	return fibo(n-1) + fibo(n-2);
    前の関数のように実装されると,大量の繰返し呼び出しが存在する.
    では、重複を避ける方法はありますか?

    アノテーション

  • 注記は、コンピュータプログラムを実行するときに、以前に計算した値をメモリに格納し、再計算のたびに全体の実行速度を速める技術です.
  • 動的計画法の核心となっている.
  • 「Memorization」は文字通り「メモリを入れる」
  • である.

    アノテーションメソッドを使用したフィボナッチ


    memoに配列を割り当て、すべて0に初期化します.
    memo[0]を0に初期化し、memo[1]を1に初期化する
    fibo1(n)
    	IF n >= 2 AND memo[n] = 0
        	memo[n] = fibo1(n-1) + fibo1(n-2)
        return memo[n]
    注釈の限界...?
  • 追加のメモリ容量が必要
  • 再帰関数の呼び出しによりシステム呼び出しスタックが発生し、実行速度の低下またはオーバーフロー
  • を引き起こす可能性がある.

    どうてきけいかくほう


    ダイナミックプランニング(Dynamic Programming)は、GRADYアルゴリズムのような最適化問題を解決するアルゴリズムである.
  • 動的計画法はまず小部分の問題を解き、その後、これらの問題を利用して大部分の問題を解決し、最終的に与えられた問題を解決するアルゴリズム設計方法
  • である.
  • 動的計画法を適用する問題は、常に以下の条件を満たさなければならない.
  • オーバーラップサブ問題構造
  • 最適サブ構造
  • じょうちょうもんだいこうぞう

  • DPは、まず大きな問題を構成する小さな問題を解決する、次に、小さな問題の最適解を利用して大きな問題をループ的に解決する(DPは、通常、ドット式を用いるループ関係を明示的に表す)
  • .
  • DPは、問題のループ特性のため、以前に計算する小問題の解が他の場所で必要とされていた(重複するサブ問題)ため、DPは、解決する小問題の解を記憶空間に記憶する
  • .
  • このような保存された年は、必要な年を得るために計算を再計算することなく、計算を繰り返すことをどのように避けるか.

    さいてきローカルもんだいこうぞう

  • DPは、任意の最適化問題
  • には適用されない.
  • 所与の問題は、DP
  • を効果的に適用するために最適化の原則を満たさなければならない.
  • 最適化の原則は、ある問題の解が最適である場合、その解を構成する小さな問題の解も最適であるべきである.DPの方法自体が小問題の最適解を利用して大問題の最適解を求めるので
  • .

    分割征服VSダイナミックプランニング法


    分割征服

  • 関連しない部分に分割する問題
  • .
  • 部分問題再帰解決
  • 部分問題の解
  • を結合する
  • マージソート、クイックソート
  • DP

  • の一部の問題に関連がなければ適用されません.すなわち、部分的な問題共有がより小さい部分的な問題
  • すべての部分の問題は一度だけ計算され、結果
  • を保存して再使用する.
    DPは局所問題の間に依存関係がある
  • ex)E,F,G年Cの関係解決に用いる
  • この関係は問題によって異なり,多くの場合はっきり見えないが,含蓄のある順序である.
    分割征服はトップダウン方式,DPはアップ方式を採用する

    DPを適用して、3段階に分けます


  • 最適な海構造の特性を理解する
  • 問題は一部の問題
  • に分けられる.

  • 最適解の値の再定義
  • 部分問題の最適値に基づいて問題の最適値
  • を定義する.

  • アップメソッドを使用して最適解の値を計算する
  • の最小部分問題から解き始め、表
  • に保存する
  • 表に格納局所問題解を用いて,上位問題の最適解(アップメソッド)
  • を逐次求める.

    フィボナッチ数DPの適用

  • フィボナッチ数は、部分的な問題の答えから本問題の答えを得ることができるので、最適な部分構造からなる
  • である.
  • 問題は一部の問題
  • に分けられる.
  • 点火式
  • と定義
  • は最小の部分問題から解く.その結果はテーブルに格納され、テーブルに格納されたローカル問題の解を使用して親問題を解く.
  • fibo_dp(n)
    	f[0] = 0
        f[1] = 1
        for i in 2 -> n
        	f[i] = f[i-1] + f[i-2]
        return f[n]

    再帰アルゴリズムとは異なり,繰返し計算は行われなかった.繰り返し文が使用されているため、関数呼び出しがX


    小銭をさがす


  • 私は1元、4元、6元の硬貨を持っていますが、8元を探す必要があるときは、少なくともいくつかの硬貨を探したほうがいいですか?

  • 非常に近い:6元、1元、1元

  • ベスト:4元、4元
  • グリディ法は常に最良の解を求めているわけではない->DPに近づいてみよう!

    アップアクセス

  • C[n]=n元を取り戻したときの最適
  • 点火式:C[n]=MIN(n-1>=0->C[n-1]+1,n-4>=0->C[n-4]+1,n-6>=0->C[n-6]+1)
  • にこうけいすうを求める


    にこうていり

  • 多項式x+yの累積二乗(x+y)2について、展開する各xky 1-kの係数値定理
  • を求める
  • 具体的には、xky 1−kの係数は、二項係数と呼ばれるn個からk個の組み合わせの個数nCkである.
  • ダイナミックプランニング法による二項係数計算

    bino(n, k)
    	B[][]
        for i in 0 -> n
        	for j in 0 -> minimum(i, k)
            	if j=0 OR j=1
                	B[i][j] = 1
                else
                	B[i][j] = B[i-1][j-1] + B[i-1][j]
        return B[n][k]

    0/1 Knapsack

  • 0 kg容量のリュックサックに4種類のプレゼントがある場合、最大の価値を選ぶ方法は?
  • 5 kg/10万
  • 4 kg/40万
  • 6 kg/30万
  • 3 kg/50万
  • リュックサック(Knapsack)の問題は、n個の物品と1個の物品iの重量Wiと価値vi、リュックサック容量Wの場合、リュックサックの中の物品の最大の価値を探す問題である.ただし、リュックサックに入っている重量の合Wを超えないでください.
  • DPアクセスの使用


  • リュックの問題の部分を見つけるために、条件を見てみると
  • 東西、東西の重さ、東西の価値、リュックサックの容量には4つの要因があります.

  • ここで、物と物の重量は局所的な問題を定義するために必要である.

  • リュックが空いていることから、荷物を一つずつリュックに入れることと入れないことは、今リュックに入っているものの価値の和によって決まるからです.

  • また、リュックサックに荷物を入れるときは、リュックサックの容量が基準を超えているかどうかをチェックします.

  • したがって,リュックサック問題の一部の問題は以下のように定義できる.
  • W=バックパック容量(キログラム)
  • (vi,wi)=価値(万元)、重量(kg)品
  • K[i,w]=物品1~iを考慮する、(仮)リュックの容量がwの場合の最大値
  • .

  • K[i,w]を再帰的に表す

  • for i in 0 -> n : k[i, 0] = 0
    for w in 0 -> w : k[0, w] = 0
    
    for i in 1 - > n
    	for w in 1 -> w
        	if wi > w
            	K[i, w] = K[i-1, w]
            else
            	K[i, w] = max(vi + K[i-1, w - wi], K[i-1, w])
        return K[n, W]
    d