Presentation is loading. Please wait.

Presentation is loading. Please wait.

フロンティア法 - 組合せ問題の解を列挙索引化するZDD構築アルゴリズム

Similar presentations


Presentation on theme: "フロンティア法 - 組合せ問題の解を列挙索引化するZDD構築アルゴリズム"— Presentation transcript:

1 フロンティア法 - 組合せ問題の解を列挙索引化するZDD構築アルゴリズム
川原 純 科学技術振興機構 ERATO湊離散構造処理系プロジェクト 北海道大学 情報科学研究科

2 講義の目標 パスの数え上げアルゴリズムを理解する 大規模データを扱うためのデータ構造の1つ 「ZDD」 についてより詳しく知る
大規模データの保存、活用 様々な対象を表現するZDDを高速に構築する手法   「フロンティア法」 アルゴリズムを理解する 適用事例について知る

3 ZDD: 集合の集合を表現するデータ構造 e1 e2 e3 e4 e5 e1 e2 e5 e2 e4 e5 e3 e4 e5 e3 e5
(Zero-suppressed Binary Decision Diagram) [S.Minato 93] 1 e1 e2 e3 e4 e5 e1 e2 e5 e2 e4 e5 { { } { } { } , , e3 e4 e5 e3 e5 e5 { } { } { } } , , 集合の集合 ZDD

4 ZDD: 集合の集合を表現するデータ構造 e1 e2 e3 e4 e5 e1 e2 e5 e2 e4 e5 e3 e4 e5 e3 e5
1 e1 e2 e3 e4 e5 e1 e2 e5 e2 e4 e5 { { } { } { } , , e3 e4 e5 e3 e5 e5 { } { } { } } , , 集合の集合 : 0 終端 それぞれ1つずつもつ 1 : 1 終端 ZDD ei e1 e5 : ノード いずれかのラベル e1 , e2 ,… , e5 の順序

5 ZDD: 集合の集合を表現するデータ構造 e1 e2 e3 e4 e5 e1 e2 e5 e2 e4 e5 e3 e4 e5 e3 e5
ノードは0枝と1枝を1つずつもつ 1 e1 e2 e3 e4 e5 e1 e2 e5 e2 e4 e5 { { } { } { } , , e3 e4 e5 e3 e5 e5 { } { } { } } , , 集合の集合 : 0 終端 それぞれ1つずつもつ 1 : 1 終端 ZDD ei e1 e5 : ノード いずれかのラベル e1 , e2 ,… , e5 の順序

6 ZDD: 集合の集合を表現するデータ構造 e1 e2 e3 e4 e5 e1 e2 e5 e2 e4 e5 e3 e4 e5 e3 e5
ノードは0枝と1枝を1つずつもつ 1 e1 e2 e3 e4 e5 e1 e2 e5 e2 e4 e5 { { } { } { } , , e3 e4 e5 e3 e5 e5 { } { } { } } , , 集合の集合 1つの集合が、 top から までの1本のパスに対応 1 ZDD : 0 終端 それぞれ1つずつもつ 1 : 1 終端 ei e1 e5 : ノード いずれかのラベル

7 ZDD: 集合の集合を表現するデータ構造 e1 e2 e3 e4 e5 e1 e2 e5 e2 e4 e5 e3 e4 e5 e3 e5
ノードは0枝と1枝を1つずつもつ 1 e1 e2 e3 e4 e5 e1 e2 e5 e2 e4 e5 { { } { } { } , , e3 e4 e5 e3 e5 e5 { } { } { } } , , 集合の集合 1つの集合が、 top から までの1本のパスに対応 1 ZDD : 0 終端 それぞれ1つずつもつ 1 : 1 終端 ei e1 e5 : ノード いずれかのラベル

