動的計画法 2009/3/2 id:nitoyon アルゴリズムイントロダクション  15 章
動的計画法 (dynamic programming) 部分問題 を ボトムアップ に 解いて 統合 する
動的計画法のアルゴリズム 最適解 の 構造 を 特徴 づける 最適解 の 値 を 再帰的 に 定義 する ボトムアップ に 最適解 の 値 を 求 める 最適解 を 構成 する
15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5
15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5
15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5 15.1  組み立てライン スケジューリング
問題 車を組み立てる 2つのライン がある ライン1 ライン2 入口 出口
問題 車を組み立てる 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 個
問題 車を組み立てる 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
問題 車を組み立てる 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を通過する時間  =
問題 車を組み立てる 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
問題 車を組み立てる 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
例  ( 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
例  ( 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
総当り作戦 の 破綻 ある道筋 の コスト を 計算 するには -> O ( n ) 全て の 道筋 は   -> 2 n   通り 総当り には Ω (2 n ) 必要 ※ Ω(2 n )  =  少なくとも   2 n  の 計算量 を要する
1. 最適解の構造を 特徴づける
ステーション S 1, j   を 最速 で 終了 する 順路 が S 1, j -1 を 経由 していた 場合 S 1, j -1 S 2, j -1 S 1, j 入口
ステーション S 1, j   を 最速 で 終了 する 順路 が S 1, j -1 を 経由 していた 場合 S 1, j -1 を 最速 で 終了 する 順路 を 辿ってきた 入口 S 1, j -1 S 2, j -1 S 1, j
なぜならば もっと速く S 1, j -1 に到達する道 が あるなら、 この順路 を使って   S 1, j  に もっと速く着ける 入口 S 1, j -1 S 2, j -1 S 1, j 矛盾
同様に…
ステーション 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
ステーション 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 問題 の 最適解 部分問題 の 最適解
部分問題最適性 問題 の 最適解 に 部分問題 の 最適解 が 含 まれる
2.  最適解 の 値 を 再帰的 に 定義 する
最適解 の 値 f i [   j   ]  = 入口 から   S i,   j   までの 最短時間 S 1, j -1 S 2, j -1 S 1, j 入口 t 2,  j -1
最適解 の 値 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]
最適解 の 値 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 ) 求めたい最適解 の 値 は…
3. ボトムアップ に 最適解 の 値 を 求 める
再帰 を そのまま解 くと・・・ 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 )
再帰 を そのまま解 くと・・・ 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 ) ボトムアップ ( 昇順 ) に 解く
F ASTEST -W AY( a , t , e , x , n ) 最適解 の 値 を 計算 f i [ j ] を 計算 初期値 を 設定
例  ( 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
例  ( 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
例  ( 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
例  ( 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
例  ( 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
例  ( 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
4.  最適解 を 構成 する
l *,  l [ j ]  から順路を出力する P RINT- S TATIONS ( l ,  l *,  n )
例  ( 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
例  ( 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
15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5
15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5 15.2   連鎖行列積
問題 行列積  A 1 A 2 … A n  の計算量を小さくしたい
問題 行列積  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 )
問題 行列積  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 )  :  左から
問題 行列積  A 1 A 2 … A n  の計算量を小さくしたい 演算結果は括弧付けの順番に寄らない 計算量は括弧付けの順番に依存する A ( p × q 行列 )  と   B ( q × r 行列 )  の 積 で は、 pqr 回 の 掛け算 が 実施 される
行列積  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
行列積  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 行列 )
行列積  A 1 A 2 … A n  の計算量を小さくしたい 演算結果は括弧付けの順番に寄らない 計算量は括弧付けの順番に依存する ->   A 1 A 2 … A n   の 乗算回数 を 最小化 する 括弧付け を 決定 する A i  の 次元 は  p i -1 × p i 問題
括弧付けの個数 P ( n )  :  N 個 の 行列 に対する 括弧付け の 個数 総当り には Ω (4 n / n 3/2 ) 必要
括弧付けの個数 ( 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 )
括弧付けの個数 ( 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)
括弧付けの個数 ( 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) + × × × +
1. 最適解の構造を 特徴づける
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 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 の 最適括弧付け となっている
より良い 括弧付け があれば それを使って A i A i +1 … A j  を より良くできる なぜならば A i   A i +1 …  A k  A k +1 …  A j より良い括弧付け
より良い 括弧付け があれば それを使って A i … A j  を より良くできる なぜならば A i   A i +1 …  A k  A k +1 …  A j より良い括弧付け A i A i +1 … A j  が 最適括弧付け であることと 矛盾
部分問題最適性 問題 ( A i A i +1 … A j ) の 最適解 に 部分問題 ( A i … A k  と  A k+ 1 … A j ) の 最適解 が 含 まれる
2.  最適解 の 値 を 再帰的 に 定義 する
最適解 の 値 m [ i, j ]   = A i … A j の 計算 に 必要 な スカラ乗算 の 最小回数 A i   A i +1 …  A k  A k +1 …  A j
最適解 の 値 最適解 は  A k  と  A k +1 で 分割 する と仮定する m [ i, j ]   = A i … A j の 計算 に 必要 な スカラ乗算 の 最小回数 A i   A i +1 …  A k  A k +1 …  A j
最適解 の 値 最適解 は  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
未知 の 値  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)
3. ボトムアップ に 最適解 の 値 を 求 める
再帰 だと 指数時間 が 必要 -> 理由は 15.3 にて
部分問題 の 数 が 少 ない 1 ≦ i   ≦ k   ≦ n  を 満たす部分問題 の 個数 は n C 2 + n  =Θ( n 2 )  通り 再帰 の 途中 で 同じ部分問題 が 繰り返し 表れる 部分問題重複性
そこで ボトムアップ に
M ATRIX- C HAIN- O RDER( p ) 初期値 を 設定 連鎖長 が l のもので ループ m [ i ,  j ] を 求める
図で考える 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
図で考える 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
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
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
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
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
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
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
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
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
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
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
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
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] 最適解の値
アルゴリズムの評価 計算量 3 重ループなので  O ( n 3 ) Ω( n 3 )  -> 練習問題  15.2-4 メモリ消費量 Θ( n 2 )
4.  最適解 を 構成 する
s [ i ,  j ]  から 最適解 を 構成 する P RINT- O PTIMAL- P ARENS   ( s ,  i ,  j )
15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5
15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5 15.3   動的計画法の基本要素
15.3 の目次 部分構造最適性 発見の手順 特徴・計算量 間違 って 発見 しないように : 独立 部分問題重複性 重複問題の個数 最適解の再構成 メモ化
15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5 部分構造最適性
部分構造最適性 を 発見 する 手順 問題の解 が ある選択 から 構成 されていることを 観察 する。 最適解 を 導 く 選択 が 与 えられている と 仮定 する。 選択 から 生 ずる 部分問題 を 決定 する。 部分問題 の 空間 を 特徴づける 。 部分問題 の 解 が 最適解 であることを 決定 する。
例題 1 、例題 2 で 考 える 問題の解 が ある選択 から 構成 されていることを 観察 する。 最適解 を 導 く 選択 が 与 えられている と 仮定 する。 選択 から 生 ずる 部分問題 を 決定 する。 部分問題 の 空間 を 特徴づける 。
例題 1 、例題 2 で 考 える 部分問題 の 解 が 最適解 であることを 決定 する。 切り貼り法 を使って 証明 する (最適ではないと仮定して矛盾を導く)
例題 1 、例題 2 で 考 える 部分問題 の 解 が 最適解 であることを 決定 する。 切り貼り法 を使って 証明 する (最適ではないと仮定して矛盾を導く)
部分構造最適性 を 発見 する 手順 問題の解 が ある選択 から 構成 されていることを 観察 する。 最適解 を 導 く 選択 が 与 えられている と 仮定 する。 選択 から 生 ずる 部分問題 を 決定 する。 部分問題 の 空間 を 特徴づける 。 部分問題 の 解 が 最適解 であることを 決定 する。 どのように?
部分問題 の 空間 の 特徴づけ を得る方法 最初 は できるだけ簡単 に 仮定 する 必要 に 応じて拡張 する 組み立てラインスケジューリング の 場合 S 1, j と S 2, j を 仮定 うまく行く
部分問題 の 空間 の 特徴づけ を得る方法 最初 は できるだけ簡単 に 仮定 する 必要 に 応じて拡張 する 連鎖行列積 の 場合 A 1 A 2 … A j   を 部分問題 の 空間 として 仮定していれば… A k  と  A k +1   で 分割 するとき 部分問題   A 1 … A k  と  A k +1 … A j  を 生じる 部分問題 の 空間 に 含 まれない
特徴量 元々与えられた問題の最適解が利用する部分問題の個数 最適解が利用する部分問題の候補の個数 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.  部分問題の個数
計算時間 部分問題の総数 各部分問題の候補数 高々 n 2 2.  候補数 O ( n 3 ) Θ( n ) 合計 Θ( n 2 ) 連鎖行列積 Θ( n ) 組み立てラインスケジューリング 1.  部分問題の総数
貪欲アルゴリズム との 比較 共通点 どちらも 部分問題最適性 を利用する 違うところ 動的計画法 = ボトムアップ 貪欲アルゴリズム = トップダウン
間違えて部分問題最適性を 仮定しないために 有向グラフ  G =( V ,  E )  で 以下 の 問題 を 考 える 重みなし最短 ( 単純 ) 路 重みなし最長単純路 単純路  =  ループ や 多重辺 を 含 まない
重みなし最短路問題 部分構造最適性を持つ p 1   は  u から w への 最短路 もし そうでないならば、 最短路 を   p 1 ’  とすれば   p 1 ’ と   p 2 を 組み合わせて より 最短 な 経路 を 作成 できる
重みなし最長単純路問題 部分構造最適性を持たない ( 反例 ) q -> t   への 最長路 部分問題 q -> r   への 最長路 部分問題 r -> t   への 最長路 2 3 3 q s r t q s r t q s r t
重みなし最長単純路問題 動的計画法ではとけない NP 問題 多項式時間でも解けていない
違いは「 独立 」 最短単純路 : 独立 最長単純路 : 独立でない 独立  = 部分問題の解 が 別の部分問題の解 に 影響を与えない
最長単純路 は 「 独立」 か? 2つ の 最適解 を 組み合わせると、 経路 は 単純 でなくなる 部分問題 q -> r   への 最長路 部分問題 r -> t   への 最長路 3 3 部分問題の最適解が別の問題へ影響を与えている q s r t q s r t
最短路は 「単純」 か? 2つ の 部分問題 は w 以外 の 点 を 共有 しない ので 「単純」 もし  w 以外 の 点  x  を 共有 すると u -> x -> w -> x -> v x -> w -> x  を ショートカット すれば、より 最短 な 経路になる 矛盾!
15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5 部分問題重複性
部分問題重複性 の 性質 再帰の仮定で同じ問題が何度も出てくる 動的計画法では部分問題の解を表に記録することで対応する 分割統治法 再帰の仮定で新しい問題が生まれる
連鎖行列積 を 再帰 で 解 いたら… T ( n ) :=  再帰で解いた場合の計算時間
連鎖行列積 を 再帰 で 解 いたら… (2) 置き換え法で  T ( n )=Ω(2 n )  を証明する つまり… 少なくとも  2 n の 計算量!
最適解の再構成 「 最適解の値」 を求めたあとに「 最適解」 を求める 組み立てラインスケジューリング の 場合 直前のステーション を   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) で計算できる
メモ化  (memoize) 再帰の過程で計算結果を覚えておく 重複する部分問題を O (1) で思い出せる O ( n 3 ) 再帰 + メモ化 2 n O ( n 3 ) 連鎖行列積 再帰のみ 動的計画法
動的計画法  v.s.   再帰+メモ化 全ての部分問題を解く必要がある場合 動的計画法の方が優れている 再帰のオーバーヘッドが少ない 時間や表の領域を節約するアルゴリズムもある 一部の部分問題を解く必要がない場合 再帰+メモ化は不要な問題を解かなくてよい
15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5
15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5 15.4   最長共通 部分系列
問題 DNA の 塩基 がどれぐらい 一致 しているか 知 りたい 最長部分系列 を求める
問題 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 〉 部分系列
問題 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 〉 部分系列
問題 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 〉   は 共通部分系列
問題 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 〉   は 共通部分系列
問題 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 〉
問題 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) を求める
総当り作戦 の 破綻 X の部分系列の個数 -> O (2 m ) 総当り には Ω (2 m ) 必要
1. 最適解の構造を 特徴づける
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 〉とする
2.  最適解 の 値 を 再帰的 に 定義 する
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 」 の 長い ほうを 採用する 部分問題の部分問題を共有している -> 部分問題重複性
最適解 の 値 c   [ i ,  j   ]  = X i  と  Y j  の LCS の 長さ ※ 利用しない部分問題が存在する
3. ボトムアップ に 最適解 の 値 を 求 める
動的計画法 の 利用 再帰(メモ化なし)で計算すると指数時間 部分問題の個数は Θ( nm ) 個のみ 動的計画法で ボトムアップ ( 昇順 ) に 解く
LCS-L ENGTH( X , Y ) 左上から1つ ずつ計算 i =0,  j =0 を設定
例  (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
例  (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
例  (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
例  (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
例  (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
例  (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
例  (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
例  (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
例  (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
4.  最適解 を 構成 する
P RINT- LCS ( b , X , i , j )
例  (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
コードの改善 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
15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5
15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5 15.5  最適2分 探索木
問題 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
問題 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  より 大きい全て の 値
問題 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
問題 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 を 求 める
総当り作戦 の 破綻 全ての2分木の個数 -> Ω(4 n / n 3/2 ) 総当り は 非現実的
1. 最適解の構造を 特徴づける
最適 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 から定義される 部分問題 の 最適解
なぜならば もっと期待値が小さい部分木 T ’’   が あるなら、 この部分木 を使って   T   をよりよくできる 矛盾 k x k r k i k j T ’’ T   が 最適 2 分探索木 で あることと
部分問題最適性 を 利用 する キー 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   のみを 含む ※
2.  最適解 の 値 を 再帰的 に 定義 する
最適解 の 値 e [ i ,  j   ]  = キー  ki ,… kj  を含む 最適 2 分探索木 の探索コストの期待値 最終目的:  e [1,  n ]  を求める
最適解の値を求める 部分木の深さが1増えると 探索コストの期待値は 部分木の中の確率の和だけ増加する k r が キー  k i ,… k j  を 含む 最適 2 部分探索木 の 根であるとき
未知 の 値  k  を 求 める root [ i ,  j ]  を  k r  の 添え字 と定義する
3. ボトムアップ に 最適解 の 値 を 求 める
O PTIMAL- BST ( p , q , n )
アルゴリズムの評価 計算量 3 重ループなので  O ( n 3 ) Ω( n 3 )  -> 練習問題  15.2-4 メモリ消費量 Θ( n 2 )
ご清聴ありがとうございました

アルゴリズムイントロダクション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.
  • 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.
    なぜならば もっと速く S1, 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 -WAY( 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.
    行列積 A1 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.
    行列積 A1 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.
    行列積 A1 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.
    括弧付けの個数 ( A1 ( 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.
    括弧付けの個数 ( A1 ( 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.
    括弧付けの個数 ( A1 ( 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.
  • 56.
    A i Ai +1 … A j の 最適括弧付け が A k と A k +1 で 分割すると仮定する A i A i +1 … A k A k +1 … A j
  • 57.
    A i Ai +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- CHAIN- 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 00 0 A 1 30×35 A 2 35×15 A 3 15×10 A 4 10×20 A 5 20×25
  • 74.
    0 i =1j =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 00 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 02,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,8750 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,8750 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,8750 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,8750 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,8750 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,8750 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,8750 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.
    重みなし最短路問題 部分構造最適性を持つ p1 は 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.
  • 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 を求める手順 xm = 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.
  • 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.