概要
動的計画法は部分問題の解を結合することによって問題を解く方法である.
動的計画アルゴリズムは以下の四つの段階を経て開発される.
- 最適解の構造を特徴づける
- 最適解の値を再帰的に定義する
- 最適解の値を計算する
- 計算された情報から一つの最適解を構成する
今回の記事では以下の二つの問題に対して動的計画法を用いて考える.
- ロッド切り出し問題
- 連鎖行列積問題
ロッド切り出し問題
入力:長さnインチの金属の棒,長さに対応する価格の表
出力:収益の最大値
全通りの切り方(左端から長さiで切るor切らない)を試すと,となり指数時間かかってしまう.
動的計画法適応
棒の分割をのように表すと,長さnの金属棒の収益の最大値は以下で表せる.
より一般化してみる.
トップダウン型の動的計画法
ボトムアップ型の動的計画法
実行時間は漸近的に同じ.
部分問題グラフ
部分問題グラフは有効グラフであり,部分問題を一つの頂点として表し,部分問題xの最適解を決定する手順に直接的に部分問題yの最適解を利用するなら辺を繋ぐ.
典型的には,ある部分問題の解の計算時間はその部分問題に対応する部分問題グラフ上の頂点の次数(外向辺の数)に比例し,部分問題の数は部分問題グラフの頂点数と一致する.
連鎖行列積問題
入力:n個の行列
出力:の最小スカラー乗算回数
ただし今回は行列の行・列のサイズのみ必要な情報のため,に対して行列をとし,入力をとする.
括弧つけの個数をとしてとき,愚直に全ての括弧付けを調べる.
これを計算するとであり指数時間となる.
第一段階:最適括弧付けの構造
動的計画法適応にあたって問題が部分構造最適性を持つか調べる.
としたとき,積を計算した結果である行列をと書く.
部分構造最適性を証明する.
の最適括弧付けは,積をとで分割すると仮定する.このときとは最適な括弧つけでなければならない.
なぜなら,に対してより効率的な括弧つけがあったとするなら,のそれに置き換えたものを使うことでより効率的になるからである.も同様.
第2段階:再帰的な解
m[i,j]
を行列の計算に最小限必要なスカラー乗算回数とすると以下の漸化式がなりたつ.
上式ではk
を既知の値として考えているが,kはj-i
通りあるので未知とすると以下の式が成り立つ.
また分割地点kをs[i,j]
と定義する.
第3段階:最適コストの計算
ボトムアップの動的計画法を記述する.
実行時間は.
第4段階:最適解の構成
最適な分割地点をs[i,j]
に記録していたので,以下の関数により括弧付けを出力できる