フロンティア法と動的計画法の 関係について - 北海 …a4 a4 a1...
Post on 09-Jul-2020
0 Views
Preview:
TRANSCRIPT
フロンティア法と動的計画法の関係について
川原 純 (JST ERATO)
joint work with 堀山 貴史(埼玉大)
• フロンティア法は動的計画法である
• 動的計画法はフロンティア法であるか?
–ある種の動的計画法はフロンティア法的な見方が可能である
動機
• 動的計画法の設計
–できる人は多い
• フロンティア法の設計
–難しい。新たに習得する必要あり
• 動的計画法の知識でフロンティア法を設計できるようにならないか?
フロンティア法
• ZDDを構築するアルゴリズム
• ZDD やフロンティア法、DPの説明は省略
• ただし、今回扱う問題では「フロンティア」は出てこないので、フロンティア法と呼ぶのは疑問
単に、「トップダウンZDD構築法」と呼ぶべきだが、 便宜上、広義のフロンティア法と呼ぶ。
s-t パスの場合
• 全 s-t パスを表すZDDをフロンティア法で構築する
s e1 t
e2
e3
e4
e5
パスは辺の集合で表現できる
s e1 t
e2
e3
e4
e5
s e1 t
e2
e3
e4
e5
s e1 t
e2
e3
e4
e5
s e1 t
e2
e3
e4
e5
{e1, e4} {e2, e5}
{e1, e3 ,e5} {e2, e3 ,e4}
全ての s-t パスを列挙して、
辺集合の集合で表す
{{e1, e4}, {e2, e5}, {e1, e3 ,e5}, {e2, e3 ,e4}} all s-t path =
s-t パスに対するフロンティア法
全 s-t パスを表現する ZDD をトップダウン的に構築
ZDD
s e1
t
s-t パスに対するフロンティア法 [Knuth 08]
1. 辺に順番を付ける (例えば、s から幅優先)
e2
e3
e4
e5
辺 e1, e2,… の順に処理
2. ZDDを構築
e1 e1 = 0
e2 e2 = 0
e4
e2 e2 = 1 e2 = 0 e2 = 1
e1 = 1
e5
各辺変数 ei に対し、 ei = 0 or 1 を決めていく
(もっと良い方法もあり)
e3 e3 e3 e3 0 1
s e1 t
e2
e3
e4
e5
ei = 1 である辺が s-t パスになっているか?
s-t パスになっている 1
s e1
t
e2
e3
e4
e1 e1 = 0
e2 e2 = 0
e2 e2 = 1 e2 = 0 e2 = 1
e1 = 1
e3 e3 e3
1 0 1 0 1 0 1 0
s-t パスに対するフロンティア法 [Knuth 08]
s e1
t
e2
e3
e4
e1 e1 = 0
e2 e2 = 0
e2 e2 = 1 e2 = 0 e2 = 1
e1 = 1
e3 e3
1 0 1 0
ノードを共有できるときは共有したい
ただし、子DAGを作成せずに、共有可能か判定を行う
s-t パスに対するフロンティア法 [Knuth 08]
e3
1 0 1 0
… …
s t s t
1
2
3
4
5
6
7
8
9
10
11
12 1
2
3
4
5
6
7
8
9
10
11
12
6 7 8
7 6 1 i
mate[i]
…
…
…
…
frontier の部分の mate が同じなら共有する
6 7 8
7 6 1
i
mate[i]
…
… …
…
s-t パスに対するフロンティア法 [Knuth 08]
処理済み 未処理 処理済み 未処理
動的計画法
(1) 部分和問題
3 7 8 15 7 6 4 2
この中から和が22になるようにいくつか選ぶことが
可能か?
動的計画法で解く
• T(i, m): 1~i 番目までで足して m になるような部分集合が存在するなら1, しないなら0
3 1 4 5 和が 9
i m
0 1 2 3 4 5 6 7 8 9
1 0 0 0 0 0 0 0 0 0
1 0 0 1 0 0 0 0 0 0
1 1 0 1 1 0 0 0 0 0
1 1 0 1 1 1 0 1 1 0
1 1 0 1 1 1 1 1 1 1
0
1
2
3
4
x1 x1 = 0
x2 x2 = 0
x4
x2 x2 = 1 x2 = 0 x2 = 1
x1 = 1
x3 x3 x3 x3 0 1
3 1 4 5
この中から和が 9 になる部分集合を列挙せよ ZDDで表す
部分集合に含める 部分集合に含めない
0
0 3
0 1 3 4
0 4 1 5 3 7 8
0 0 0 1 0 0 0 0 0 0 0 0
9 0 0
• ZDDを構築することで…
–全集合を圧縮して保持できる
–条件を考慮した要素の検索、絞り込みができる
–要素数を求める、一様ランダムサンプリング
• DPのテーブルをじっと見ているとZDDが見えてくる
3 1 4 5 和が 9
i m
0 1 2 3 4 5 6 7 8 9
1 0 0 0 0 0 0 0 0 0
1 0 0 1 0 0 0 0 0 0
1 1 0 1 1 0 0 0 0 0
1 1 0 1 1 1 0 1 1 0
1 1 0 1 1 1 1 1 1 1
0
1
2
3
4 0 0 0 0 0 0 0 0 1
ビットOR
i 番目を含める i 番目を含めない 式の形から ZDD が見える
部分和問題の漸化式
T(i, m) = T(i – 1, m) | T(i – 1, m – wi)
i m
0 1 2 3 4 5 6 7 8 9
1 0 0 0 0 0 0 0 0 0
1 0 0 1 0 0 0 0 0 0
1 1 0 1 1 0 0 0 0 0
1 1 0 1 1 1 0 1 1 0
1 1 0 1 1 1 1 1 1 1
0
1
2
3
4
3 1 4 5 和が 9
1
… …
T(0, 0) = 1, T(0, m) = 0 (m = 1,…)
T(i, m) = T(i – 1, update1(m)) * ei ∪ T(i – 1, update0(m))
フロンティア法のDP的な見方
s-t パスに対するフロンティア法
i m
m1 m2 m3 …
0
1
2
1
…
T(i, m) : 辺 e1,…,ei を用いたパスマッチングで、 フロンティア上の mate が m になるものの辺集合族
詳細略
T(0, ms) = { {} }
…
|E|
… …
… … …
全ての動的計画法はフロンティア法的な構造をもつ?
(2) 最長昇順列
5 3 8 6 4 7 1 2 9
T(i, m) : a1 a2 … ai の長さ m の昇順列の中で、末尾が最小のもの
i m
0 1 2 3 4 5
ε φ φ φ φ φ 0 1 2 3
4
T(i, m) = T(i – 1, m)
if ai <= Tail(T(i – 1, m))
if ai > Tail(T(i – 1, m))
a1 a2 … an
ε 5 φ φ φ φ ε 3 φ φ φ φ ε 3 38 φ φ φ ε 3 36 φ φ φ
5 6
ε 3 34 φ φ φ ε 3 34 347 φ φ
Concat( T(i – 1, m – 1), ai )
Concat 列連結
Tail 列の最後
全ての動的計画法はフロンティア法的な構造をもつ?
(2) 最長昇順列
5 3 8 6 4 7 1 2 9
T(i, m) : a1 a2 … ai の長さ m の昇順列の中で、末尾が最小のもの
i m
0 1 2 3 4 5
ε φ φ φ φ φ 0 1 2 3
4
a1 a2 … an
ε 5 φ φ φ φ ε 3 φ φ φ φ ε 3 38 φ φ φ ε 3 36 φ φ φ
5 6
ε 3 34 φ φ φ ε 3 34 347 φ φ
ai を 昇順列に 含めない
含める
T(i, m) = T(i – 1, m)
if ai <= Tail(T(i – 1, m))
if ai > Tail(T(i – 1, m))
Concat( T(i – 1, m – 1), ai )
Concat 列連結
Tail 列の最後
A1 * A2 * A3 * A4 * A5
* =
積の回数は l × m × n
(A1 * A2) * A3 A1 * (A2 * A3) と では積の回数の合計が異なる
l × m 行列 m × n 行列 l × n 行列
(3) 連鎖行列積
A1 A2 A3 100 × 1 1 × 50 50 × 1
(A1 * A2) * A3
100 × 1 × 50 + 100 × 50 × 1 = 10000
A1 * (A2 * A3) 1 × 50 × 1 + 100 × 1 × 1 = 150
S(i, j) = min{ S(i, k) + S(k + 1, j) + pi-1 pk pj} k
A1 * A2 * A3 * A4
p0 × p1 p1 × p2 p2 × p3 p3 × p4
S(i, j) : Ai * Ai+1 * … * Aj の積の最小回数
(Ai * Ai+1 * … * Ak) * (Ak+1 * Ak+2 * … * Aj)
pi-1 × pk 行列 pk × pj 行列
A1 A2 A3 * A4 * *
A1
初期状態
A1
A2
0 1 2 3 4 5 6
A12 A1 A2 A3
A1 A2 A3 A4
A12 A1 A3 A23
要素 掛け算
xi = 0 i 番目が掛け算
xi = 1 i 番目が要素
T(i, m) : i 番目まで進んだとき、 スタックの高さが m であるものの最小値 T(i, m) = min { T(i – 1, m – 1), T(i – 1, m + 1) }
A1 * ((A2 * A3) * A4) を逆ポーランド記法で表す
A12 A1 A3 A23 A4 A4
A1 A2 A34 これは括弧列の集合のZDD表現にもなっている
[Saitoh et al. 09]
a b a c b d c
a a b d a c d
S[p, q] : u1u2…up と v1v2…vq のLCS の長さ
u1u2 … un
v1v2 … vm
S[p, q] = if up = vq
max {S[p, q – 1], S[p – 1, q] } if up = vq
S[p, q] = max{ S[p – 1, q – 1] + Wpq, S[p, q – 1], S[p – 1, q] }
Wpq = 1
– ∞
if up = vq if up = vq
(4) 最長共通部分列 (LCS)
S[p – 1, q – 1] + 1
a b a c b d c
a a b d a c d
i
j
i
j
0
1
2
3
4
5
0 1 2 3 4 5
0 0 0 0 0 0
0 1 1 1 1 1
0 1 1 2 2 2
0 1 2 2 2 3
0 1 2 2 2 3
0 1 2 3 3 3
…
…
a b a c b d c
a a b d a c d
i
j
i
j
0
1
2
3
4
5
0 1 2 3 4 5
0 0 0 0 0 0
0 1 1 1 1 1
0 1 1 2 2 2
0 1 2 2 2 3
0 1 2 2 2 3
0 1 2 3 3 3
…
…
… …
…
…
S[p, q] = max{ S[p – 1, q – 1] + Wpq, S[p, q – 1], S[p – 1, q] }
i = p + q
m = p
T[i, m] = S[p, q]
とおくと
T[i, m] = max { T[i – 2, m – 1] + Wp,i-p, T[i – 1, m – 1], T[i – 1, m] }
MDD (Multi-valued Decision Diagram)
xk = 1
マッチ 0
i を1増やす
2 j を1増やす
マッチ v u
x1 0
1
2
3 … …
…
…
x1
x2
x2 x3
x3
x3
x4
x4 x5
詳しくは略
xi
T[i, S, j] = min {T[i – 1, S – {k}, k] + dkj} k ∈ S
k1 k2 …
(5) 巡回行商人問題
T[i, S, j] : i 個の都市を巡回済みで、 S は巡回済みの都市の集合、 j は最後に訪れた都市、 このときの距離の最小値
dkj k と j の距離
強度が同じ卵が m 個ある。
n – 1 階以下の階から 落下させると必ず割れない
n 階以上の階から 落下させると必ず割れる
n は未知であり、推定したい
最悪の場合、何回試行すれば よいか?
(6) 卵の落下問題
T[p, q] = min { max { T[p, q – h], T[p – 1, h – 1] }} + 1
T[p, q] : 卵の数が p、残り試行の必要がある幅が q のとき、 最悪時に必要な試行の数
h = 1,…,q
= max { T[p, q – h’], T[p – 1, h’ – 1] } + 1
xi
xj
xk
x5
x4
x3
x2
x1
1
(7) フィボナッチ数列
1 1 2 3 5 8 13 … f[i] = f[i – 1] + f[i – 2]
まとめ
• T[i, m] = ( T[i – 1, m’] と T[i – 1, m’’] の式)
• DP をこのように見ることが可能というだけで、役立つかどうかは別問題
• フロンティア法の設計の役に…
の形になっている DP は ZDD で表現可能
なら MDD で表現可能
T[i, m] = ( T[i – 1, m’] と T[i – 1, m’’] と T[i – 1, m’’’] の式)
top related