8 ZDD: 集合の集合を表現するデータ構造 e1 e2 e3 e4 e5 e1 e2 e5 e2 e4 e5 e3 e4 e5 e3 e5
ノードは0枝と1枝を1つずつもつ 1 e1 e2 e3 e4 e5 e1 e2 e5 e2 e4 e5 { { } { } { } , , e3 e4 e5 e3 e5 e5 { } { } { } } , , 集合の集合 1つの集合が、 top から までの1本のパスに対応 1 ZDD : 0 終端 それぞれ1つずつもつ 1 : 1 終端 ei e1 e5 : ノード いずれかのラベル

9 ZDDの性質 e1 e1 1 1 e2 e2 e2 e3 e3 e4 e4 e5 e5 1 1 等価な2つのノードは必ず共有される

10 パスは辺の集合で表現できる e1 e4 s t e3 e2 e5 e1 e1 e4 e4 s t s t e3 e3 {e1, e4}

11 パスは辺の集合で表現できる e1 e4 全ての s-t パスを列挙して、 s t e3 辺集合の集合で表す e2 e5 e1 e1 e4

12 パスは辺の集合で表現できる e1 e4 s t 全ての s-t パスを列挙して、 e3 辺集合の集合で表す e2 e5
all s-t path = {{e1, e4}, {e2, e5}, {e1, e3 ,e5}, {e2, e3 ,e4}} e1 e4 e1 e4 s t s t e3 {e1, e4} e3 {e2, e5} e2 e5 e2 e5 e1 e1 e4 e4 s t s t e3 e3 {e2, e3 ,e4} {e1, e3 ,e5} e2 e2 e5 e5

13 Knuth のパス列挙アルゴリズム 全 s-t パスを表現する ZDD をトップダウン的に構築 ZDD

14 パス列挙(ZDD構築)アルゴリズム [Knuth 08]
e1 e4 e1 e1 = 1 e1 = 0 s t e3 e2 e2 e2 = 0 e2 = 1 e2 = 0 e2 = 1 e2 e5 e3 e3 e3 e3 1 1. 辺に順番を付ける (例えば、s から幅優先) e4 (もっと良い方法もあり) e5 2. ZDDを構築 辺 e1, e2,… の順に処理 s-t パスになっている 1 s e1 t e2 e3 e4 e5 各辺変数 ei に対し、 ei = 0 or 1 を決めていく ei = 1 である辺が s-t パスになっているか?

15 パス列挙(ZDD構築)アルゴリズム [Knuth 08]
e1 e4 e1 e1 = 1 e1 = 0 s t e3 e2 e2 e2 = 0 e2 = 1 e2 = 0 e2 = 1 e2 e5 e3 e3 e3 e3 1 1. 辺に順番を付ける (例えば、s から幅優先) e4 (もっと良い方法もあり) e5 2. ZDDを構築 s-t パスに なっていない s-t パス + 余分な辺 辺 e1, e2,… の順に処理 s e1 t e2 e3 e4 e5 s e1 t e2 e3 e4 e5 各辺変数 ei に対し、 ei = 0 or 1 を決めていく ei = 1 である辺が s-t パスになっているか?

16 パス列挙(ZDD構築)アルゴリズム [Knuth 08]
e1 e4 e1 e1 = 1 e1 = 0 s t e3 e2 e2 e2 = 0 e2 = 1 e2 = 0 e2 = 1 e2 e5 e3 e3 e3 e3 1 1. 辺に順番を付ける (例えば、s から幅優先) e4 (もっと良い方法もあり) e5 2. ZDDを構築 辺 e1, e2,… の順に処理 1 1 1 1 他は0 各辺変数 ei に対し、 ei = 0 or 1 を決めていく 1 が1つのパスに対応

17 パス列挙(ZDD構築)アルゴリズム [Knuth 08]
e1 e3 e1 e1 = 1 e1 = 0 s t e2 e2 e2 = 0 e2 = 1 e2 = 0 e2 = 1 e2 e4 e3 e3 e3 1 1

