150 likes | 279 Views
(0-1) ナップザック問題. n 個の宝物 価値 p 1 , p 2 , ..., p n : 実数 重さ w 1 , w 2 , ..., w n : 実数 どろぼうの袋の最大積載量 limit : 実数 重さの和が limit 以下で,価値が最大となるように,品物を選べ. 制約 Σ n i=1 v i ・ w i ≦ limit v i =0 (盗まない) or 1 (盗む)( 1≦i≦n ) maximize Σ n i=1 v i ・ p i.
E N D
(0-1)ナップザック問題 • n個の宝物 価値 p1, p2, ..., pn : 実数 重さ w1, w2, ..., wn : 実数 どろぼうの袋の最大積載量 limit : 実数 • 重さの和がlimit以下で,価値が最大となるように,品物を選べ. • 制約 Σni=1vi・wi ≦ limit vi=0(盗まない) or 1(盗む)(1≦i≦n) • maximize Σni=1vi・pi p1 w1 p2 w2 p3 w3 p4 w4 limit
ナップザック問題(例) n=5, limit=6 i 1 2 3 4 5 pi 2 5 4 9 6 wi 1 3 2 6 5 i 1 2 3 4 5 pi 2 7 4 3 8 wi 1 4 2 2 5 O(2n)時間かければ解ける.しかし,多項式時間アルゴリズムは知られていない. • おそらく,この問題を解く多項式時間アルゴリズムが存在しないだろう,という強い傍証がある(NP-hard). i=4 9 i=1,5 8 i=1,2,3 11 i=1,5 10 i=2,3 11 i=1,3,4 9
しらみつぶし法 価値,残りの重み (0, 10) i=1を とらない i=1をとる i=2を とらない i=2を とらない (0,10) (5,9) (0, 10) (16, 2) (5, 9) (21, 1) (0, 10) (9.5, 5) (16, 2) (25.5, -3) (5, 9) (14.5, 4) (21, 1) (30.5, -4) (0,10)(7,6)(9.5,5)(16.5,1)(16,2)(23,-2) (5,9)(12,5)(14.5,4)(21.5,0)(21,1)(28,-3) i=2をとる i=2をとる
実数ナップザック問題 • n個の宝物 価値 p1, p2, ..., pn : 実数 重さ w1, w2, ..., wn : 実数 どろぼうの袋の最大積載量limit : 実数 • もし,宝物が砂金なら,... • 価値の密度 pi/wiの大きいものから取っていって,最後の宝物は入れられるだけ入れればよい(Greedyアルゴリズムで最適解が求まる).
分枝限定法 pi/wiでソートしておく 価値,残りの重み (0, 10) 0 2-4 limit 10 19.8<21.5 21.5 21.5 0 (5,9) (5, 9) (21, 1) (14.5, 4) (21, 1) (30.5, -4) (21.5,0)(21,1)(28,-3) 3-4 limit 9 5+16.5>21 21 4 limit 9 5+7<21.5 21 21 21.5 0 21 21 21.5 0 …探索しな くてよい 14.5<21.5
分枝限定法(アイディア) • 価値pi, 重さwiをそれぞれ、配列 p[i], w[i] に記憶しておく。p[i]/w[i] (価値の密度)で降順にソート。 branch&bound(i, p, w) { if (i>n) m=max(p, m) ;% このときのmが答(価値の最大値) else { if(w[i]<=w) branch&bound(i+1, p+p[i],w-w[i]); z=品物iを取らない場合の推測値 ; if (z+p>m) branch&bound(i+1, p, w) ; } • 推測値は、品物i+1~nに対して、limit wで実数ナップザック問題を解いて求める。
行列の乗算 A1A2…An (A1(A2(A3A4))), ((A1A2)(A3A4)), ((A1(A2A3 ))A4), ... A1 10×100 j k A2 100×5 i j A3 5×50 10×5 5×50要素の乗算回数 ijk回 ((A1A2) A3) 5,000+2,500=7,500 10×100 100×50 (A1 (A2A3)) 25,000+50,000=75,000 要素の乗算回数を最小にするには,どうしたらよいか? A1A2…Anの乗算の方法 1/(n+1)・2nCn∈O(4n/n3/2) しらみつぶしでは効率が悪い!
動的計画法(dynamic programming, DP) • m[i, j] AiAi+1...Aj (1≦i≦j≦n) を計算するのに必要な,要素の乗算回数の最小値. • A1 A2 ... An p0×p1 p1×p2 pn-1×pn • 例: m[2, 5] :以下の3つの中の最小値. A2(A3A4A5) m[2,2]+m[3,5]+p1p2p5 (A2A3)(A4A5) m[2,3]+m[4,5]+p1p3p5 (A2A3A4)A5 m[2,4]+m[5,5]+p1p4p5
動的計画法(核心部) 0 (i=jのとき) • m[i, j]=min{ m[i, k]+m[k+1, j]+pi-1pkpj | i≦k<j } (i<jのとき)
動的計画法(実行例) 6 5 4 3 2 1 j i 1 2 3 4 5 6 A1 A2 A3 A4 A5 A6 30×35 35×15 15×5 5×10 10×20 20×25
動的計画法(実行例) 6 5 4 3 2 1 j i 1 2 3 4 5 6 A1 A2 A3 A4 A5 A6 30×35 35×15 15×5 5×10 10×20 20×25
動的計画法(実行例) 6 5 4 3 2 1 j i 1 2 3 4 5 6 A1 A2 A3 A4 A5 A6 30×35 35×15 15×5 5×10 10×20 20×25
動的計画法(実行例) 6 5 4 3 2 1 j O(n3) i 1 2 3 4 5 6 A1 A2 A3 A4 A5 A6 30×35 35×15 15×5 5×10 10×20 20×25
動的計画法(実行例) 6 5 4 3 2 1 j m[i, j]/k ((A1(A2A3))((A4A5)A6)) i 1 2 3 4 5 6 A1 A2 A3 A4 A5 A6 30×35 35×15 15×5 5×10 10×20 20×25
動的計画法(詳細化アルゴリズム) for (w=0; w<n; w++) for (i=1; i<=n-w; i++) { j=i+w ; m[i,j]=0 ; for (k=i; k<j; k++) m[i,j]=min(m[i,j], m[i,k]+m[k+1,j]+p[i-1]*p[j]*p[k]); } %配列p[i]には次元 pi が格納されていると仮定.