PowerPoint プレゼンテーション

Download Report

Transcript PowerPoint プレゼンテーション

ネットワーク理論講義補助資料
Text.
組合せ最適化とアルゴリズム
4.4 節 動的計画
pp. 123-131
補助資料:組合せ最適化短編集(朝倉書店)
ナップサック問題(クマさん人形泥棒のお話)


動的計画は,3.1.3 節(pp.67-71) で最短路問題
に対するBellman-Ford法で用いた.
ここでは,ナップサック問題を例として動的計画
の設計法を解説.
4.4 節
動的計画
1
整数ナップサック問題
16万円
19万円
16
23万円
28万円
28
23
クマさん人形は4種類.
各種類ごとに在庫は豊富.
7kg
2kg
3kg
4kg
5kg
極小
小
中
大
4.4 節
動的計画
ナップサックの重量制約を
破らないように,なるべく
価値の高いものを盗もう!
2
動的計画





ナップサックの重量上限をθとして,θを0,1,2,・・・,7と順に
計算.
クマさんの種類の集合N={極小,小,中,大}
クマさんの種類iの重量si,価値vi
重量上限θのときの最適値(クマさんの価値の合計)をf(θ)
関数 f(θ) には以下の関係が成立(Bellman方程式)
f ( )  max  f (  si )  vi  クマさんiの価値
iN
重量上限θのときの最適値
4.4 節
上限がθーsiのときの最適値
動的計画
3
動的計画アルゴリズム
f(θ) :=0 for all θ=0,1,2,...,b
for θ =0 to b-min{si}
for all i ∈ N do
if f(θ+si) < f(θ)+vi then
f(θ+si) := f(θ)+vi
4.4 節
動的計画
4
for theta in range(b-min(s)+1):
for i in range(len(s)):
if theta+s[i]>b:
b=7
continue
s=[2,3,4,5]
v=[16,19,23,28]
f={}
for theta in range(b+1):
f[theta]=0
if f[theta+s[i]] <
f[theta]+v[i]:
f[theta+s[i]] =
f[theta]+v[i]
for theta in range(b+1):
print f[theta],
4.4 節
動的計画
5
整数ナップサック問題に対する動的計画
θ 0 1
0 0 0
1 0 0
2 0 0
3 0 0
4 0 0
5 0 0
0 0
4.4 節
2
0
16
16
16
16
16
16
3
0
19
19
19
19
19
19
動的計画
4
0
23
23
32
32
32
32
5
0
28
28
35
35
35
35
6
0
0
28
39
42
48
48
7
0
0
0
44
47
51
51
6
動的計画のネットワーク表現
(閉路をもたない最短路問題への帰着)
可能なθを状態とよび点で表す.
ある状態(点)をもとに別の状態(点)のfを計算できるとき枝を引き,付加される
価値を枝の費用とする.->閉路をもたないネットワーク上の最短路問題(3.1.5
節の方法で解ける!);0から7までの最短路が解となる.
23
0
23
23
16
16
16
16
16
16
1
2
3
4
5
6
19
4.4 節
23
19
28
19
28
動的計画
19
28
7
19
7
0-1ナップサック問題に対する動的計画



ナップサックの重量θだけでは状態を表現できな
い!
クマさんの品揃えを 1..k 種類に限定したときの
最適値 f(k ,θ)
Bellman方程式
f (k , )  max  f (k  1,  sk )  vk , f (k  1, ) 品揃え1..k, 重量上限θの
ときの最適値
4.4 節
第k番目のクマさんをもって
第k番目のクマさんをもって
逃げない場合の価値の合計
逃げる場合の価値の合計
動的計画
8
0-1ナップサック問題に対する動的計画
k
θ
0
1
2
3
4
4.4 節
0 1 2 3 4 5 6 7
0
0
16
0
16 19 19 35
0
16 19 23 35 39 42
0
16 19 23 35 39 44
動的計画
9
f={}
for theta in range(b+1):
if theta>=s[0]:
f[0,theta]=v[0]
else:
f[0,theta]=0
for k in range(len(s)-1):
for theta in range(b+1):
f[k+1,theta]=f[k,theta]
for theta in range(b-s[k+1]+1):
if f[k+1,theta+s[k+1]] < f[k,theta]+v[k+1]:
f[k+1,theta+s[k+1]] = f[k,theta]+v[k+1]
4.4 節
動的計画
10
0-1ナップサック問題に対する動
的計画のネットワーク表現
0
1
2
16
0
16
1
16
2
1
2
0
1
3
2
0
4.4 節
1
4
4
23
3
4
28
2
3
動的計画
6
7
6
7
6
7
6
7
6
7
16
5
19
19
3
28
5
16
19
23
23
4
16
19
19
0
3
5
23
5
28
4
5
11