18 パス列挙(ZDD構築)アルゴリズム [Knuth 08]
e1 e3 e1 e1 = 1 e1 = 0 s t e2 e2 e2 = 0 e2 = 1 e2 = 0 e2 = 1 e2 e4 e3 e3 e3 1 1 ノードを共有できるときは共有したい ただし、子DAGを作成せずに、共有可能か判定を行う

19 パス列挙(ZDD構築)アルゴリズム [Knuth 08] s t
e1 e3 パス列挙(ZDD構築)アルゴリズム [Knuth 08] s t e2 e4 e1 = 0 e1 = 1 e2 = 0 e2 = 1 ? e1 = 0 e1 = 1 e2 = 1 e2 = 0 途中の経路は分からないが s につながっていることは分かっている

20 パス列挙(ZDD構築)アルゴリズム [Knuth 08]
s t 未処理辺 処理済み辺 t フロンティア

21 … … パス列挙(ZDD構築)アルゴリズム [Knuth 08] d a t s f c b h g f f d d d d a s a s

22 … … パス列挙(ZDD構築)アルゴリズム [Knuth 08] d f a t s d f a c s b t h g c b h g f

23 mate 配列 … … パス列挙(ZDD構築)アルゴリズム [Knuth 08] 接続情報の記憶法 d 頂点がパスの端 a a t s
逆端の頂点 f c s b b h 頂点がパスの途中 g 頂点がいずれの パスにも含まれない v d f g v a b 自身の頂点 mate[v] mate[v] f d s a 0 mate 配列

24 パス列挙(ZDD構築)アルゴリズム [Knuth 08] a e1 e5 s t e3 e2 a s b e6 e4 s a c
mate 値 a s b e6 e4 s a c b a s a a b b s s a s b s s s a c s c s s

25 パス列挙(ZDD構築)アルゴリズム [Knuth 08] a e1 e5 s t e3 e2 a s b e6 e4 s a c
mate 値 a s b e6 e4 s a c a a b s b a s s b s a s a b s s s c s

26 パス列挙(ZDD構築)アルゴリズム [Knuth 08]
a e1 e5 s t e3 e2 b e6 e4 c s a s c s s a c t s

27 パス列挙(ZDD構築)アルゴリズム [Knuth 08] a e1 e5 s t e3 e2 b e6 e4 c
s a s c s a t 1 s c s 1 1

28 パス列挙(ZDD構築)アルゴリズム [Knuth 08] a e1 e5 s t e3 e2 b e6 e4 c
s a 根から  までの 1つの経路が 1 つのs-t パスに 対応する 1 s c s a t 1 s c s 1 1

29 パス列挙(ZDD構築)アルゴリズム [Knuth 08]
mate 配列の更新例 a a g g b b s c s c d d f f v a b c d f v a b c d f g mate[v] c a d s mate[v] g d s c

30 パス列挙(ZDD構築)アルゴリズム [Knuth 08]
mate 配列の更新 一般に a b c d c d a b c d a b a b c d d c 最大4か所書きかえれば更新できる

31 パス列挙アルゴリズム [Knuth 08]

32 枝刈り a a b c s g d f g b s c d f

33 枝刈り a a b c s g d f g b s c d f

34 枝刈り a a b c s g d f t g b s c d t f

35 枝刈り 1 a a b c s g d f t g b s c d t f

36 パス列挙アルゴリズム [Knuth 08]

37 p q 終端判定条件 辺 e を処理する前の判定 if x = 1
if GetDegree(p) = 2 or GetDegree(q) = 2 終端 if (p = s or p = t) and GetDegree(p) = 1 終端 GetDegree(v) if (q = s or q = t) and GetDegree(q) = 1 if mate[v] == v 終端 return 0 if mate[p] = q and mate[q] = p if mate[v] == 0 終端 return 2 if mate[p] = s and mate[q] = t or else mate[p] = t and mate[q] = s return 1 for each vertex v in the frontier if v != s or v != t or v!= p or v!= q if GetDegree(v) = 1 終端 end for 1 終端 end if

