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

86
フフフフフフフ - フフフフフフフフフフフフフフ フ ZDD フフフフフフフフ フフ フ フフフフフフフフ ERATO フフフフフフフフフフフフフフ フフフフフ フフフフフフフ

description

フロンティア法 - 組合せ問題の解を列挙索引化する ZDD 構築アルゴリズム. 川原 純. 科学技術振興機構  ERATO 湊離散構造処理系プロジェクト. 北海道大学 情報科学研究科. 講義 の目標. パスの数え上げアルゴリズムを理解する 大規模データを扱うためのデータ構造の 1 つ 「 ZDD 」 についてより詳しく知る 大規模データの保存、 活用 様々な対象を表現する ZDD を高速に構築する手法 「フロンティア法」 アルゴリズムを理解する 適用事例について知る. ZDD: 集合の集合を表現するデータ構造. - PowerPoint PPT Presentation

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

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

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

川原 純

科学技術振興機構  ERATO 湊離散構造処理系プロジェクト北海道大学 情報科学研究科

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

講義の目標• パスの数え上げアルゴリズムを理解する• 大規模データを扱うためのデータ構造の 1 つ 「 ZDD 」 についてより詳しく知る– 大規模データの保存、活用

• 様々な対象を表現する ZDD を高速に構築する手法

  「フロンティア法」 アルゴリズムを理解する– 適用事例について知る

Page 3: フロンティア法  -  組合せ問題の解を列挙索引化する 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]

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

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 構築アルゴリズム

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 構築アルゴリズム

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 構築アルゴリズム

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 構築アルゴリズム

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 構築アルゴリズム

0 1

10

e1

e2

e3

e4

e5

e2

等価な 2 つのノードは必ず共有される

0 1

10

e1

e2

e3

e4

e5

ZDD の性質

Page 10: フロンティア法  -  組合せ問題の解を列挙索引化する 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}

Page 11: フロンティア法  -  組合せ問題の解を列挙索引化する 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 パスを列挙して、辺集合の集合で表す

Page 12: フロンティア法  -  組合せ問題の解を列挙索引化する 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 =

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

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

ZDD

Page 14: フロンティア法  -  組合せ問題の解を列挙索引化する 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

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

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 構築アルゴリズム

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 構築アルゴリズム

