Download - フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム
フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム
川原 純
科学技術振興機構 ERATO 湊離散構造処理系プロジェクト北海道大学 情報科学研究科
講義の目標• パスの数え上げアルゴリズムを理解する• 大規模データを扱うためのデータ構造の 1 つ 「 ZDD 」 についてより詳しく知る– 大規模データの保存、活用
• 様々な対象を表現する ZDD を高速に構築する手法
「フロンティア法」 アルゴリズムを理解する– 適用事例について知る
ZDD: 集合の集合を表現するデータ構造
{
}
e1 e2 e4e2
e5e4e3
,
, e3
,
0 1
10
e1
e2
e3
e4
e5
e5
e5 e5
e5,
{ } { } { }
{ } { } { }
ZDD
集合の集合
(Zero-suppressed Binary Decision Diagram) [S.Minato 93]
ZDD: 集合の集合を表現するデータ構造
{
}
e1 e2 e4e2
e5e4e3
,
, e3
,
0 1
10
e1
e2
e3
e4
e5
e5
e5 e5
e5,
{ } { } { }
{ } { } { }
集合の集合
ZDD
0 : 0 終端
1 : 1 終端それぞれ 1 つずつもつ
ei : ノード e1 e5~ いずれかのラベルe1 , e2,…, e5 の順序
ZDD: 集合の集合を表現するデータ構造
{
}
e1 e2 e4e2
e5e4e3
,
, e3
,
0 1
10
e1
e2
e3
e4
e5
e5
e5 e5
e5,
{ } { } { }
{ } { } { }
集合の集合
ZDD
0 : 0 終端
1 : 1 終端それぞれ 1 つずつもつ
ei : ノード e1 e5~ いずれかのラベルe1 , e2,…, e5 の順序
ノードは 0 枝と 1 枝を 1 つずつもつ
ZDD: 集合の集合を表現するデータ構造
{
}
e1 e2 e4e2
e5e4e3
,
, e3
,
0 1
10
e1
e2
e3
e4
e5
e5
e5 e5
e5,
{ } { } { }
{ } { } { }
集合の集合
ZDD0 : 0 終端
1 : 1 終端それぞれ 1 つずつもつ
ei : ノード e1 e5~ いずれかのラベル
ノードは 0 枝と 1 枝を 1 つずつもつ
1 つの集合が、top から までの 1 本のパスに対応1
ZDD: 集合の集合を表現するデータ構造
{
}
e1 e2 e4e2
e5e4e3
,
, e3
,
0 1
10
e1
e2
e3
e4
e5
e5
e5 e5
e5,
{ } { } { }
{ } { } { }
集合の集合
ZDD0 : 0 終端
1 : 1 終端それぞれ 1 つずつもつ
ei : ノード e1 e5~ いずれかのラベル
ノードは 0 枝と 1 枝を 1 つずつもつ
1 つの集合が、top から までの 1 本のパスに対応1
ZDD: 集合の集合を表現するデータ構造
{
}
e1 e2 e4e2
e5e4e3
,
, e3
,
0 1
10
e1
e2
e3
e4
e5
e5
e5 e5
e5,
{ } { } { }
{ } { } { }
集合の集合
ZDD0 : 0 終端
1 : 1 終端それぞれ 1 つずつもつ
ei : ノード e1 e5~ いずれかのラベル
ノードは 0 枝と 1 枝を 1 つずつもつ
1 つの集合が、top から までの 1 本のパスに対応1
0 1
10
e1
e2
e3
e4
e5
e2
等価な 2 つのノードは必ず共有される
0 1
10
e1
e2
e3
e4
e5
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 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 パスを列挙して、辺集合の集合で表す
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 =
Knuth のパス列挙アルゴリズム全 s-t パスを表現する ZDD をトップダウン的に構築
ZDD
se1
t
パス列挙( ZDD 構築)アルゴリズム [Knuth 08]
1. 辺に順番を付ける(例えば、 s から幅優先)
e2
e3
e4
e5
辺 e1, e2,… の順に処理
2. ZDD を構築
e1e1 = 0e2
e2 = 0
e4
e2e2 = 1 e2 = 0 e2 = 1
e1 = 1
e5
各辺変数 ei に対し、
ei = 0 or 1 を決めていく
(もっと良い方法もあり)
e3 e3 e3 e30 1
s e1 t
e2
e3
e4
e5
ei = 1 である辺が s-t パスになっているか?
s-t パスになっている1
se1
t
1. 辺に順番を付ける(例えば、 s から幅優先)
e2
e3
e4
e5
辺 e1, e2,… の順に処理
2. ZDD を構築
e1e1 = 0e2
e2 = 0
e4
e2e2 = 1 e2 = 0 e2 = 1
e1 = 1
e5
各辺変数 ei に対し、
ei = 0 or 1 を決めていく
(もっと良い方法もあり)
e3 e3 e3 e30 1
s e1 t
e2
e3
e4
e5
ei = 1 である辺が s-t パスになっているか?
s-t パスになっていない0
s e1 t
e2
e3
e4
e5
s-t パス +余分な辺
0
パス列挙( ZDD 構築)アルゴリズム [Knuth 08]
se1
t
1. 辺に順番を付ける(例えば、 s から幅優先)
e2
e3
e4
e5
辺 e1, e2,… の順に処理
2. ZDD を構築
e1e1 = 0e2
e2 = 0
e4
e2e2 = 1 e2 = 0 e2 = 1
e1 = 1
e5
各辺変数 ei に対し、
ei = 0 or 1 を決めていく
(もっと良い方法もあり)
e3 e3 e3 e30 1
11 他は 011
が 1 つのパスに対応1
パス列挙( ZDD 構築)アルゴリズム [Knuth 08]
パス列挙( ZDD 構築)アルゴリズム [Knuth 08]
s e1 t
e2
e3
e4
e1e1 = 0e2
e2 = 0e2
e2 = 1 e2 = 0 e2 = 1
e1 = 1
e3 e3 e3
10 1 0 10 1 0
パス列挙( ZDD 構築)アルゴリズム [Knuth 08]
e1e1 = 0e2
e2 = 0e2
e2 = 1 e2 = 0 e2 = 1
e1 = 1
e3 e3
10 1 0
ノードを共有できるときは共有したいただし、子 DAG を作成せずに、共有可能か判定を行う
s e1 t
e2
e3
e4e3
10 1 0
パス列挙( ZDD 構築)アルゴリズム [Knuth 08]
e1 = 0 e1 = 1
e2 = 0e2 = 1
e1 = 0 e1 = 1
e2 = 0e2 = 1
?
s e1 t
e2
e3
e4
途中の経路は分からないがs につながっていることは分かっている
パス列挙( ZDD 構築)アルゴリズム [Knuth 08]
s t
… …
t
フロンティア
処理済み辺 未処理辺
パス列挙( ZDD 構築)アルゴリズム [Knuth 08]
s t
… …
t
a
b c
d
hf
g
fd
sa
b c
d
hf
g
s t a
b c
d
hf
g
s t
fd
s
パス列挙( ZDD 構築)アルゴリズム [Knuth 08]
s t
… …
t
a
b c
d
hf
g
fd
sa
b c
d
hf
g
s t a
b c
d
hf
g
s t
fd
s
fd
sa
b c
d
hf
g
s t
接続情報の記憶法
mate 配列
頂点がパスの端
d f gvmate[v]
逆端の頂点
自身の頂点
頂点がいずれのパスにも含まれない
頂点がパスの途中0
f d s
パス列挙( ZDD 構築)アルゴリズム [Knuth 08]
a
b c
d
hf
g
s ts
a
b
…
…
a bvmate[v] a 0
パス列挙( ZDD 構築)アルゴリズム [Knuth 08] a
bc
st
e1
e2e3
e4
e5
e6sa
as
b
a
s
a
b
s
a
b
s
a s
0 b
s 0
s
s
a
c
s
c
s
s
0
mate 値
パス列挙( ZDD 構築)アルゴリズム [Knuth 08] a
bc
st
e1
e2e3
e4
e5
e6
mate 値
sa
as
b
a
s
a
b
s
a
b
s
a s
0 b
s 0
s
s
a
c
s
s
0
パス列挙( ZDD 構築)アルゴリズム [Knuth 08] a
bc
st
e1
e2e3
e4
e5
e6
s
a
c
s
s
0
s
a
c
t
s
0
パス列挙( ZDD 構築)アルゴリズム [Knuth 08] a
bc
st
e1
e2e3
e4
e5
e6
s
a
c
s
s
0
s
a
c
t
s
0
1
1
1
パス列挙( ZDD 構築)アルゴリズム [Knuth 08] a
bc
st
e1
e2e3
e4
e5
e6
s
a
c
s
s
0
s
a
c
t
s
0
1
1
1
根から までの1 つの経路が1 つの s-t パスに対応する
1
a b c d fvmate[v] c 0 a d s
a
b
cs
g
d
f
a
b
cs
g
d
f
a b c d f gvmate[v] 0 0 g d s c
パス列挙( ZDD 構築)アルゴリズム [Knuth 08]
mate 配列の更新例
一般にc
d
a
b
a b c dc d a b
a b c d0 0 d c
最大 4 か所書きかえれば更新できる
mate 配列の更新
パス列挙( ZDD 構築)アルゴリズム [Knuth 08]
パス列挙アルゴリズム [Knuth 08]
枝刈り
a
b
cs
g
d
f
a
b
cs
g
d
f
0
枝刈り
a
b
cs
g
d
f
a
b
cs
g
d
f
0
枝刈りa
b
cs
g
d
ft
a
b
cs
g
d
ft
0
枝刈り
a
b
cs
g
d
ft
a
b
cs
g
d
ft
1
パス列挙アルゴリズム [Knuth 08]
終端判定条件p
qif x = 1if GetDegree(p) = 2 or GetDegree(q) = 2
GetDegree(v)
if mate[v] == vreturn 0
if mate[v] == 0return 2
elsereturn 1
辺 e を処理する前の判定
終端0
if (p = s or p = t) and GetDegree(p) = 1
終端0
if (q = s or q = t) and GetDegree(q) = 1
終端0if mate[p] = q and mate[q] = p
終端0
if mate[p] = s and mate[q] = tmate[p] = t and mate[q] = s
or
for each vertex v in the frontierif v != s or v != t or v!= p or v!= q
if GetDegree(v) = 1
終端0
終端1end for
end if
for each v such that v がフロンティアから外れるif v = s or v = t
if GetDegree(v) = 0
辺 e を処理した後の判定
終端0
elseif GetDegree(v) = 1
終端0
GetDegree(v)
if mate[v] == vreturn 0
if mate[v] == 0return 2
elsereturn 1
a
b
cs
g
d
a
b
cs
g
d
1
1 1 1
1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 2
1
2 2
1
1 1
1222
4
1 2
3 32
4 3 32
4 3 32
6 6
6 6
12パスの数え上げ s
t
e1
e2
e3
e4 e5e6
e11
e10e7 e9
e8
e12
実験結果n × n グリッド
・・・
・・・
・・・
・ ・ ・
・ ・ ・
・ ・ ・
・・
・
s
t頂点の数 (n + 1) × (n + 1)
The On-Line Encyclopedia of Integer Sequence (OEIS) : 数列大辞典http://oeis.org/A007764
実験結果n × n グリッド
・・・
・・・
・・・
・ ・ ・
・ ・ ・
・ ・ ・
・・
・
s
t頂点の数 (n + 1) × (n + 1)
The On-Line Encyclopedia of Integer Sequence (OEIS) : 数列大辞典http://oeis.org/A007764
n time(秒)
15 206.0
16 701.9
17 2326.0
18 7607.1
19 28279.2
20 91944.1
21 284117.0
実験結果n × n グリッド
Thanks to 岩下洋哲氏
・・・
・・・
・・・
・ ・ ・
・ ・ ・
・ ・ ・
・・
・
s
t頂点の数 (n + 1) × (n + 1)
頂点数 計算時間 ZDDノード数 パスの数
日本地図 47 0.01 秒 951 1.4 × 1010
2 重化 94 248.72 秒 18,971,787 5.0 × 1044
14797272518 本
5039760385115189594214594926092397238616064 本( = 503 正 9760 澗 3851 溝 1518 穣 9594 杼 2145 垓 9492 京 6092 兆 3972 億 3861 万 6064 )
実験結果日本地図グラフ北海道から鹿児島までの全パス
講義の目標• パスの数え上げアルゴリズムを理解する• 大規模データを扱うためのデータ構造の 1 つ 「 ZDD 」 についてより詳しく知る– 大規模データの保存、活用
• 様々な対象を表現する ZDD を高速に構築する手法
「フロンティア法」 アルゴリズムを理解する– 適用事例について知る
ZDD と集合族
集合の集合(集合族)は ZDD で効率よく保持できる
{{a, b, c, d}, {a, c}, {b, d}, {b, c, d}}
a0 1
b
c
d
1
0 は省略
c
1
b
c
d
1
d
1
a を含む集合だけを取り出し、 a を消去する
ZDD と集合族
{{a, b, c, d}, {a, c}, {b, d}, {b, c, d}} {{b, c, d}, {c}}
a0 1
b
c
d
1
c
1
b
c
d
1
d
1
トップの要素なら簡単にできる
b
c
d
1
c
1
集合族への操作例:
a を含まない集合だけ取り出すなら、 LO 枝側をもってこればよい
ZDD と集合族
c を含む集合だけを取り出し、 c を消去する{{a, b, d}, {a}, {b, d}}
a0 1
b
c
d
1
c
1
b
c
d
1
d
1
トップでなければ、その変数の深さまで潜って、枝の付け替えを行う
a0 1
b
c
d
1
c
1
b
c
d
1
d
1
集合族への操作例:
{{a, b, c, d}, {a, c}, {b, d}, {b, c, d}}
ZDD と集合族
c を含む集合だけを取り出し、 c を消去する
a0 1
b
c
d
1
c
1
b
c
d
1
d
1
トップでなければ、その変数の深さまで潜って、枝の付け替えを行う
a0 1
b
cc
b
c
d
1
d
1
集合族への操作例:
c を含まない集合だけ取り出すなら、 LO 枝の方に付け替えればよい
d
1
1
{{a, b, d}, {a}, {b, d}}{{a, b, c, d}, {a, c}, {b, d}, {b, c, d}}
集合族 F から要素 x を含む集合だけを取り出し、 x を消去する集合族への操作例:
ZDD と集合族
F / x
{{a, b, c, d}, {a, c}, {b, d}, {b, c, d}}abcd + ac + bd + bcd = (abd + a + bd) c + bd
(abcd + ac + bd + bcd ) / c = abd + a + bd
(abcd + ac + bd + bcd ) % c = bd
c を含む集合だけを取り出し、 c を消去する
c を含む集合だけを取り出し、 c を消去する
集合族 F から要素 x を含まない集合だけを取り出し、 x を消去するF % x
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}}
b0 1
c
d
e
1
d
1
c
d
e
1
e
1
b
c
d
e
1
d
1
c
d
e
1
e
1
a
トップに加える場合
ZDD と集合族
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}}
a0 1
b
c
e
1
c
1
b
c
e
1
e
1
a
b
c
e
1
c
1
b
c
e
1
e
1
d
間に加える場合
d d d
d が 1 つも含まれない場合
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 が含まれる場合
ZDD と集合族
集合族 F の各要素に x を加える集合族への操作例:
ZDD と集合族
F * x
abce + ad + be + bd
各要素に d を加える
{{a, b, c, e}, {a, d}, {b, e}, {b, d}}
(abce + ad + be + bd) * d = abcde + add + bde + bdd
= abcde + ad + bde + bd
集合族 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 は消去しない)
ZDD と集合族
((abcd + ac + bd + bcd ) / c) * c = (abd + a + bd) * c
= abcd + ac + bcd
ZDD と集合族
F G = { {c}, {b, c} , {a}, {a, b}, {a, b, c}, {b} }∪
a0 1
b
c
1
b
cc
F = { {c}, {b, c} , {a}, {a, b}, {a, b, c} }c + bc + a + ab + abc
G = { {b}, {b, c}, {a, b} }b + bc + ab
a0 1
b
1
b
c
a0 1
b
c
1
b
cc
F = { {c}, {b, c} , {a}, {a, b}, {a, b, c} }c + bc + a + ab + abc
(c + bc) + a(ε + b + bc)
G = { {b}, {b, c}, {a, b} }b + bc + ab
a0 1
b
1
b
c
(b + bc) + a(b)
F G = (c + bc) (c + bc) + a((ε + b + bc) (b))∪ ∪ ∪
a0 1 a0 1
F
F0 F1G0 G1
G
一般にF = F0 a * F∪ 1
G = G0 a * G∪ 1 のとき
F G = (F∪ 0 G∪ 0) a * (F∪ 1 G∪ 1)
a0 1 a0 1
F
F0 F1 G0 G1
G
一般にF = F0 a * F∪ 1
G = G0 a * G∪ 1 のとき
F G = (F∪ 0 G∪ 0) a * (F∪ 1 G∪ 1)apply (F, G, ) = make_node(a, apply (F∪ 0, G0, ), apply (F∪ 1, G1, ))∪
a0 1
F0 G∪ 0
F G∪
F1 G∪ 1
apply (F, {}, ) = F ∪ など ∩ や Δ ( 対称差 ) なども同様
(ノード飛び越しがあるともっと複雑)
a0 1 a0 1
F
F0 F1 G0 G1
G
a0 1
F0 G∪ 0
F G∪
F1 G∪ 1
最悪計算量は (F のノード数 ) * (G のノード数 )
演算をキャッシュすると高速化できる
(実用的には出力 ZDD のノード数に線形のことが多い)
s
t
e1
e2
e3
e4 e5e6
e11
e10e7 e9
e8
e12
F: 全 s-t パスを表す ZDD
e9 を必ず通る s-t パスの集合は?(F / e9) * e9
e9 を必ず通らない s-t パスの集合は?(F % e9) * e9
a0 1
b
c
1
b
cc
a, b, c, d のうち、ちょうど 3個の要素からなる集合の集合 を表す ZDD
{ {a, b, c}, {a, b, d}, {a, c, d}, {b, c, d} }
ddd d
R(3, 4) と表記する
0000
s
t
e1
e2
e3
e4 e5e6
e11
e10e7 e9
e8
e12
F: 全 s-t パスを表す ZDD
e9 を必ず通る長さが 8 の s-t パスの集合は?((F / e9) * e9) ∩ R(8, 12)
(必ずしも効率的とは限らない。フロンティア法で直接作る方が速いことも)
条件付きパス(サイクル)の列挙
1e1
e2
e3
e4 f = f + f / e4 % e3 % e2 % e1) * e4 + (f % e4 / e3 % e2 % e1) * e3 + (f % e4 % e3 / e2 % e1) * e2 + (f % e4 % e3 % e2 / e1) * e1
条件付きパス(サイクル)の列挙
一様ランダムサンプリング
a0 1
b
cc
b
c
d
0
d
1
{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 2
3 3 4
6 7
13 a
bb6 7
13確率613
713
確率
一様ランダムサンプリング
a0 1
b
cc
b
c
d
0
d
1
{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 2
3 3 4
6 7
13
b
cc3 3
6確率36
確率36
一様ランダムサンプリング
a0 1
b
cc
b
c
d
0
d
1
{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 2
3 3 4
6 7
13{b, d}
講義の目標• パスの数え上げアルゴリズムを理解する• 大規模データを扱うためのデータ構造の 1 つ 「 ZDD 」 についてより詳しく知る– 大規模データの保存、活用
• 様々な対象を表現する ZDD を高速に構築する手法
「フロンティア法」 アルゴリズムを理解する– 適用事例について知る
フロンティア法とはトップダウンに ZDD を構築する技法
e1e1 = 0e2
e2 = 0e2
e2 = 1 e2 = 0 e2 = 1
e1 = 1
e3 e3
10 1 0
ノードを共有できるときは共有したい
s t
bc
aフロンティア
a b cvmate[v] 0 s c
各ノードについて、フロンティア上に何らかの情報を持たせて、共有可能性と枝刈りを判定
一般化してconfiguration と呼ぶ
パス列挙アルゴリズム [Knuth 08]
(a), (b), (c) が s-t パスの場合の固有の処理
ハミルトンパス
for each v such that v がフロンティアから外れるif v = s or v = t
if GetDegree(v) = 0
辺 e を処理した後の判定
終端0
elseif GetDegree(v) = 1
終端0
or GetDegree(v) = 0
(全点を通る s-t パス)
複数終端対パス
s1
t2
s2
t1
s1 - t1 パスs2 - t2 パス
の組を全列挙交差しない
s3
t3s3 - t3 パス
(si , ti) をヒントペアというsi や ti をヒント頂点、
複数終端対パス 終端判定条件p
qif x = 1if GetDegree(p) = 2 or GetDegree(q) = 2
GetDegree(v)
if mate[v] == vreturn 0
if mate[v] == 0return 2
elsereturn 1
辺 e を処理する前の判定
終端0
if (p がヒント頂点 ) and GetDegree(p) = 1
終端0
if (q がヒント頂点 ) and GetDegree(q) = 1
終端0if mate[p] = q and mate[q] = p
終端0
if (mate[p] と mate[q] がともにヒント頂点 )(mate[p], mate[q]) も (mate[q], mate[p]) もヒントペアではない
終端0
for each v such that v がフロンティアから外れるif v がヒント頂点
if GetDegree(v) = 0
辺 e を処理した後の判定
終端0
elseif GetDegree(v) = 1
終端0
GetDegree(v)
if mate[v] == vreturn 0
if mate[v] == 0return 2
elsereturn 1
複数終端対パス 終端判定条件
1最後の辺を処理し終えて、 終端でなければ 終端0
サイクルが生じてはいけない 連結成分が 2 つ以上生じてはいけない
全域木 (本質的には [K.Sekine, H.Imai 95] )
フロンティア法(再掲)
configuration の設計枝刈り の設計
全域木 (本質的には [K.Sekine, H.Imai 95] )
a b cvmate[v] A A B
a b cvmate[v] A A B
b
c
b
c
等価
a a
configuration として、各頂点が属する連結成分の ID を記憶
AA
B B
configuration の設計
同じ連結成分に属しているなら同じ ID異なる連結成分に属しているなら異なる ID
全域木 (本質的には [K.Sekine, H.Imai 95] )枝刈りの設計
同じ連結成分を両端とする辺を加えるとき、サイクルができる
0 に接続 b
c
A
B
a
加えない
b
c
A
B
a孤立成分が生じる
0 に接続
1 に接続
最後の辺まで処理後、0 に接続されないなら
a b cvmate[v] A A B
b
c
a
A
B
マッチングの列挙
configuration の設計
b
c
a
a b cvmate[v] 0 1 1
既にマッチングに使われている頂点は 1使われていない頂点は 0 とすればよい
枝刈りの設計
b
c
a
a b cimate[i] 0 1 1
マッチングに使われている頂点に辺を加える時
0 に接続
1 に接続
最後の辺まで処理後、0 に接続されないなら
辺変数型パス型 森型
パス
サイクル
ハミルトンパス
ハミルトンサイクル
オイラー路
複数終端対パス(ナンバーリンク)
森 全域木
シュタイナー木
カット(セット) s-tカット
k 終端カット連結成分
Tutte多項式Jones多項式 (ひもの絡み目)上記 2 つ [関根 , 今井 1996]
[Yoshinaka et al. 2012]
[Knuth 2008]
信頼性多項式[Imai et al. 1997]
信頼性多項式[Hardy et al. 2007]
複数サイクル
頂点変数型頂点被覆独立集合支配集合
0-1 ナップザック部分和特殊
数分割特殊
頂点彩色括弧列
マトロイドTutte 多項式
[Imai et al. 1996][Saitoh et al. 2009]
動的計画法的な見方も可能
クリーク
フラグ型
辺被覆
完全マッチング
マッチング
集合被覆
集合分割
集合パッキング
上記 3 つ [今井 , 今井 1998]
ハイパーグラフ
一般化
グラフ
根付き森、木
有向パス [Knuth 08]
[Knuth 2008]
有向グラフ
支配集合の列挙
ではない全ての頂点は
に隣接する少なくとも 1 つの
v7
v6
v5
v4
v3
v2
v1
v8
v9 v1v1 = 0v2
v2 = 0v2
v2 = 1 v2 = 0 v2 = 1
v1 = 1
頂点を変数とする ZDD を構築v7
v6
v5
v3
v2v8
v9
v4v1
4 5 6imate[i] 0 1 0
頂点が支配されているなら 1支配されていないなら 0 とすればよい
頂点の取捨選択の情報を(フロンティア上の)頂点に記憶しているため、効率が良いとは限らない
0/1 ナップザック問題の列挙
x1 50
x2 100…
xn 210
…
各アイテムを取るかとらないかを選択重さが M 以下になるような取り方
重さ
x1x1 = 0x2
x2 = 0x2
x2 = 1 x2 = 0 x2 = 1
x1 = 1
0
500
x1
x2
xn
…
このグラフに対するフロンティア法と見ることができる
動的計画法のテーブルと見ることもできる
configuration = 重さの総和
辺変数型パス型 森型
パス
サイクル
ハミルトンパス
ハミルトンサイクル
オイラー路
複数終端対パス(ナンバーリンク)
森 全域木
シュタイナー木
カット(セット) s-tカット
k 終端カット連結成分
Tutte多項式Jones多項式 (ひもの絡み目)上記 2 つ [関根 , 今井 1996]
[Yoshinaka et al. 2012]
[Knuth 2008]
信頼性多項式[Imai et al. 1997]
信頼性多項式[Hardy et al. 2007]
複数サイクル
頂点変数型頂点被覆独立集合支配集合
0-1 ナップザック部分和特殊
数分割特殊
頂点彩色括弧列
マトロイドTutte 多項式
[Imai et al. 1996][Saitoh et al. 2009]
動的計画法的な見方も可能
クリーク
フラグ型
辺被覆
完全マッチング
マッチング
集合被覆
集合分割
集合パッキング
上記 3 つ [今井 , 今井 1998]
ハイパーグラフ
一般化
グラフ
根付き森、木
有向パス [Knuth 08]
[Knuth 2008]
有向グラフまとめ ・フロンティア法によって様々な対象を表現する ZDD を構築可能 → configuration と枝刈りの設計
課題 : 計算量評価等の理論的裏付け
適用事例:配電網のスイッチ構成
配電網
すべての家はちょうど 1 つの変電所につながっている必要がある
サイクルが生じてはいけない変電所を根とする根付き全域森
根付き森ZDD
電気制約ZDD
∩ 条件を満たすZDD
引用:http://www.jst.go.jp/pr/announce/20120223/index.html
適用事例:配電網のスイッチ構成
配電網
すべての家はちょうど 1 つの変電所につながっている必要がある
サイクルが生じてはいけない変電所を根とする根付き全域森
根付き森ZDD
電気制約ZDD
∩ 条件を満たすZDD
引用:http://www.jst.go.jp/pr/announce/20120223/index.html
468個のスイッチ制約条件を満たす解の個数は2136820138348532911682612214804905609 817839244385235398189521540
通り (= 約 1063 )
約 1時間 15 分 ZDD ノード数 約 110 万個 (779MB)
まとめ• パスの数え上げアルゴリズム• ZDD について詳細
– 大規模データの保存、 ZDD演算によるフィルタリング• 様々な対象を表現する ZDD を高速に構築する手法 「フロンティア法」 アルゴリズム
– ハミルトンパス– 複数終端対パス– 全域木– マッチング
• 適用事例フロンティア法のソースコードhttp://www-erato.ist.hokudai.ac.jp/~jkawahara/frontier