38 a a g g b b s s c c d d f f 辺 e を処理した後の判定
for each v such that v がフロンティアから外れる if v = s or v = t if GetDegree(v) = 0 GetDegree(v) 終端 if mate[v] == v else return 0 if GetDegree(v) = 1 if mate[v] == 0 終端 return 2 else return 1 a a g g b b s c s c d d f f

39 e1 e3 s パスの数え上げ e2 e4 e5 e6 e8 e7 e9 e10 t e11 e12 12 6 6 6 6 2 4 3 3

40 実験結果 s n × n グリッド t 頂点の数 (n + 1) × (n + 1)
・・・ n × n グリッド t 頂点の数 (n + 1) × (n + 1) The On-Line Encyclopedia of Integer Sequence (OEIS) : 数列大辞典

41 実験結果 s n × n グリッド t 頂点の数 (n + 1) × (n + 1)
・・・ n × n グリッド t 頂点の数 (n + 1) × (n + 1) The On-Line Encyclopedia of Integer Sequence (OEIS) : 数列大辞典

42 実験結果 s n × n グリッド t 頂点の数 (n + 1) × (n + 1) n time(秒) 15 206.0 16 701.9
17 2326.0 18 7607.1 19 20 21 実験結果 ・・・ n × n グリッド t 頂点の数 (n + 1) × (n + 1) Thanks to 岩下洋哲氏

43 実験結果 日本地図グラフ 北海道から鹿児島までの全パス 日本地図 47 0.01秒 951 1.4 × 1010 2重化 94
頂点数 計算時間 ZDDノード数 パスの数 日本地図 47 0.01秒 951 1.4 × 1010 2重化 94 248.72秒 18,971,787 5.0 × 1044 (= 503正9760澗3851溝1518穣9594杼2145垓9492京6092兆3972億3861万6064)

44 講義の目標 パスの数え上げアルゴリズムを理解する 大規模データを扱うためのデータ構造の1つ 「ZDD」 についてより詳しく知る
大規模データの保存、活用 様々な対象を表現するZDDを高速に構築する手法   「フロンティア法」 アルゴリズムを理解する 適用事例について知る

45 ZDD と集合族 集合の集合(集合族)は ZDD で効率よく保持できる a 1 b b {{a, b, c, d}, {a, c}, {b, d}, {b, c, d}} c c c d d d 1 1 1 1 は省略

46 ZDD と集合族 集合族への操作例: a を含む集合だけを取り出し、a を消去する {{a, b, c, d}, {a, c}, {b, d}, {b, c, d}} {{b, c, d}, {c}} a を含まない集合だけ 取り出すなら、LO 枝側を もってこればよい a 1 b b b c c c c c d 1 d d d 1 1 1 1 1 トップの要素なら簡単にできる

47 ZDD と集合族 集合族への操作例: c を含む集合だけを取り出し、c を消去する {{a, b, c, d}, {a, c}, {b, d}, {b, c, d}} {{a, b, d}, {a}, {b, d}} a a 1 1 b b b b c c c c c c d d d d 1 d d 1 1 1 1 1 1 1 トップでなければ、その変数の深さまで潜って、 枝の付け替えを行う

48 ZDD と集合族 集合族への操作例: c を含む集合だけを取り出し、c を消去する {{a, b, c, d}, {a, c}, {b, d}, {b, c, d}} {{a, b, d}, {a}, {b, d}} c を含まない集合だけ 取り出すなら、LO 枝の 方に付け替えればよい a a 1 1 b b b b c c c c c c d d d 1 d d 1 d 1 1 1 1 1 1 トップでなければ、その変数の深さまで潜って、 枝の付け替えを行う