パス列挙( 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 構築アルゴリズム

パス列挙( 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 構築アルゴリズム

パス列挙( 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 構築アルゴリズム

パス列挙( ZDD 構築)アルゴリズム [Knuth 08]

s t

… …

t

フロンティア

処理済み辺 未処理辺

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

パス列挙( 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 構築アルゴリズム

パス列挙( 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 構築アルゴリズム

接続情報の記憶法

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 構築アルゴリズム

パス列挙( 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 構築アルゴリズム

パス列挙( 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 構築アルゴリズム

パス列挙( 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 構築アルゴリズム

パス列挙( 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 構築アルゴリズム

パス列挙( 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 構築アルゴリズム

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 構築アルゴリズム

一般に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 構築アルゴリズム

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

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

枝刈り

a

b

cs

g

d

f

a

b

cs

g

d

f

0

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

枝刈り

a

b

cs

g

d

f

a

b

cs

g

d

f

0

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

枝刈りa

b

cs

g

d

ft

a

b

cs

g

d

ft

0

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

枝刈り

a

b

cs

g

d

ft

a

b

cs

g

d

ft

1

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

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

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

終端判定条件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 構築アルゴリズム

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 構築アルゴリズム

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 構築アルゴリズム

実験結果n × n グリッド

・・・

・・・

・・・

・ ・ ・

・ ・ ・

・ ・ ・

・・

s

t頂点の数 (n + 1) × (n + 1)

The On-Line Encyclopedia of Integer Sequence (OEIS) : 数列大辞典http://oeis.org/A007764

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

実験結果n × n グリッド

・・・

・・・

・・・

・ ・ ・

・ ・ ・

・ ・ ・

・・

s

t頂点の数 (n + 1) × (n + 1)

The On-Line Encyclopedia of Integer Sequence (OEIS) : 数列大辞典http://oeis.org/A007764

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

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 構築アルゴリズム

頂点数 計算時間 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 構築アルゴリズム

講義の目標• パスの数え上げアルゴリズムを理解する• 大規模データを扱うためのデータ構造の 1 つ 「 ZDD 」 についてより詳しく知る– 大規模データの保存、活用

• 様々な対象を表現する ZDD を高速に構築する手法

  「フロンティア法」 アルゴリズムを理解する– 適用事例について知る

Page 45: フロンティア法  -  組合せ問題の解を列挙索引化する 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

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

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 構築アルゴリズム

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 構築アルゴリズム

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 構築アルゴリズム

集合族 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 構築アルゴリズム

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 構築アルゴリズム

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 構築アルゴリズム

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 構築アルゴリズム

集合族 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 構築アルゴリズム

集合族 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 構築アルゴリズム

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 構築アルゴリズム

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 構築アルゴリズム

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 構築アルゴリズム

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 構築アルゴリズム

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 構築アルゴリズム

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 構築アルゴリズム

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 構築アルゴリズム

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 構築アルゴリズム

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

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

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 構築アルゴリズム

一様ランダムサンプリング

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 構築アルゴリズム

一様ランダムサンプリング

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 構築アルゴリズム

一様ランダムサンプリング

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 構築アルゴリズム

講義の目標• パスの数え上げアルゴリズムを理解する• 大規模データを扱うためのデータ構造の 1 つ 「 ZDD 」 についてより詳しく知る– 大規模データの保存、活用

• 様々な対象を表現する ZDD を高速に構築する手法

  「フロンティア法」 アルゴリズムを理解する– 適用事例について知る

Page 69: フロンティア法  -  組合せ問題の解を列挙索引化する 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 と呼ぶ

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

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

(a), (b), (c) が s-t パスの場合の固有の処理

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

ハミルトンパス

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 構築アルゴリズム

複数終端対パス

s1

t2

s2

t1

s1 - t1 パスs2 - t2 パス

の組を全列挙交差しない

s3

t3s3 - t3 パス

(si , ti) をヒントペアというsi や ti をヒント頂点、

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

複数終端対パス 終端判定条件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 構築アルゴリズム

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 構築アルゴリズム

サイクルが生じてはいけない 連結成分が 2 つ以上生じてはいけない

全域木 (本質的には [K.Sekine, H.Imai 95] )

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

フロンティア法(再掲)

configuration の設計枝刈り の設計

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

全域木 (本質的には [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 構築アルゴリズム

全域木 (本質的には [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 構築アルゴリズム

マッチングの列挙

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 構築アルゴリズム

辺変数型パス型 森型

パス

サイクル

ハミルトンパス

ハミルトンサイクル

オイラー路

複数終端対パス(ナンバーリンク)

森 全域木

シュタイナー木

カット(セット) 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 構築アルゴリズム

支配集合の列挙

ではない全ての頂点は

に隣接する少なくとも 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 構築アルゴリズム

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 構築アルゴリズム

辺変数型パス型 森型

パス

サイクル

ハミルトンパス

ハミルトンサイクル

オイラー路

複数終端対パス(ナンバーリンク)

森 全域木

シュタイナー木

カット(セット) 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 構築アルゴリズム

適用事例:配電網のスイッチ構成

配電網

すべての家はちょうど 1 つの変電所につながっている必要がある

サイクルが生じてはいけない変電所を根とする根付き全域森

根付き森ZDD

電気制約ZDD

∩ 条件を満たすZDD

引用:http://www.jst.go.jp/pr/announce/20120223/index.html

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

適用事例:配電網のスイッチ構成

配電網

すべての家はちょうど 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 構築アルゴリズム

まとめ• パスの数え上げアルゴリズム• ZDD について詳細

– 大規模データの保存、 ZDD演算によるフィルタリング• 様々な対象を表現する ZDD を高速に構築する手法  「フロンティア法」 アルゴリズム

– ハミルトンパス– 複数終端対パス– 全域木– マッチング

• 適用事例フロンティア法のソースコードhttp://www-erato.ist.hokudai.ac.jp/~jkawahara/frontier