アルゴリズムイントロダクション15章 動的計画法

アルゴリズムイントロダクション輪講用の発表資料。

5年以上前 にアップロード

(2009年03月01日)

「アルゴリズムイントロダクション15章 動的計画法」の内容

  1. 動的計画法 2009/3/2 id:nitoyon アルゴリズムイントロダクション 15 章
  2. 動的計画法 (dynamic programming) 部分問題 を ボトムアップ に 解いて 統合 する
  3. 動的計画法のアルゴリズム 最適解 の 構造 を 特徴 づける 最適解 の 値 を 再帰的 に 定義 する ボトムアップ に 最適解 の 値 を 求 める 最適解 を 構成 する
  4. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5
  5. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5
  6. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5 15.1 組み立てライン スケジューリング
  7. 問題 車を組み立てる 2つのライン がある ライン1 ライン2 入口 出口
  8. 問題 車を組み立てる 2つのライン がある 各ライン には n 個 の ステーション S 1, j 、 S 2, j がある S 1,1 入口 出口 S 2,1 S 1,2 S 2,2 S 1,3 S 2,3 S 1, n -1 S 2, n -1 S 1, n S 2, n ・・・ n 個
  9. 問題 車を組み立てる 2つのライン がある 各ライン には n 個 の ステーション S 1, j 、 S 2, j がある ステーション S i , j では 組立に a i , j 時間 かかる a 1,1 入口 出口 a 2,1 a 1,2 a 2,2 a 1,3 a 2,3 a 1, n -1 a 2, n -1 a 1, n a 2, n ・・・ e 1 e 2 x 1 x 2
  10. 問題 車を組み立てる 2つのライン がある 各ライン には n 個 の ステーション S 1, j 、 S 2, j がある ステーション S i , j では 組立に a i , j 時間 かかる a 1,1 入口 出口 a 2,1 a 1,2 a 2,2 a 1,3 a 2,3 a 1, n -1 a 2, n -1 a 1, n a 2, n ・・・ e 1 e 2 x 1 x 2 ( 例 ) ライン1を通過する時間 =
  11. 問題 車を組み立てる 2つのライン がある 各ライン には n 個 の ステーション S 1, j 、 S 2, j がある ステーション S i , j では 組立に a i , j 時間 かかる ラインを変える には t i , j 時間 かかる a 1,1 入口 出口 a 2,1 a 1,2 a 2,2 a 1,3 a 2,3 a 1, n -1 a 2, n -1 a 1, n a 2, n ・・・ t 1,1 t 2,1 t 1,2 t 2,2 t 1, n -1 t 2, n -1 e 1 e 2 x 1 x 2
  12. 問題 車を組み立てる 2つのライン がある 各ライン には n 個 の ステーション S 1, j 、 S 2, j がある ステーション S i , j では 組立に a i , j 時間 かかる ラインを変える には t i , j 時間 かかる -> 最短時間の順路 を 求める a 1,1 入口 出口 a 2,1 a 1,2 a 2,2 a 1,3 a 2,3 a 1, n -1 a 2, n -1 a 1, n a 2, n ・・・ t 1,1 t 2,1 t 1,2 t 2,2 t 1, n -1 t 2, n -1 e 1 e 2 x 1 x 2
  13. 例 ( p .8 ) 7 入口 出口 8 9 5 3 6 8 5 4 7 2 2 3 1 4 1 2 4 3 2 4 4 1 2 3 2
  14. 例 ( p .8 ) 7 入口 出口 8 9 5 3 6 8 5 4 7 2 2 3 1 4 1 2 4 3 2 4 4 1 2 3 2 2 + 7 + 2 + 5 + 1 + 3 + 1 + 4 + 5 + 1 + 4 + 3 =38
  15. 総当り作戦 の 破綻 ある道筋 の コスト を 計算 するには -> O ( n ) 全て の 道筋 は -> 2 n 通り 総当り には Ω (2 n ) 必要 ※ Ω(2 n ) = 少なくとも 2 n の 計算量 を要する
  16. 1. 最適解の構造を 特徴づける
  17. ステーション S 1, j を 最速 で 終了 する 順路 が S 1, j -1 を 経由 していた 場合 S 1, j -1 S 2, j -1 S 1, j 入口
  18. ステーション S 1, j を 最速 で 終了 する 順路 が S 1, j -1 を 経由 していた 場合 S 1, j -1 を 最速 で 終了 する 順路 を 辿ってきた 入口 S 1, j -1 S 2, j -1 S 1, j
  19. なぜならば もっと速く S 1, j -1 に到達する道 が あるなら、 この順路 を使って S 1, j に もっと速く着ける 入口 S 1, j -1 S 2, j -1 S 1, j 矛盾
  20. 同様に…
  21. ステーション S 1, j を 最速 で 終了 する 順路 が S 1, j -1 を 経由 していた 場合 S 1, j -1 を 最速 で 終了 する 順路 を 辿ってきた S 2, j -1 を 経由 していた 場合 S 2, j -1 を 最速 で 終了 する 順路 を 辿ってきた j =1 のとき 1 通り S 1, j -1 S 2, j -1 S 1, j
  22. ステーション S 1, j を 最速 で 終了 する 順路 が S 1, j -1 を 経由 していた 場合 S 1, j -1 を 最速 で 終了 する 順路 を 辿ってきた S 2, j -1 を 経由 していた 場合 S 2, j -1 を 最速 で 終了 する 順路 を 辿ってきた j =1 のとき 1 通り S 1, j -1 S 2, j -1 S 1, j 問題 の 最適解 部分問題 の 最適解
  23. 部分問題最適性 問題 の 最適解 に 部分問題 の 最適解 が 含 まれる
  24. 2. 最適解 の 値 を 再帰的 に 定義 する
  25. 最適解 の 値 f i [ j ] = 入口 から S i, j までの 最短時間 S 1, j -1 S 2, j -1 S 1, j 入口 t 2, j -1
  26. 最適解 の 値 f 1 [ j ] = a 1, j -1 a 2, j -1 S 1, j 入口 t 2, j -1 e 1 + a 1,1 min( f 1 [ j -1] + a 1 ,j -1 , f 2 [ j -1]+ a 2, j -1 + t 2, j -1 ) ( j= 1) ( j >1) f 1 [ j -1]
  27. 最適解 の 値 f 1 [ j ] = e 1 + a 1,1 min( f 1 [ j -1] + a 1 ,j -1 , f 2 [ j -1]+ a 2, j -1 + t 2, j -1 ) ( j= 1) ( j> 1) f 2 [ j ] = e 2 + a 2,1 min( f 2 [ j -1] + a 2 ,j -1 , f 1 [ j -1]+ a 1, j -1 + t 1, j -1 ) ( j= 1) ( j >1) 同様 に… f* = min( f 1 [ n ] + x 1 , f 2 [ n ] + x 2 ) 求めたい最適解 の 値 は…
  28. 3. ボトムアップ に 最適解 の 値 を 求 める
  29. 再帰 を そのまま解 くと・・・ O (2 n ) f 1 [ j ] = e 1 + a 1,1 min( f 1 [ j -1] + a 1 ,j -1 , f 2 [ j -1]+ a 2, j -1 + t 2, j -1 ) ( j= 1) ( j> 1) f 2 [ j ] = e 2 + a 2,1 min( f 2 [ j -1] + a 2 ,j -1 , f 1 [ j -1]+ a 1, j -1 + t 1, j -1 ) ( j= 1) ( j >1) f* = min( f 1 [ n ] + x 1 , f 2 [ n ] + x 2 )
  30. 再帰 を そのまま解 くと・・・ O (2 n ) f 1 [ j ] = e 1 + a 1,1 min( f 1 [ j -1] + a 1 ,j -1 , f 2 [ j -1]+ a 2, j -1 + t 2, j -1 ) ( j= 1) ( j> 1) f 2 [ j ] = e 2 + a 2,1 min( f 2 [ j -1] + a 2 ,j -1 , f 1 [ j -1]+ a 1, j -1 + t 1, j -1 ) ( j= 1) ( j >1) f* = min( f 1 [ n ] + x 1 , f 2 [ n ] + x 2 ) ボトムアップ ( 昇順 ) に 解く
  31. F ASTEST -W AY( a , t , e , x , n ) 最適解 の 値 を 計算 f i [ j ] を 計算 初期値 を 設定
  32. 例 ( p .8 ) 7 入口 出口 8 9 5 3 6 8 5 4 7 2 2 3 1 4 1 2 4 3 2 4 4 1 2 3 2 f 1 [ j ] 2 1 4 3 5 f 2 [ j ] 6 j
  33. 例 ( p .8 ) 7 入口 出口 8 9 5 3 6 8 5 4 7 2 2 3 1 4 1 2 4 3 2 4 4 1 2 3 2 9 f 1 [ j ] 2 12 1 4 3 5 f 2 [ j ] 6 j
  34. 例 ( p .8 ) 7 入口 出口 8 9 5 3 6 8 5 4 7 2 2 3 1 4 1 2 4 3 2 4 4 1 2 3 2 18 9 f 1 [ j ] 2 12 1 4 3 5 f 2 [ j ] 6 j
  35. 例 ( p .8 ) 7 入口 出口 8 9 5 3 6 8 5 4 7 2 2 3 1 4 1 2 4 3 2 4 4 1 2 3 2 18 9 f 1 [ j ] 16 2 12 1 4 3 5 f 2 [ j ] 6 j
  36. 例 ( p .8 ) 7 入口 出口 8 9 5 3 6 8 5 4 7 2 2 3 1 4 1 2 4 3 2 4 4 1 2 3 2 20 18 9 f 1 [ j ] 16 2 12 1 4 22 3 5 f 2 [ j ] 6 j
  37. 例 ( p .8 ) 7 入口 出口 8 9 5 3 6 8 5 4 7 2 2 3 1 4 1 2 4 3 2 4 4 1 2 3 2 35 32 24 20 18 9 f 1 [ j ] 16 2 12 1 25 4 22 3 30 5 37 f 2 [ j ] 6 j
  38. 4. 最適解 を 構成 する
  39. l *, l [ j ] から順路を出力する P RINT- S TATIONS ( l , l *, n )
  40. 例 ( p .8 ) 7 入口 出口 8 9 5 3 6 8 5 4 7 2 2 3 1 4 1 2 4 3 2 4 4 1 2 3 2 35 32 24 20 18 9 f 1 [ j ] 16 2 12 1 25 4 22 3 30 5 37 f 2 [ j ] 6 j
  41. 例 ( p .8 ) 7 入口 出口 8 9 5 3 6 8 5 4 7 2 2 3 1 4 1 2 4 3 2 4 4 1 2 3 2 35 32 24 20 18 9 f 1 [ j ] 16 2 12 1 25 4 22 3 30 5 37 f 2 [ j ] 6 j
  42. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5
  43. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5 15.2 連鎖行列積
  44. 問題 行列積 A 1 A 2 … A n の計算量を小さくしたい
  45. 問題 行列積 A 1 A 2 … A n の計算量を小さくしたい 演算結果は括弧付けの順番に寄らない ( A 1 ( A 2 ( A 3 A 4 ))) ( A 1 (( A 2 A 3 ) A 4 )) (( A 1 A 2 )( A 3 A 4 )) (( A 1 ( A 2 A 3 )) A 4 ) ((( A 1 A 2 ) A 3 ) A 4 )
  46. 問題 行列積 A 1 A 2 … A n の計算量を小さくしたい 演算結果は括弧付けの順番に寄らない ( A 1 ( A 2 ( A 3 A 4 ))) : 右から ( A 1 (( A 2 A 3 ) A 4 )) : 中右左の順 (( A 1 A 2 )( A 3 A 4 )) : 左右を先に (( A 1 ( A 2 A 3 )) A 4 ) : 中左右の順 ((( A 1 A 2 ) A 3 ) A 4 ) : 左から
  47. 問題 行列積 A 1 A 2 … A n の計算量を小さくしたい 演算結果は括弧付けの順番に寄らない 計算量は括弧付けの順番に依存する A ( p × q 行列 ) と B ( q × r 行列 ) の 積 で は、 pqr 回 の 掛け算 が 実施 される
  48. 行列積 A 1 A 2 … A n の計算量を小さくしたい 演算結果は括弧付けの順番に寄らない 計算量は括弧付けの順番に依存する 問題 ( 例 ) A 1 (10×100 行列 ) A 2 (100×5 行列 ) A 3 (5×50 行列 ) (( A 1 A 2 ) A 3 ) : 10×100×5+10×5×50 ( A 1 ( A 2 A 3 )) : 100×5×50+10×100×50
  49. 行列積 A 1 A 2 … A n の計算量を小さくしたい 演算結果は括弧付けの順番に寄らない 計算量は括弧付けの順番に依存する 問題 (( A 1 A 2 ) A 3 ) : 10×100×5+10×5×50 ( A 1 ( A 2 A 3 )) : 100×5×50+10×100×50 = 7,500 = 75,000 ( 例 ) A 1 (10×100 行列 ) A 2 (100×5 行列 ) A 3 (5×50 行列 )
  50. 行列積 A 1 A 2 … A n の計算量を小さくしたい 演算結果は括弧付けの順番に寄らない 計算量は括弧付けの順番に依存する -> A 1 A 2 … A n の 乗算回数 を 最小化 する 括弧付け を 決定 する A i の 次元 は p i -1 × p i 問題
  51. 括弧付けの個数 P ( n ) : N 個 の 行列 に対する 括弧付け の 個数 総当り には Ω (4 n / n 3/2 ) 必要
  52. 括弧付けの個数 ( A 1 ( A 2 ( A 3 A 4 ))) ( A 1 (( A 2 A 3 ) A 4 )) P (4) : 4 個 の 行列 に対する 括弧付け の 個数 (( A 1 A 2 )( A 3 A 4 )) (( A 1 ( A 2 A 3 )) A 4 ) ((( A 1 A 2 ) A 3 ) A 4 )
  53. 括弧付けの個数 ( A 1 ( A 2 ( A 3 A 4 ))) ( A 1 (( A 2 A 3 ) A 4 )) P (4) : 4 個 の 行列 に対する 括弧付け の 個数 (( A 1 A 2 )( A 3 A 4 )) (( A 1 ( A 2 A 3 )) A 4 ) ((( A 1 A 2 ) A 3 ) A 4 ) P (1) P (3) P (3) P (1) P (2) P (2)
  54. 括弧付けの個数 ( A 1 ( A 2 ( A 3 A 4 ))) ( A 1 (( A 2 A 3 ) A 4 )) P (4) : 4 個 の 行列 に対する 括弧付け の 個数 (( A 1 A 2 )( A 3 A 4 )) (( A 1 ( A 2 A 3 )) A 4 ) ((( A 1 A 2 ) A 3 ) A 4 ) P (1) P (3) P (3) P (1) P (2) P (2) + × × × +
  55. 1. 最適解の構造を 特徴づける
  56. A i A i +1 … A j の 最適括弧付け が A k と A k +1 で 分割すると仮定する A i A i +1 … A k A k +1 … A j
  57. A i A i +1 … A j の 最適括弧付け が A k と A k +1 で 分割すると仮定する A i A i +1 … A k A k +1 … A j 部分括弧付け は A i … A k の 最適括弧付け となっている 部分括弧付け は A k +1 … A j の 最適括弧付け となっている
  58. より良い 括弧付け があれば それを使って A i A i +1 … A j を より良くできる なぜならば A i A i +1 … A k A k +1 … A j より良い括弧付け
  59. より良い 括弧付け があれば それを使って A i … A j を より良くできる なぜならば A i A i +1 … A k A k +1 … A j より良い括弧付け A i A i +1 … A j が 最適括弧付け であることと 矛盾
  60. 部分問題最適性 問題 ( A i A i +1 … A j ) の 最適解 に 部分問題 ( A i … A k と A k+ 1 … A j ) の 最適解 が 含 まれる
  61. 2. 最適解 の 値 を 再帰的 に 定義 する
  62. 最適解 の 値 m [ i, j ] = A i … A j の 計算 に 必要 な スカラ乗算 の 最小回数 A i A i +1 … A k A k +1 … A j
  63. 最適解 の 値 最適解 は A k と A k +1 で 分割 する と仮定する m [ i, j ] = A i … A j の 計算 に 必要 な スカラ乗算 の 最小回数 A i A i +1 … A k A k +1 … A j
  64. 最適解 の 値 最適解 は A k と A k +1 で 分割 する と仮定する m [ i, j ] = A i … A j の 計算 に 必要 な スカラ乗算 の 最小回数 A i A i +1 … A k A k +1 … A j m [ i, j ] = m [ i , k ] + m [ k +1, j ] + p i -1 p k p j
  65. 未知 の 値 k を 求 める 全ての k を 調 べて 最良 のものを 選択 する m [ i , j ] = 0 min( m [ i , k ] + m [ k +1, j ]+ p i -1 p k p j ) 0≦ k ≦ j ( j= 1) ( j >1)
  66. 3. ボトムアップ に 最適解 の 値 を 求 める
  67. 再帰 だと 指数時間 が 必要 -> 理由は 15.3 にて
  68. 部分問題 の 数 が 少 ない 1 ≦ i ≦ k ≦ n を 満たす部分問題 の 個数 は n C 2 + n =Θ( n 2 ) 通り 再帰 の 途中 で 同じ部分問題 が 繰り返し 表れる 部分問題重複性
  69. そこで ボトムアップ に
  70. M ATRIX- C HAIN- O RDER( p ) 初期値 を 設定 連鎖長 が l のもので ループ m [ i , j ] を 求める
  71. 図で考える m [1,1] m [1,2] m [1,3] m [2,2] m [2,3] m [3,3] m [4,4] m [3,4] m [2,4] m [1,4] m [2,5] m [3,5] m [4,5] m [5,5] m [1,5] A 1 A 2 A 3 A 4 A 5
  72. 図で考える m [1,1] m [1,2] m [1,3] m [2,2] m [2,3] m [3,3] m [4,4] m [3,4] m [2,4] m [1,4] m [2,5] m [3,5] m [4,5] m [5,5] m [1,5] i =1 A 1 A 2 A 3 A 4 A 5 l j =3
  73. 0 0 0 0 0 A 1 30×35 A 2 35×15 A 3 15×10 A 4 10×20 A 5 20×25
  74. 0 i =1 j =2 0 i =2 j =3 0 0 i =3 j =4 i =4 j =5 0 A 1 30×35 A 2 35×15 A 3 15×10 A 4 10×20 A 5 20×25
  75. 0 15,750 0 0 0 0 A 1 30×35 A 2 35×15 A 3 15×10 A 4 10×20 A 5 20×25
  76. 0 15,750 0 2,625 0 0 750 1,000 0 A 1 30×35 A 2 35×15 A 3 15×5 A 4 5×10 A 5 10×20
  77. 0 15,750 i =1 j= 3 0 2,625 0 0 750 1,000 0 A 1 30×35 A 2 35×15 A 3 15×5 A 4 5×10 A 5 10×20 min( m [1, k ] + m [ k +1, 3]+ p 0 p k p 3 ) 1≦ k ≦ 2
  78. 0 15,750 7,875 0 2,625 0 0 750 1,000 0 A 1 30×35 A 2 35×15 A 3 15×5 A 4 5×10 A 5 10×20 min( m [1, k ] + m [ k +1, 3]+ p 0 p k p 3 ) 1≦ k ≦ 2 k =1 7,875
  79. 0 15,750 7,875 0 2,625 0 0 750 1,000 0 A 1 30×35 A 2 35×15 A 3 15×5 A 4 5×10 A 5 10×20 min( m [1, k ] + m [ k +1, 3]+ p 0 p k p 3 ) 1≦ k ≦ 2 k =2 18,000 k =1 7,875
  80. 0 15,750 7,875 0 2,625 0 0 750 4,375 2,500 1,000 0 A 1 30×35 A 2 35×15 A 3 15×5 A 4 5×10 A 5 10×20
  81. 0 15,750 7,875 0 2,625 0 0 750 4,375 i =1 j =4 2,500 1,000 0 A 1 30×35 A 2 35×15 A 3 15×5 A 4 5×10 A 5 10×20 min( m [1, k ] + m [ k +1, 4]+ p 0 p k p 4 ) 1≦ k ≦3
  82. 0 15,750 7,875 0 2,625 0 0 750 4,375 9,375 2,500 1,000 0 A 1 30×35 A 2 35×15 A 3 15×5 A 4 5×10 A 5 10×20 min( m [1, k ] + m [ k +1, 4]+ p 0 p k p 4 ) 1≦ k ≦3
  83. 0 15,750 7,875 0 2,625 0 0 750 4,375 9,375 7,125 2,500 1,000 0 11,875 A 1 30×35 A 2 35×15 A 3 15×5 A 4 5×10 A 5 10×20
  84. 0 15,750 7,875 0 2,625 0 0 750 4,375 9,375 7,125 2,500 1,000 0 11,875 A 1 30×35 A 2 35×15 A 3 15×5 A 4 5×10 A 5 10×20 m [1, 5] 最適解の値
  85. アルゴリズムの評価 計算量 3 重ループなので O ( n 3 ) Ω( n 3 ) -> 練習問題 15.2-4 メモリ消費量 Θ( n 2 )
  86. 4. 最適解 を 構成 する
  87. s [ i , j ] から 最適解 を 構成 する P RINT- O PTIMAL- P ARENS ( s , i , j )
  88. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5
  89. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5 15.3 動的計画法の基本要素
  90. 15.3 の目次 部分構造最適性 発見の手順 特徴・計算量 間違 って 発見 しないように : 独立 部分問題重複性 重複問題の個数 最適解の再構成 メモ化
  91. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5 部分構造最適性
  92. 部分構造最適性 を 発見 する 手順 問題の解 が ある選択 から 構成 されていることを 観察 する。 最適解 を 導 く 選択 が 与 えられている と 仮定 する。 選択 から 生 ずる 部分問題 を 決定 する。 部分問題 の 空間 を 特徴づける 。 部分問題 の 解 が 最適解 であることを 決定 する。
  93. 例題 1 、例題 2 で 考 える 問題の解 が ある選択 から 構成 されていることを 観察 する。 最適解 を 導 く 選択 が 与 えられている と 仮定 する。 選択 から 生 ずる 部分問題 を 決定 する。 部分問題 の 空間 を 特徴づける 。
  94. 例題 1 、例題 2 で 考 える 部分問題 の 解 が 最適解 であることを 決定 する。 切り貼り法 を使って 証明 する (最適ではないと仮定して矛盾を導く)
  95. 例題 1 、例題 2 で 考 える 部分問題 の 解 が 最適解 であることを 決定 する。 切り貼り法 を使って 証明 する (最適ではないと仮定して矛盾を導く)
  96. 部分構造最適性 を 発見 する 手順 問題の解 が ある選択 から 構成 されていることを 観察 する。 最適解 を 導 く 選択 が 与 えられている と 仮定 する。 選択 から 生 ずる 部分問題 を 決定 する。 部分問題 の 空間 を 特徴づける 。 部分問題 の 解 が 最適解 であることを 決定 する。 どのように?
  97. 部分問題 の 空間 の 特徴づけ を得る方法 最初 は できるだけ簡単 に 仮定 する 必要 に 応じて拡張 する 組み立てラインスケジューリング の 場合 S 1, j と S 2, j を 仮定 うまく行く
  98. 部分問題 の 空間 の 特徴づけ を得る方法 最初 は できるだけ簡単 に 仮定 する 必要 に 応じて拡張 する 連鎖行列積 の 場合 A 1 A 2 … A j を 部分問題 の 空間 として 仮定していれば… A k と A k +1 で 分割 するとき 部分問題 A 1 … A k と A k +1 … A j を 生じる 部分問題 の 空間 に 含 まれない
  99. 特徴量 元々与えられた問題の最適解が利用する部分問題の個数 最適解が利用する部分問題の候補の個数 j - i ( k = i , i +1,…, j ) 2 ( A i … A k と A k +1 … A j ) 連鎖行列積 2 ( S 1, j と S 2, j ) 1 ( S 1, j もしくは S 2, j ) 組み立てラインスケジューリング 2. 候補の個数 1. 部分問題の個数
  100. 計算時間 部分問題の総数 各部分問題の候補数 高々 n 2 2. 候補数 O ( n 3 ) Θ( n ) 合計 Θ( n 2 ) 連鎖行列積 Θ( n ) 組み立てラインスケジューリング 1. 部分問題の総数
  101. 貪欲アルゴリズム との 比較 共通点 どちらも 部分問題最適性 を利用する 違うところ 動的計画法 = ボトムアップ 貪欲アルゴリズム = トップダウン
  102. 間違えて部分問題最適性を 仮定しないために 有向グラフ G =( V , E ) で 以下 の 問題 を 考 える 重みなし最短 ( 単純 ) 路 重みなし最長単純路 単純路 = ループ や 多重辺 を 含 まない
  103. 重みなし最短路問題 部分構造最適性を持つ p 1 は u から w への 最短路 もし そうでないならば、 最短路 を p 1 ' とすれば p 1 ' と p 2 を 組み合わせて より 最短 な 経路 を 作成 できる
  104. 重みなし最長単純路問題 部分構造最適性を持たない ( 反例 ) q -> t への 最長路 部分問題 q -> r への 最長路 部分問題 r -> t への 最長路 2 3 3 q s r t q s r t q s r t
  105. 重みなし最長単純路問題 動的計画法ではとけない NP 問題 多項式時間でも解けていない
  106. 違いは「 独立 」 最短単純路 : 独立 最長単純路 : 独立でない 独立 = 部分問題の解 が 別の部分問題の解 に 影響を与えない
  107. 最長単純路 は 「 独立」 か? 2つ の 最適解 を 組み合わせると、 経路 は 単純 でなくなる 部分問題 q -> r への 最長路 部分問題 r -> t への 最長路 3 3 部分問題の最適解が別の問題へ影響を与えている q s r t q s r t
  108. 最短路は 「単純」 か? 2つ の 部分問題 は w 以外 の 点 を 共有 しない ので 「単純」 もし w 以外 の 点 x を 共有 すると u -> x -> w -> x -> v x -> w -> x を ショートカット すれば、より 最短 な 経路になる 矛盾!
  109. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5 部分問題重複性
  110. 部分問題重複性 の 性質 再帰の仮定で同じ問題が何度も出てくる 動的計画法では部分問題の解を表に記録することで対応する 分割統治法 再帰の仮定で新しい問題が生まれる
  111. 連鎖行列積 を 再帰 で 解 いたら… T ( n ) := 再帰で解いた場合の計算時間
  112. 連鎖行列積 を 再帰 で 解 いたら… (2) 置き換え法で T ( n )=Ω(2 n ) を証明する つまり… 少なくとも 2 n の 計算量!
  113. 最適解の再構成 「 最適解の値」 を求めたあとに「 最適解」 を求める 組み立てラインスケジューリング の 場合 直前のステーション を l i [ j ] に 記録 した l i [ j ] がなくても、 わずかな計算 O ( n ) で 再構成 できる f 1 [ j ] = f 1 [ j -1]+ a 1 ならば S 1, j を 経由 f 1 [ j ] = f 2 [ j -1]+t 2, j -1 + a 1 ならば S 2, j を 経由 連鎖行列積問題 の 場合 直前の分割 を s [ i , j] に 記録 した s [ i , j] を 利用しないと、再構成には Θ( j - i ) が必要 s [ i , j] があれば O (1) で計算できる
  114. メモ化 (memoize) 再帰の過程で計算結果を覚えておく 重複する部分問題を O (1) で思い出せる O ( n 3 ) 再帰 + メモ化 2 n O ( n 3 ) 連鎖行列積 再帰のみ 動的計画法
  115. 動的計画法 v.s. 再帰+メモ化 全ての部分問題を解く必要がある場合 動的計画法の方が優れている 再帰のオーバーヘッドが少ない 時間や表の領域を節約するアルゴリズムもある 一部の部分問題を解く必要がない場合 再帰+メモ化は不要な問題を解かなくてよい
  116. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5
  117. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5 15.4 最長共通 部分系列
  118. 問題 DNA の 塩基 がどれぐらい 一致 しているか 知 りたい 最長部分系列 を求める
  119. 問題 DNA の 塩基 がどれぐらい 一致 しているか 知 りたい 最長部分系列 を求める 部分系列 とは X = 〈 x 1 , x 2 ,…, x m 〉 の 部分系列 が Z = 〈 z 1 , z 2 ,…, z k 〉 であるとは、 増加する添え字の列〈 i 1 , i 2 ,… i k 〉 が 存在 し、 x i j = z j を 満 たす。 X = 〈 A , B , C , B , D , A , B 〉 Z = 〈 B , C , D , B 〉 部分系列
  120. 問題 DNA の 塩基 がどれぐらい 一致 しているか 知 りたい 最長部分系列 を求める 部分系列 とは X = 〈 x 1 , x 2 ,…, x m 〉 の 部分系列 が Z = 〈 z 1 , z 2 ,…, z k 〉 であるとは、 増加する添え字の列〈 i 1 , i 2 ,… i k 〉 が 存在 し、 x i j = z j を 満 たす。 X = 〈 A , B , C , B , D , A , B 〉 Z = 〈 B , C , D , B 〉 〈 2, 3, 5, 7 〉 部分系列
  121. 問題 DNA の 塩基 がどれぐらい 一致 しているか 知 りたい 最長部分系列 を求める 部分系列 とは X = 〈 x 1 , x 2 ,…, x m 〉 の 部分系列 が Z = 〈 z 1 , z 2 ,…, z k 〉 であるとは、 増加する添え字の列〈 i 1 , i 2 ,… i k 〉 が 存在 し、 x i j = z j を 満 たす。 共通部分系列 とは 2つの系列の共通する部分系列 X = 〈 A , B , C , B , D , A , B 〉 Y = 〈 B , D , C , A , B , A 〉 〈 B , C , A 〉 は 共通部分系列
  122. 問題 DNA の 塩基 がどれぐらい 一致 しているか 知 りたい 最長部分系列 を求める 部分系列 とは X = 〈 x 1 , x 2 ,…, x m 〉 の 部分系列 が Z = 〈 z 1 , z 2 ,…, z k 〉 であるとは、 増加する添え字の列〈 i 1 , i 2 ,… i k 〉 が 存在 し、 x i j = z j を 満 たす。 共通部分系列 とは 2つの系列の共通する部分系列 X = 〈 A , B , C , B , D , A , B 〉 Y = 〈 B , D , C , A , B , A 〉 〈 B , C , A 〉 は 共通部分系列
  123. 問題 DNA の 塩基 がどれぐらい 一致 しているか 知 りたい 最長部分系列 を求める 部分系列 とは X = 〈 x 1 , x 2 ,…, x m 〉 の 部分系列 が Z = 〈 z 1 , z 2 ,…, z k 〉 であるとは、 増加する添え字の列〈 i 1 , i 2 ,… i k 〉 が 存在 し、 x i j = z j を 満 たす。 共通部分系列 とは 2つの系列の共通する部分系列 X = 〈 A , B , C , B , D , A , B 〉 Y = 〈 B , D , C , A , B , A 〉 最長部分系列 (LCS) は 〈 B , C , A, B 〉 と 〈 B , D , A, B 〉
  124. 問題 DNA の 塩基 がどれぐらい 一致 しているか 知 りたい 最長部分系列 を求める 部分系列 とは X = 〈 x 1 , x 2 ,…, x m 〉 の 部分系列 が Z = 〈 z 1 , z 2 ,…, z k 〉 であるとは、 増加する添え字の列〈 i 1 , i 2 ,… i k 〉 が 存在 し、 x i j = z j を 満 たす。 共通部分系列 とは 2つの系列の共通する部分系列 最長共通部分系列問題 とは X = 〈 x 1 , x 2 ,…, x m 〉 と Y = 〈 y 1 , y 2 ,…, y n 〉の 最長共通部分系列 (LCS) を求める
  125. 総当り作戦 の 破綻 X の部分系列の個数 -> O (2 m ) 総当り には Ω (2 m ) 必要
  126. 1. 最適解の構造を 特徴づける
  127. LCS の 部分構造最適性 X = 〈 x 1 , x 2 ,…, x m 〉 と Y = 〈 y 1 , y 2 ,…, y n 〉 の LCS が Z = 〈 z 1 , z 2 ,…, z k 〉 であると 仮定 すると x m = y n ならば z k = x m = y n であり、 Z k -1 は X m -1 と Y n -1 の LCS である x m ≠ y n のとき、 z k ≠ x m ならば Z は X m -1 と Y の LCS である x m ≠ y n のとき、 z k ≠ y n ならば Z は X と Y n -1 の LCS である 接頭語 X i = 〈 x 1 , x 2 ,…, x i 〉とする
  128. 2. 最適解 の 値 を 再帰的 に 定義 する
  129. LCS を求める手順 x m = y n のとき X m -1 と Y n -1 の LCS を 求める x m ≠ y n のとき 「 X m -1 と Y の LCS 」と「 X と Y n -1 の LCS 」 の 長い ほうを 採用する 部分問題の部分問題を共有している -> 部分問題重複性
  130. 最適解 の 値 c [ i , j ] = X i と Y j の LCS の 長さ ※ 利用しない部分問題が存在する
  131. 3. ボトムアップ に 最適解 の 値 を 求 める
  132. 動的計画法 の 利用 再帰(メモ化なし)で計算すると指数時間 部分問題の個数は Θ( nm ) 個のみ 動的計画法で ボトムアップ ( 昇順 ) に 解く
  133. LCS-L ENGTH( X , Y ) 左上から1つ ずつ計算 i =0, j =0 を設定
  134. 例 (p35) i =0, j =0 を 初期化 0 B 5 0 0 0 0 0 0 x i 0 0 B 4 0 B 7 0 A 6 0 D 5 0 C 3 0 B 2 0 A 1 A A C D B y j i 6 4 3 2 1 0 j
  135. 例 (p35) i =1, j =1 のとき x i ≠ y j , c [ i -1, j ]≧ c [ i , j -1] 0 B 5 0 0 0 0 0 0 x i 0 0 B 4 0 B 7 0 A 6 0 D 5 0 C 3 0 B 2 ↑ 0 0 A 1 A A C D B y j i 6 4 3 2 1 0 j
  136. 例 (p35) i =1, j =2 のとき x i ≠ y j , c [ i -1, j ]≧ c [ i , j -1] 0 B 5 0 0 0 0 0 0 x i 0 0 B 4 0 B 7 0 A 6 0 D 5 0 C 3 0 B 2 ↑ 0 ↑ 0 0 A 1 A A C D B y j i 6 4 3 2 1 0 j
  137. 例 (p35) i =1, j =3 のとき x i ≠ y j , c [ i -1, j ]≧ c [ i , j -1] 0 B 5 0 0 0 0 0 0 x i 0 0 B 4 0 B 7 0 A 6 0 D 5 0 C 3 0 B 2 ↑ 0 ↑ 0 ↑ 0 0 A 1 A A C D B y j i 6 4 3 2 1 0 j
  138. 例 (p35) i =1, j =4 のとき x i = y j 0 B 5 0 0 0 0 0 0 x i 0 0 B 4 0 B 7 0 A 6 0 D 5 0 C 3 0 B 2 ↖ 1 ↑ 0 ↑ 0 ↑ 0 0 A 1 A A C D B y j i 6 4 3 2 1 0 j
  139. 例 (p35) i =1, j =5 のとき x i ≠ y j , c [ i -1, j ]< c [ i , j -1] ← 1 0 B 5 0 0 0 0 0 0 x i 0 0 B 4 0 B 7 0 A 6 0 D 5 0 C 3 0 B 2 ↖ 1 ↑ 0 ↑ 0 ↑ 0 0 A 1 A A C D B y j i 6 4 3 2 1 0 j
  140. 例 (p35) i =1, j =5 のとき x i = y j ← 1 0 B 5 0 0 0 0 0 0 x i 0 0 B 4 0 B 7 0 A 6 0 D 5 0 C 3 0 B 2 ↖ 1 ↖ 1 ↑ 0 ↑ 0 ↑ 0 0 A 1 A A C D B y j i 6 4 3 2 1 0 j
  141. 例 (p35) ↖ 2 ← 1 0 B 5 0 0 0 0 0 0 x i 0 0 B 4 0 B 7 0 A 6 0 D 5 0 C 3 ← 2 ↑ 1 ← 1 ← 1 ↖ 1 0 B 2 ↖ 1 ↖ 1 ↑ 0 ↑ 0 ↑ 0 0 A 1 A A C D B y j i 6 4 3 2 1 0 j
  142. 例 (p35) ↖ 4 ↑ 3 ↑ 3 ↖ 3 ↑ 2 ↖ 2 ← 1 0 B 5 0 0 0 0 0 0 x i 0 ← 3 ↑ 2 ↑ 2 ↑ 1 ↖ 1 0 B 4 ↑ 4 ↑ 3 ↑ 2 ↑ 2 ↖ 1 0 B 7 ↖ 4 ↑ 3 ↑ 2 ↑ 2 ↑ 1 0 A 6 ↑ 3 ↑ 3 ↑ 2 ↖ 2 ↑ 1 0 D 5 ↑ 2 ← 2 ↖ 2 ↑ 1 ↑ 1 0 C 3 ← 2 ↑ 1 ← 1 ← 1 ↖ 1 0 B 2 ↖ 1 ↖ 1 ↑ 0 ↑ 0 ↑ 0 0 A 1 A A C D B y j i 6 4 3 2 1 0 j
  143. 4. 最適解 を 構成 する
  144. P RINT- LCS ( b , X , i , j )
  145. 例 (p35) ↖ 4 ↑ 3 ↑ 3 ↖ 3 ↑ 2 ↖ 2 ← 1 0 B 5 0 0 0 0 0 0 x i 0 ← 3 ↑ 2 ↑ 2 ↑ 1 ↖ 1 0 B 4 ↑ 4 ↑ 3 ↑ 2 ↑ 2 ↖ 1 0 B 7 ↖ 4 ↑ 3 ↑ 2 ↑ 2 ↑ 1 0 A 6 ↑ 3 ↑ 3 ↑ 2 ↖ 2 ↑ 1 0 D 5 ↑ 2 ← 2 ↖ 2 ↑ 1 ↑ 1 0 C 3 ← 2 ↑ 1 ← 1 ← 1 ↖ 1 0 B 2 ↖ 1 ↖ 1 ↑ 0 ↑ 0 ↑ 0 0 A 1 A A C D B y j i 6 4 3 2 1 0 j
  146. コードの改善 b [ i , j ] を 利用しない c [ i, j ] の 矢印 の 方向 は O (1) で求められる 最適解の構成に要する時間: O ( m + n ) メモリ量の節約: Θ( mn ) c [ i , j ] の メモリ量 を 削減 する 直前 の 行 c [ i -1, j ] のみを 覚えて おけばよい 最適解の値 (長さ)のみを 求めればよい 場合 メモリ量の節約: Θ( mn ) ↑ 2 B 5 x i 0 ↑ 1 ↖ 1 0 B 4 B 7 A 6 D 5 ↑ 2 ← 2 ↖ 2 ↑ 1 ↑ 1 0 C 3 B 2 A 1 A A C D B y j i 6 4 3 2 1 0 j
  147. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5
  148. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5 15.5 最適2分 探索木
  149. 問題 2分探索木 T を 最小の時間 で 探索 したい k 2 k 1 k 4 k 3 k 5 k i を 検索 する 確率 : pi 0.20 0.10 0.05 0.10 0.15 p i 5 4 3 2 1 i
  150. 問題 2分探索木 T を 最小の時間 で 探索 したい k 2 k 1 k 4 k 3 k 5 d 0 d 1 d 2 d 3 d 4 d 5 d i (ダミーキー)を 導入 d 0 : k 1 未満 の 全て の 値 d i : k i < d i < k i +1 を 満 たす 全て の 値 d n : k n より 大きい全て の 値
  151. 問題 2分探索木 T を 最小の時間 で 探索 したい k 2 k 1 k 4 k 3 k 5 d 0 d 1 d 2 d 3 d 4 d 5 k i を 検索 する 確率 : p i d i を 検索 する 確率 : q i 0.05 0 0.10 0.05 0.05 0.05 0.10 q i 0.20 0.10 0.05 0.10 0.15 p i 5 4 3 2 1 i
  152. 問題 2分探索木 T を 最小の時間 で 探索 したい k 2 k 1 k 4 k 3 k 5 d 0 d 1 d 2 d 3 d 4 d 5 この値 を 最小化 する T を 求 める
  153. 総当り作戦 の 破綻 全ての2分木の個数 -> Ω(4 n / n 3/2 ) 総当り は 非現実的
  154. 1. 最適解の構造を 特徴づける
  155. 最適 2 分探索木 T が キー k i ,… k j を含む部分木 T ' を持つとする k x k r k i k j T ' T' は キー k 1 ,…, k j と ダミーキー d i ,…, d j から定義される 部分問題 の 最適解
  156. なぜならば もっと期待値が小さい部分木 T '' が あるなら、 この部分木 を使って T をよりよくできる 矛盾 k x k r k i k j T '' T が 最適 2 分探索木 で あることと
  157. 部分問題最適性 を 利用 する キー k i ,… k j の 根 を k r とする k r 左部分木 k i ,…, k r -1 右部分木 k r +1 ,…, k j 全 ての k r に 対 して 左部分木 と 右部分木 の 最適 2 分探索木 を 決定 する r = i のとき 左部分木 は d i -1 のみを 含む r = j のとき 右部分木 は d j のみを 含む ※
  158. 2. 最適解 の 値 を 再帰的 に 定義 する
  159. 最適解 の 値 e [ i , j ] = キー ki ,… kj を含む 最適 2 分探索木 の探索コストの期待値 最終目的: e [1, n ] を求める
  160. 最適解の値を求める 部分木の深さが1増えると 探索コストの期待値は 部分木の中の確率の和だけ増加する k r が キー k i ,… k j を 含む 最適 2 部分探索木 の 根であるとき
  161. 未知 の 値 k を 求 める root [ i , j ] を k r の 添え字 と定義する
  162. 3. ボトムアップ に 最適解 の 値 を 求 める
  163. O PTIMAL- BST ( p , q , n )
  164. アルゴリズムの評価 計算量 3 重ループなので O ( n 3 ) Ω( n 3 ) -> 練習問題 15.2-4 メモリ消費量 Θ( n 2 )
  165. ご清聴ありがとうございました

このスライドを共有する

  • このエントリーをはてなブックマークに追加
↑