49 ZDD と集合族 集合族への操作例: 集合族 F から要素 x を含む集合だけを取り出し、x を消去する F / x 集合族 F から要素 x を含まない集合だけを取り出し、x を消去する F % x {{a, b, c, d}, {a, c}, {b, d}, {b, c, d}} abcd + ac + bd + bcd = (abd + a + bd) c + bd c を含む集合だけを取り出し、c を消去する (abcd + ac + bd + bcd ) / c = abd + a + bd c を含む集合だけを取り出し、c を消去する (abcd + ac + bd + bcd ) % c = bd

50 ZDD と集合族 集合族への操作例: a を各要素に追加する {{b, c, d, e}, {b, d}, {c, e}, {c, d}} {{a, b, c, d, e}, {a, b, d}, {a, c, e}, {a, c, d}} a b 1 b c c c c d d d d d d e e e 1 e e e 1 1 1 1 1 1 1 トップに加える場合

51 ZDD と集合族 集合族への操作例: d を各要素に追加する {{a, b, c, d, e}, {a, c, d},
{{a, b, c, e}, {a, c}, {b, e}, {b, c}} {{a, b, c, d, e}, {a, c, d}, {b, d, e}, {b, c, d}} a d が1つも 含まれない場合 a 1 b b b b c c c c c c d d d d e e e 1 e e e 1 1 1 1 1 1 1 間に加える場合

52 ZDD と集合族 集合族への操作例: d を各要素に追加する {{a, b, c, e}, {a, d},
{b, e}, {b, d}} {{a, b, c, d, e}, {a, d}, {b, d, e}, {b, d}} d が含まれる場合 {d} ∪ {d} = {d} である それほど簡単ではない(省略)

53 ZDD と集合族 集合族への操作例: 集合族 F の各要素に x を加える F * x {{a, b, c, e}, {a, d}, {b, e}, {b, d}} abce + ad + be + bd 各要素に d を加える (abce + ad + be + bd) * d = abcde + add + bde + bdd = abcde + ad + bde + bd

54 ZDD と集合族 集合族 F から要素 x を含む集合だけを取り出す(x は消去しない) (F / x) * x {{a, b, c, d}, {a, c}, {b, d}, {b, c, d}} abcd + ac + bd + bcd = (abd + a + bd) c + bd c を含む集合だけを取り出す(c は消去しない) ((abcd + ac + bd + bcd ) / c) * c = (abd + a + bd) * c = abcd + ac + bcd

55 ZDD と集合族 F = { {c}, {b, c} , {a}, {a, b}, {a, b, c} } G = { {b}, {b, c}, {a, b} } c + bc + a + ab + abc b + bc + ab a a 1 1 b b b b c c c c 1 1 F ∪ G = { {c}, {b, c} , {a}, {a, b}, {a, b, c}, {b} }

56 F = { {c}, {b, c} , {a}, {a, b}, {a, b, c} }
G = { {b}, {b, c}, {a, b} } c + bc + a + ab + abc b + bc + ab a a 1 1 b b b b c c c c 1 1 (c + bc) a(ε + b + bc) (b + bc) a(b) F ∪ G = (c + bc) ∪ (c + bc) a((ε + b + bc) ∪(b))

57 F G a a 1 1 F0 F1 G0 G1 一般に F = F0 ∪ a * F1 G = G0 ∪ a * G1 のとき F ∪ G = (F0 ∪ G0) ∪ a * (F1 ∪ G1)

58 apply (F, G, ∪) = make_node(a, apply (F0, G0, ∪), apply (F1, G1, ∪))
1 1 1 F0 F1 G0 G1 F0 ∪ G0 F1 ∪ G1 一般に F = F0 ∪ a * F1 G = G0 ∪ a * G1 のとき F ∪ G = (F0 ∪ G0) ∪ a * (F1 ∪ G1) (ノード飛び越しがあると もっと複雑) apply (F, G, ∪) = make_node(a, apply (F0, G0, ∪), apply (F1, G1, ∪)) apply (F, {}, ∪) = F など ∩ や Δ (対称差) なども同様

59 F G F ∪ G a a a 1 1 1 F0 F1 G0 G1 F0 ∪ G0 F1 ∪ G1 最悪計算量は (F のノード数) * (G のノード数) 演算をキャッシュすると高速化できる (実用的には出力ZDDのノード数に線形のことが多い)

60 e1 e3 s F: 全s-t パスを表すZDD e2 e4 e5 e6 e8 e7 e9 e10 t e11 e12 e9 を必ず通る s-t パスの集合は? (F / e9) * e9 e9 を必ず通らない s-t パスの集合は? (F % e9) * e9

61 a, b, c, d のうち、 ちょうど3個の要素からなる集合の集合 を表すZDD { {a, b, c}, {a, b, d}, {a, c, d}, {b, c, d} } a 1 b b R(3, 4) と表記する c c c d d d d 1

62 e9 を必ず通る長さが 8 の s-t パスの集合は?
F: 全s-t パスを表すZDD e2 e4 e5 e6 e8 e7 e9 e10 t e11 e12 e9 を必ず通る長さが 8 の s-t パスの集合は? ((F / e9) * e9) ∩ R(8, 12) (必ずしも効率的とは限らない。 フロンティア法で直接作る方が速いことも)

63 条件付きパス(サイクル)の列挙

64 1 条件付きパス(サイクル)の列挙 e2 e1 e3 e4 f = f + f / e4 % e3 % e2 % e1) * e4

