フロンティア法 - 組合せ問題の解を列挙索引化する zdd 構築アルゴリズム
DESCRIPTION
フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム. 川原 純. 科学技術振興機構 ERATO 湊離散構造処理系プロジェクト. 北海道大学 情報科学研究科. 講義 の目標. パスの数え上げアルゴリズムを理解する 大規模データを扱うためのデータ構造の 1 つ 「 ZDD 」 についてより詳しく知る 大規模データの保存、 活用 様々な対象を表現する ZDD を高速に構築する手法 「フロンティア法」 アルゴリズムを理解する 適用事例について知る. ZDD: 集合の集合を表現するデータ構造. - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/1.jpg)
フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム
川原 純
科学技術振興機構 ERATO 湊離散構造処理系プロジェクト北海道大学 情報科学研究科
![Page 2: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/2.jpg)
講義の目標• パスの数え上げアルゴリズムを理解する• 大規模データを扱うためのデータ構造の 1 つ 「 ZDD 」 についてより詳しく知る– 大規模データの保存、活用
• 様々な対象を表現する ZDD を高速に構築する手法
「フロンティア法」 アルゴリズムを理解する– 適用事例について知る
![Page 3: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/3.jpg)
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]
![Page 4: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/4.jpg)
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 の順序
![Page 5: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/5.jpg)
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 つずつもつ
![Page 6: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/6.jpg)
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
![Page 7: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/7.jpg)
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
![Page 8: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/8.jpg)
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
![Page 9: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/9.jpg)
0 1
10
e1
e2
e3
e4
e5
e2
等価な 2 つのノードは必ず共有される
0 1
10
e1
e2
e3
e4
e5
ZDD の性質
![Page 10: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/10.jpg)
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}
![Page 11: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/11.jpg)
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 パスを列挙して、辺集合の集合で表す
![Page 12: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/12.jpg)
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 =
![Page 13: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/13.jpg)
Knuth のパス列挙アルゴリズム全 s-t パスを表現する ZDD をトップダウン的に構築
ZDD
![Page 14: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/14.jpg)
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
![Page 15: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/15.jpg)
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]
![Page 16: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/16.jpg)
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]
![Page 17: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/17.jpg)
パス列挙( 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
![Page 18: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/18.jpg)
パス列挙( 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
![Page 19: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/19.jpg)
パス列挙( ZDD 構築)アルゴリズム [Knuth 08]
e1 = 0 e1 = 1
e2 = 0e2 = 1
e1 = 0 e1 = 1
e2 = 0e2 = 1
?
s e1 t
e2
e3
e4
途中の経路は分からないがs につながっていることは分かっている
![Page 20: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/20.jpg)
パス列挙( ZDD 構築)アルゴリズム [Knuth 08]
s t
… …
t
フロンティア
処理済み辺 未処理辺
![Page 21: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/21.jpg)
パス列挙( 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
![Page 22: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/22.jpg)
パス列挙( 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
![Page 23: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/23.jpg)
接続情報の記憶法
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
![Page 24: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/24.jpg)
パス列挙( 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 値
![Page 25: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/25.jpg)
パス列挙( 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
![Page 26: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/26.jpg)
パス列挙( ZDD 構築)アルゴリズム [Knuth 08] a
bc
st
e1
e2e3
e4
e5
e6
s
a
c
s
s
0
s
a
c
t
s
0
![Page 27: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/27.jpg)
パス列挙( 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
![Page 28: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/28.jpg)
パス列挙( 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
![Page 29: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/29.jpg)
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 配列の更新例
![Page 30: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/30.jpg)
一般にc
d
a
b
a b c dc d a b
a b c d0 0 d c
最大 4 か所書きかえれば更新できる
mate 配列の更新
パス列挙( ZDD 構築)アルゴリズム [Knuth 08]
![Page 31: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/31.jpg)
パス列挙アルゴリズム [Knuth 08]
![Page 32: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/32.jpg)
枝刈り
a
b
cs
g
d
f
a
b
cs
g
d
f
0
![Page 33: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/33.jpg)
枝刈り
a
b
cs
g
d
f
a
b
cs
g
d
f
0
![Page 34: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/34.jpg)
枝刈りa
b
cs
g
d
ft
a
b
cs
g
d
ft
0
![Page 35: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/35.jpg)
枝刈り
a
b
cs
g
d
ft
a
b
cs
g
d
ft
1
![Page 36: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/36.jpg)
パス列挙アルゴリズム [Knuth 08]
![Page 37: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/37.jpg)
終端判定条件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
![Page 38: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/38.jpg)
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
![Page 39: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/39.jpg)
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
![Page 40: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/40.jpg)
実験結果n × n グリッド
・・・
・・・
・・・
・ ・ ・
・ ・ ・
・ ・ ・
・・
・
s
t頂点の数 (n + 1) × (n + 1)
The On-Line Encyclopedia of Integer Sequence (OEIS) : 数列大辞典http://oeis.org/A007764
![Page 41: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/41.jpg)
実験結果n × n グリッド
・・・
・・・
・・・
・ ・ ・
・ ・ ・
・ ・ ・
・・
・
s
t頂点の数 (n + 1) × (n + 1)
The On-Line Encyclopedia of Integer Sequence (OEIS) : 数列大辞典http://oeis.org/A007764
![Page 42: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/42.jpg)
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)
![Page 43: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/43.jpg)
頂点数 計算時間 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 )
実験結果日本地図グラフ北海道から鹿児島までの全パス
![Page 44: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/44.jpg)
講義の目標• パスの数え上げアルゴリズムを理解する• 大規模データを扱うためのデータ構造の 1 つ 「 ZDD 」 についてより詳しく知る– 大規模データの保存、活用
• 様々な対象を表現する ZDD を高速に構築する手法
「フロンティア法」 アルゴリズムを理解する– 適用事例について知る
![Page 45: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/45.jpg)
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
![Page 46: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/46.jpg)
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 枝側をもってこればよい
![Page 47: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/47.jpg)
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}}
![Page 48: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/48.jpg)
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}}
![Page 49: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/49.jpg)
集合族 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
![Page 50: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/50.jpg)
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
トップに加える場合
![Page 51: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/51.jpg)
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 つも含まれない場合
![Page 52: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/52.jpg)
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 と集合族
![Page 53: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/53.jpg)
集合族 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
![Page 54: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/54.jpg)
集合族 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
![Page 55: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/55.jpg)
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
![Page 56: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/56.jpg)
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))∪ ∪ ∪
![Page 57: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/57.jpg)
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)
![Page 58: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/58.jpg)
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 ∪ など ∩ や Δ ( 対称差 ) なども同様
(ノード飛び越しがあるともっと複雑)
![Page 59: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/59.jpg)
a0 1 a0 1
F
F0 F1 G0 G1
G
a0 1
F0 G∪ 0
F G∪
F1 G∪ 1
最悪計算量は (F のノード数 ) * (G のノード数 )
演算をキャッシュすると高速化できる
(実用的には出力 ZDD のノード数に線形のことが多い)
![Page 60: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/60.jpg)
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
![Page 61: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/61.jpg)
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
![Page 62: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/62.jpg)
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)
(必ずしも効率的とは限らない。フロンティア法で直接作る方が速いことも)
![Page 63: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/63.jpg)
条件付きパス(サイクル)の列挙
![Page 64: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/64.jpg)
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
条件付きパス(サイクル)の列挙
![Page 65: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/65.jpg)
一様ランダムサンプリング
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
確率
![Page 66: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/66.jpg)
一様ランダムサンプリング
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
![Page 67: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/67.jpg)
一様ランダムサンプリング
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}
![Page 68: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/68.jpg)
講義の目標• パスの数え上げアルゴリズムを理解する• 大規模データを扱うためのデータ構造の 1 つ 「 ZDD 」 についてより詳しく知る– 大規模データの保存、活用
• 様々な対象を表現する ZDD を高速に構築する手法
「フロンティア法」 アルゴリズムを理解する– 適用事例について知る
![Page 69: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/69.jpg)
フロンティア法とはトップダウンに 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 と呼ぶ
![Page 70: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/70.jpg)
パス列挙アルゴリズム [Knuth 08]
(a), (b), (c) が s-t パスの場合の固有の処理
![Page 71: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/71.jpg)
ハミルトンパス
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 パス)
![Page 72: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/72.jpg)
複数終端対パス
s1
t2
s2
t1
s1 - t1 パスs2 - t2 パス
の組を全列挙交差しない
s3
t3s3 - t3 パス
(si , ti) をヒントペアというsi や ti をヒント頂点、
![Page 73: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/73.jpg)
複数終端対パス 終端判定条件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
![Page 74: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/74.jpg)
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
![Page 75: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/75.jpg)
サイクルが生じてはいけない 連結成分が 2 つ以上生じてはいけない
全域木 (本質的には [K.Sekine, H.Imai 95] )
![Page 76: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/76.jpg)
フロンティア法(再掲)
configuration の設計枝刈り の設計
![Page 77: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/77.jpg)
全域木 (本質的には [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
![Page 78: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/78.jpg)
全域木 (本質的には [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
![Page 79: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/79.jpg)
マッチングの列挙
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 に接続されないなら
![Page 80: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/80.jpg)
辺変数型パス型 森型
パス
サイクル
ハミルトンパス
ハミルトンサイクル
オイラー路
複数終端対パス(ナンバーリンク)
森 全域木
シュタイナー木
カット(セット) 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]
有向グラフ
![Page 81: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/81.jpg)
支配集合の列挙
ではない全ての頂点は
に隣接する少なくとも 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 とすればよい
頂点の取捨選択の情報を(フロンティア上の)頂点に記憶しているため、効率が良いとは限らない
![Page 82: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/82.jpg)
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 = 重さの総和
![Page 83: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/83.jpg)
辺変数型パス型 森型
パス
サイクル
ハミルトンパス
ハミルトンサイクル
オイラー路
複数終端対パス(ナンバーリンク)
森 全域木
シュタイナー木
カット(セット) 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 と枝刈りの設計
課題 : 計算量評価等の理論的裏付け
![Page 84: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/84.jpg)
適用事例:配電網のスイッチ構成
配電網
すべての家はちょうど 1 つの変電所につながっている必要がある
サイクルが生じてはいけない変電所を根とする根付き全域森
根付き森ZDD
電気制約ZDD
∩ 条件を満たすZDD
引用:http://www.jst.go.jp/pr/announce/20120223/index.html
![Page 85: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/85.jpg)
適用事例:配電網のスイッチ構成
配電網
すべての家はちょうど 1 つの変電所につながっている必要がある
サイクルが生じてはいけない変電所を根とする根付き全域森
根付き森ZDD
電気制約ZDD
∩ 条件を満たすZDD
引用:http://www.jst.go.jp/pr/announce/20120223/index.html
468個のスイッチ制約条件を満たす解の個数は2136820138348532911682612214804905609 817839244385235398189521540
通り (= 約 1063 )
約 1時間 15 分 ZDD ノード数 約 110 万個 (779MB)
![Page 86: フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム](https://reader030.vdocuments.pub/reader030/viewer/2022033011/5681458f550346895db27cea/html5/thumbnails/86.jpg)
まとめ• パスの数え上げアルゴリズム• ZDD について詳細
– 大規模データの保存、 ZDD演算によるフィルタリング• 様々な対象を表現する ZDD を高速に構築する手法 「フロンティア法」 アルゴリズム
– ハミルトンパス– 複数終端対パス– 全域木– マッチング
• 適用事例フロンティア法のソースコードhttp://www-erato.ist.hokudai.ac.jp/~jkawahara/frontier