65 一様ランダムサンプリング 確率 確率 a a 1 b b b b c c c d d {d}, {c}, {c, d},
13 7 13 13 6 13 a a 1 6 7 6 7 b b b b 3 4 3 c c c d d 1 2 {d}, {c}, {c, d}, {b}, {b, d}, {b, c, d}, {a}, {a, d}, {a, c, d}, {a, b}, {a, b, c}, {a, b, d}, {a, b, c, d} 1

66 一様ランダムサンプリング 確率 確率 a 1 b b b c c c c c d d {d}, {c}, {c, d},
13 確率 確率 a 1 6 3 6 3 6 b 6 7 b b 3 3 3 4 3 c c c c c d d 1 2 {d}, {c}, {c, d}, {b}, {b, d}, {b, c, d}, {a}, {a, d}, {a, c, d}, {a, b}, {a, b, c}, {a, b, d}, {a, b, c, d} 1

67 一様ランダムサンプリング {b, d} a 1 b b c c c d d {d}, {c}, {c, d},
13 a 1 6 7 b b 3 4 3 c c c d d 1 2 {d}, {c}, {c, d}, {b}, {b, d}, {b, c, d}, {a}, {a, d}, {a, c, d}, {a, b}, {a, b, c}, {a, b, d}, {a, b, c, d} 1

68 講義の目標 パスの数え上げアルゴリズムを理解する 大規模データを扱うためのデータ構造の1つ 「ZDD」 についてより詳しく知る
大規模データの保存、活用 様々な対象を表現するZDDを高速に構築する手法   「フロンティア法」 アルゴリズムを理解する 適用事例について知る

69 フロンティア法とは トップダウンにZDDを構築する技法 e1 e1 = 1 フロンティア e1 = 0 a e2 e2 e2 = 0
t s e3 e3 b 1 c v a b c ノードを共有できるときは共有したい mate[v] 0 s c 各ノードについて、 フロンティア上に 何らかの情報を持たせて、 共有可能性と枝刈りを判定 一般化して configuration と呼ぶ

70 パス列挙アルゴリズム [Knuth 08] (a), (b), (c) がs-tパスの場合の固有の処理

71 ハミルトンパス (全点を通る s-t パス) 辺 e を処理した後の判定
for each v such that v がフロンティアから外れる if v = s or v = t if GetDegree(v) = 0 終端 else if GetDegree(v) = 1 or GetDegree(v) = 0 終端

72 複数終端対パス s2 s1 - t1 パス s1 交差しない の組を全列挙 s2 - t2 パス t3 s3 - t3 パス
si や ti をヒント頂点、 t2 s3 (si , ti) をヒントペアという t1

73 複数終端対パス p q 終端判定条件 辺 e を処理する前の判定 if x = 1
if GetDegree(p) = 2 or GetDegree(q) = 2 終端 GetDegree(v) if (p がヒント頂点) and GetDegree(p) = 1 if mate[v] == v 終端 return 0 if (q がヒント頂点) and GetDegree(q) = 1 if mate[v] == 0 終端 return 2 if mate[p] = q and mate[q] = p else 終端 return 1 if (mate[p] と mate[q] がともにヒント頂点) (mate[p], mate[q]) も (mate[q], mate[p]) もヒントペアではない 終端

74 最後の辺を処理し終えて、 終端でなければ 終端
複数終端対パス 終端判定条件 辺 e を処理した後の判定 for each v such that v がフロンティアから外れる if v がヒント頂点 GetDegree(v) if GetDegree(v) = 0 if mate[v] == v return 0 終端 if mate[v] == 0 else return 2 if GetDegree(v) = 1 else 終端 return 1 最後の辺を処理し終えて、   終端でなければ   終端 1

75 全域木 (本質的には [K.Sekine, H.Imai 95]) サイクルが生じてはいけない 連結成分が2つ以上 生じてはいけない

76 フロンティア法(再掲) 枝刈り の設計 configuration の設計

77 全域木 (本質的には [K.Sekine, H.Imai 95]) configuration の設計 a a b b A A c c B
等価 v a b c v a b c mate[v] A A B mate[v] A A B configuration として、各頂点が属する 連結成分のIDを記憶 同じ連結成分に属しているなら同じID 異なる連結成分に属しているなら異なるID

78 全域木 (本質的には [K.Sekine, H.Imai 95]) 枝刈りの設計 a a b A b A c c B B v a b c a
同じ連結成分を 両端とする辺を加えるとき、 サイクルができる a a b A b に接続 A c c B B 加えない v a b c a mate[v] A A B 孤立成分が 生じる b A 最後の辺まで処理後、 0 に接続されないなら に接続 c B 1 に接続

79 マッチングの列挙 configuration の設計 枝刈りの設計 a a b b c c v a b c i a b c mate[v]
マッチングに 使われている 頂点に 辺を加える時 c c に接続 v a b c i a b c mate[v] mate[i] 既にマッチングに使われている頂点は 1 使われていない頂点は 0 と すればよい 最後の辺まで処理後、 0 に接続されないなら 1 に接続

80 辺変数型 パス型 森型 頂点変数型 グラフ ハイパー グラフ フラグ型 クリーク 頂点被覆 0-1 ナップザック 頂点彩色 マトロイド
[Knuth 2008] 全域木 一般化 ハミルトンパス カット(セット) 信頼性多項式 [Imai et al. 1997] 辺被覆 集合被覆 s-tカット オイラー路 シュタイナー木 k 終端カット サイクル 根付き森、木 完全 マッチング [Knuth 2008] 連結成分 集合分割 ハミルトンサイクル 信頼性多項式 複数終端対パス [Hardy et al. 2007] 集合 パッキング Tutte多項式 マッチング (ナンバーリンク) Jones多項式   (ひもの絡み目) [Yoshinaka et al. 2012]  上記3つ [今井, 今井 1998] 複数サイクル 上記2つ[関根, 今井 1996] 有向グラフ 有向パス [Knuth 08] 頂点変数型 クリーク 頂点被覆 0-1 ナップザック 頂点彩色 マトロイド 独立集合 特殊 部分和 括弧列 Tutte 多項式 [Saitoh et al. 2009] [Imai et al. 1996] 支配集合 特殊 数分割 動的計画法的な見方も可能

81 支配集合の列挙 v1 v4 v7 v5 v8 v2 v9 v1 v3 v1 = 0 v1 = 1 v6 v2 v2 v2 = 0
頂点の取捨選択の情報を (フロンティア上の)頂点に記憶しているため、 効率が良いとは限らない v1 v4 v7 v5 v8 v2 ではない全ての頂点は v9 v1 v3 v1 = 0 v1 = 1 少なくとも1つの に隣接する v6 v2 v2 v2 = 0 v2 = 1 v2 = 0 v2 = 1 v1 v4 v7 頂点を変数とするZDDを構築 v5 v8 v2 i 頂点が支配されているなら1 支配されていないなら0 と すればよい mate[i] v3 v9 v6

82 0/1 ナップザック問題の列挙 x1 x2 xn x1 x1 = 1 x1 = 0 x1 x2 x2 x2 = 1 x2 = 0
重さ x1 各アイテムを 取るかとらないかを選択 重さが M 以下になるような取り方 50 x2 100 xn configuration = 重さの総和 210 x1 x1 = 1 x1 = 0 50 x1 x2 x2 x2 = 0 x2 = 1 x2 = 0 x2 = 1 x2 動的計画法のテーブルと見ることもできる このグラフに対する フロンティア法と 見ることができる xn

83 辺変数型 パス型 森型 頂点変数型 グラフ ハイパー グラフ フラグ型 クリーク 頂点被覆 0-1 ナップザック 頂点彩色 マトロイド
[Knuth 2008] 全域木 一般化 ハミルトンパス カット(セット) 信頼性多項式 [Imai et al. 1997] 辺被覆 集合被覆 s-tカット オイラー路 シュタイナー木 k 終端カット サイクル 根付き森、木 完全 マッチング [Knuth 2008] 連結成分 集合分割 ハミルトンサイクル 信頼性多項式 複数終端対パス [Hardy et al. 2007] 集合 パッキング Tutte多項式 マッチング (ナンバーリンク) Jones多項式   (ひもの絡み目) [Yoshinaka et al. 2012]  上記3つ [今井, 今井 1998] 複数サイクル 上記2つ[関根, 今井 1996] 有向グラフ まとめ  ・フロンティア法によって様々な対象を表現する        ZDDを構築可能 → configuration と枝刈りの設計 有向パス [Knuth 08] 頂点変数型 クリーク 課題: 計算量評価等の理論的裏付け 頂点被覆 0-1 ナップザック 頂点彩色 マトロイド 独立集合 特殊 部分和 括弧列 Tutte 多項式 [Saitoh et al. 2009] [Imai et al. 1996] 支配集合 特殊 数分割 動的計画法的な見方も可能

84 適用事例:配電網のスイッチ構成 配電網 すべての家は ちょうど1つの変電所に つながっている必要がある サイクルが生じてはいけない
変電所を根とする 根付き全域森 根付き森 ZDD 電気制約 ZDD 条件を満たす ZDD 引用:

85 適用事例:配電網のスイッチ構成 配電網 468個のスイッチ 制約条件を満たす解の個数は 通り (= 約1063)
通り (= 約1063) 約1時間15分  ZDDノード数 約110万個 (779MB) すべての家は ちょうど1つの変電所に つながっている必要がある サイクルが生じてはいけない 変電所を根とする 根付き全域森 根付き森 ZDD 電気制約 ZDD 条件を満たす ZDD 引用:

86 まとめ パスの数え上げアルゴリズム ZDD について詳細 様々な対象を表現するZDDを高速に構築する手法 「フロンティア法」 アルゴリズム
  「フロンティア法」 アルゴリズム ハミルトンパス 複数終端対パス 全域木 マッチング 適用事例 フロンティア法のソースコード


Download ppt "フロンティア法 - 組合せ問題の解を列挙索引化するZDD構築アルゴリズム"

Similar presentations


Ads by Google