説明用資料(pptx)

Download Report

Transcript 説明用資料(pptx)

ZDDを用いたパスの列挙と索引生成
(JST ERATO 研究員)
斎藤 寿樹 (JST ERATO 研究員)
湊 真一 (北海道大学・JST ERATO総括)
吉仲 亮 (JST ERATO 研究員)
○ 川原 純
(50音順)
他、関わっている人
井上 武(ERATO)、岩下 洋哲(ERATO)、鈴木 拡(北海道大学)、
鶴間 浩二(ERATO)
パスの列挙
• 入力:グラフG=(V, E),2頂点 s, t
• 出力:s からt への全てのパス
s
t
3×3のグリッドグラフ
応用
• 地理情報処理
• ネットワークや論理回路の信頼性評価
(故障検査)
• ソフトウェアのフローチャートを網羅する
テストケース作成
• Fisher’s Exact Test (統計の分野)
他にもたくさん
既存研究と関連研究
• 既存研究
– バックトラックを用いたアルゴリズム
• 一つあたり O(|V| + |E|) 時間 [Read and Tarjan, 75]
(以下、Read の
アルゴリズムと呼ぶ)
• 関連研究
– パスの数え上げ
• #P完全問題
• Baxのアルゴリズム[Bax, 94]
• BDDを用いたパスのカウンティング[Sekine and Imai, 97]
これまでの研究の流れ(1)
• 2010年10月
– The Art of Computer Programming 4-1 を読む輪講で
ZDD を用いたパスの列挙アルゴリズムが紹介される
• 次の週、川原がC#で実装
• 2010年11月
– ZDD の代数演算のみで列挙するシンプルな
手法を考える(遅い)
• ERATO合宿で発表
• 2011年1月
– 改良手法を考える 2月に冬のLAシンポジウムで発表
3月にアルゴリズム研究会
これまでの研究の流れ(2)
•
•
•
2010年10月 輪講で紹介
2010年11月 ZDDの代数演算のみの手法
2011年1月 ↑の改良
• 2011年3月 パス列挙技法をパズルに応用
– ゲーム・パズル研究集会で発表
• 2011年4月 ネットワークの信頼性評価への応用を検討
– 既存手法で Knuth の Alg. に似た手法が見つかる
発表の内容
•
•
•
•
•
Knuth のアルゴリズム Simpath の紹介
ZDDの代数演算のみを用いた手法(Mate-ZDD)の紹介
両者の中間の手法(Hybrid)の紹介
実験
ネットワーク信頼性評価への応用
Knuth によるアルゴリズム Simpath
s
e1
e4
e3
e2
t
e5
1. 枝に順番を付ける
(例えば、s から幅優先)
e1 = 0 e1 e1 = 1
e2
e2
e2 = 1 e 2 = 0
e2 = 1
e2 = 0
e3
e3
e3
e3
1
0
e4
e5
(もっと良い方法もあり)
2. 2分木を構築
枝 e1, e2,… の順に処理
各枝変数 ei に対し、
ei = 0 or 1 を決めていく
s-t パスになっている 1
e1
e4
s
t
e3
e2
e5
ei = 1 である枝が s-t パスになっているか?
Knuth によるアルゴリズム Simpath
s
e1
e4
e3
e2
t
e5
1. 枝に順番を付ける
(例えば、s から幅優先)
e1 = 0 e1 e1 = 1
e2
e2
e2 = 1 e 2 = 0
e2 = 1
e2 = 0
e3
e3
e3
e3
1
0
e5
(もっと良い方法もあり)
2. 2分木を構築
枝 e1, e2,… の順に処理
各枝変数 ei に対し、
ei = 0 or 1 を決めていく
e4
s-t パスに
なっていない 0
e1
e4
s
t
e3
e2
e5
s-t パス + 0
余分な枝
e1
e4
s
t
e3
e2
e5
ei = 1 である枝が s-t パスになっているか?
Knuth によるアルゴリズム Simpath
s
e1
e4
e3
e2
t
e5
1. 枝に順番を付ける
(例えば、s から幅優先)
e1 = 0 e1 e1 = 1
e2
e2
e2 = 1 e 2 = 0
e2 = 1
e2 = 0
e3
e3
e3
e3
1
0
e5
(もっと良い方法もあり)
2. 2分木を構築
枝 e1, e2,… の順に処理
各枝変数 ei に対し、
ei = 0 or 1 を決めていく
e4
1
1
1 1
他は0
1 が1つのパスに対応
2分木は全パスを保持している
Knuth によるアルゴリズム Simpath
s
e1
e4
e3
e2
t
e5
木の枝刈り
e2 = 0
0
e 1 = 0 e1 e 1 = 1
e2
e2
e1 = 0 かつ e2 = 0 なら
s-t パスができることはない
Knuth によるアルゴリズム Simpath
s
e1
e4
e3
e2
木の枝刈り
t
e5
e1 = 0 かつ e2 = 0 なら
s-t パスができることはない
e 1 = 0 e1 e 1 = 1
e2
e2
1 e1 = 1 かつ e3 = 1 かつ e4 = 1
e2 = 1 e2 = 0
e2 = 0
なら s-t パスができることはない
e
0
3
…
…
(分岐が生じる)
0
1
e4
…
1
0
木の枝刈りを行っても
0
…
場合の数は指数爆発
e8
Knuth によるアルゴリズム Simpath
s
s e1
e2
e4
e5
e10
e8
e6
e3
e10
e7
e11
e9
t
e11
t
e9
以下の2つからは同じ木が生成される
e8
s
t
e10
s
e11
e9
e9
e8
e9
e9
0
e10
0
e11
0
t
e10
e11
e8
0
e8
e11
0
1
e10
0
0
0
1
e8
Knuth によるアルゴリズム Simpath
s
s e1
e2
e4
e5
e10
e8
e6
e3
e10
e7
e11
t
e11
t
e9
…
…
e9
…
e7
e8
…
e7
…
e9
0
e10
0
e11
0
e8
…
e9
0
…
e11
0
1
e10
0
0
0
1
e8
Knuth によるアルゴリズム Simpath
s
s e1
e2
e4
e5
e10
e8
e6
e3
e10
e7
e11
t
e11
t
e9
…
…
e9
…
e7
e7
…
…
…
ee88
…
ee9
9
00
同じ形をもつ子は共有したい
…
ee10
10
00
ee11
11
00
0
11
Knuth によるアルゴリズム Simpath
s e1
e2
e4
e8
e6
e3
e10
e7
e11
e5
t
5
s
e7 e
10
…7 e11
6
e9
…
e7 = 0
…
6 は s とつながっている
5 は 7 とつながっている
e8
t
5
s
e7 e
10
7 e11
…
6
e9
e7
e7
…
…
e8
s
5
e10
7
6
e11
e9
t
e9
…
e7 = 1
e8
共有する
e8
e8
t
Knuth によるアルゴリズム Simpath
接続情報の記憶法
s
1
5
2 4
3
7
6
t
8
9
mate 配列
i 1 2 3 4 5 6 7 8 9
mate[i] 6 0 0 0 7 1 5 8 9
頂点がパスの端
逆端の番号
頂点がパスの途中
0
頂点がいずれの
パスにも含まれない
自身の番号
Knuth によるアルゴリズム Simpath
接続情報の記憶法
s
1
2 4
3
5
t
8
7
6
9
frontier
mateこの部分のみ記憶
配列
i 1 2 3 4 5 6 7 8 9
mate[i] 6 0 0 0 7 1 5 8 9
頂点がパスの端
頂点がパスの途中
逆端の番号
0
頂点がいずれの
パスにも含まれない
自身の番号
どの頂点の接続情報を覚えればよいか?
ei
枝 i を処理するとき、
枝 i に接続している頂点を「訪れた」と表現する
F := {訪れたことのある頂点} {二度と訪れない頂点}
F を frontier という。 frontier 頂点の接続情報を覚える
Knuth によるアルゴリズム Simpath
s e1
e2
e4
e8
e6
e3
e10
e7
e11
e5
t
5
s
e7 e
10
…7 e11
6
e9
…
e7 = 0
…
e8
t
s
6
e9
e7
e7
…
…
e8
s
e8
e7 e
10
7 e11
…
e9
…
e7 = 1
e8
i 5 6 7
mate[i] 7 1 5
i 5 6 7
mate[i] 7 1 5
frontier の部分の
mate が同じなら共有する
5
5
e8
e10
7
6
e11
e9
t
t
Knuth によるアルゴリズム Simpath
mate の更新
1 2
e4 5 e
2 4
8
e
e
1 2
6
s 1 e
t
e
1
3 e 7 10
7
3
1 2 3
e2
e
1
e1
1
1 2
2 1
e2
e2
1 2 3
11
6 e
9
e5
d
a
b
ex
ex
ex+1
e3 e3
0
忘れてよい
一般に
c
3 2 1
0
1 2 3 4
…
a
b
c
d
c
d
a
b
a
b
c
d
0
0
d
c
最大4か所書きかえれば更新できる
2 1 3
e4
4 0 3 1
Knuth によるアルゴリズム Simpath
Simpath では、(既約とは限らない)ZDD を構築している
→ 既約化アルゴリズムによって、
節点サイズに比例する時間で既約化できる
節点の削除
e1 = 0 e1
e2
e2 = 1
e2 = 0
0
…
節点の共有
したがって、パスの列挙だけでなく、
・ 列挙した結果を圧縮して保持
・ 列挙したパスの索引生成
・ 列挙した結果から条件を満たすパスを得る
もできたことになる
e6
…
e6
… …
ee7
7
ee8
8
00
ee9
9
00
ee10
10
00
Mate-ZDD 法(提案手法)
s
1
e1
ZDD の代数演算のみを用いて、ZDD を構築できないか?
4
e3 5
2
3
e
e4 6
6
7
t
8
各頂点のペア (i, j) ごとに変数 mi, j を用意する
i, j が1本のパスの両端なら mi, j = 1
そうでないなら mi, j = 0
m14 = 1, m56 = 1, m77 = 1,…
m11 = 0, m12 = 0,…
Mate-ZDD 法(提案手法)
s
1
e1
4
e3 5
2
3
e
e4 6
6
i, j が1本のパスの両端なら mi, j = 1
7
t
8
選ばれた枝+mate を集合として表す
{e1, e3, e4, m14, m56, m33,…}
Mate-ZDD 法(提案手法)
s
1
e1
4
e3 5
2
3
e
e4 6
6
e7
s
7
t
e7 = 1
8
{e1, e3, e4, m14, m56, m33,…}
e6 まで処理済み、次は e7
e7 = 0 なら mate は変化なし
e7 = 1 なら m14 → m17
1
e1
4
e3 5
2
3
e
e4 6
6
e7
7
t
8
{e1, e3, e4, e7, m17, m56, m33,…}
Mate-ZDD 法(提案手法)
e6 の処理が終わった時点での全状態を集めたものを考える
s
1
e1
4
e3 5
2
3
e
e4 6
6
s
7
t
8
{e1, e3, e4,
m14, m56, m33,…}
1
e1
4
e3 5
2
3
e
e4 6
6
s
7
t
8
1
e1
4
e3 5
2
3
e
e4 6
6
{e1, e3,
{e2, e3,
m14, m25, m33,…} m15, m44,…}
これらの全状態に対して、先ほどの操作を行いたい
7
t
…
8
…
ZDD と集合族
集合の集合(集合族)は ZDD で効率よく保持できる
0 a 1
{{a, b, c, d}, {a, c}, {b, c}, {b, d}}
b
b
1
d
c
c
c
1
d
1
1
0 は省略
ZDD と集合族
集合族への操作例:
a を含む集合だけを取り出し、a を消去する
{{a, b, c, d}, {a, c}, {b, c}, {b, d}}
0 a 1
b
1
d
1
a を含まない集合だけ
取り出すなら、LO 枝側を
b もってこればよい
1
b
c
c
c
c
c
{{b, c, d}, {c}}
1
d
1
トップの要素なら簡単にできる
d
1
ZDD と集合族
集合族への操作例:
c を含む集合だけを取り出し、c を消去する
{{a, b, c, d}, {a, c}, {b, c}, {b, d}}
{{a, b, d}, {a}, {b}}
0 a 1
0 a 1
b
b
1
d
1
c
c
c
b
b
1
d
d
1
1
1
c
c
c
1
d
1
トップでなければ、その変数の深さまで潜って、
枝の付け替えを行う
ZDD と集合族
集合族への操作例:
c を含む集合だけを取り出し、c を消去する
{{a, b, c, d}, {a, c}, {b, c}, {b, d}}
0 a 1
b
1
1
0 a 1
1
b
b
c
c
c
d
c を含まない集合だけ
取り出すなら、LO 枝の
b 方に付け替えればよい
{{a, b, d}, {a}, {b}}
c
d
1 0
d
1
c
1
c
1 0 d
1
トップでなければ、その変数の深さまで潜って、
枝の付け替えを行う
ZDD と集合族
集合族への操作例:
e を各要素に追加する
{{a, b, c, d, e}, {a, c, e},
{b, c, e}, {b, d, e}}
e
{{a, b, c, d}, {a, c},
{b, c}, {b, d}}
0 a 1
a
b
b
d
1
1
c
c
c
b
b
1
d
d
1
トップに加える場合
1
1
c
c
c
1
d
1
ZDD と集合族
集合族への操作例:
e を各要素に追加する
{{a, b, c, d, e}, {a, c, e},
{b, c, e}, {b, d, e}}
a
{{a, b, c, d}, {a, c},
{b, c}, {b, d}}
0 a 1
b
b
d
1
1
c
1
e
d
1
間に加える場合
e
e
d
1
1
c
c
c
c
c
b
b
1
e
d
1
ZDD と集合族
集合族を積と和で表現すると見やすい
{{a, b, c, d}, {a, c}, {b, c}, {b, d}}
abcd + ac + bc + bd
e を各要素に追加する
(abcd + ac + bc + bd) × e
= abcde + ace + bce + bde
(abcd + ac + bc + bd)
= a(bcd + c) + bc + bd
なので、
a を含む集合だけを取り出し、
(abcd + ac + bc + bd) / a
a を消去する
= bcd + c
a を含まない集合だけを取り出し、 (abcd + ac + bc + bd) % a
a を消去する
= bc + bd
(多項式の除算、剰余算)
Mate-ZDD 法(提案手法)
e6 の処理が終わった時点での全状態を集めたものを考える
s
1
e1
4
e3 5
2
3
e
e4 6
6
s
7
t
8
1
e1
4
e3 5
2
3
e
e4 6
6
s
7
t
8
1
e1
4
e3 5
2
3
e
e4 6
6
7
t
…
8
f = e1e3e4m14m56m33 + e1e3m14m25m33 + e2e3m15m44 + …
これらの全状態に対して、先ほどの操作を行いたい
集合族を ZDD で表したものを f とする
Mate-ZDD 法(提案手法)
e6 の処理が終わった時点での全状態を集めたものを考える
f = e1e3e4m14m56m33 + e1e3m14m25m33 + e2e3m15m44 + …
これらの全状態に対して、先ほどの操作を行いたい
m14 → m17 の付け替え演算
f = f + f / m14 × e7 × m17
m14 を含むものを取り出し、
m14 を削除
e7 を追加
m17 を追加
Mate-ZDD 法(提案手法)
アルゴリズム
i
k
初期値
f = m11 × m22 × m33 × ...
各枝 e = {i, j} について
i
k
e
l
j
frontier を計算
frontier の中の各頂点 k,l について
f = f + f × e / mik / mjl × mkl
e
l
k
頂点 p を二度と訪れないならば
p
各 k = p について
f = f % mpk (頂点 p の次数が1の項は削除)
f = f / mpp + f % mpp
最後に
f = f / mst
(mpp 変数の除去)
j
Mate-ZDD 法の変数順
変数は ZDD のトップに追加する方が計算が早いので、
Mate-ZDD 法では、先に処理した枝変数を
ZDD の下にするのがよい (ボトムアップ的)
(Simpath はトップダウン的)
m 変数は頻繁に操作されるので、e 変数の上に
…
するのがよい
…
m12
…
m12
m22
m11
m11 m11
e1 処理 m11 m11
e1
e1
e2 処理
e2
e1
e2
e1
Mate-ZDD 法の変数順
m33
{e1, e3, e4, m14, m56, m33}
m 変数
m56
m14
e4
…
…
… e3
e1
e2
e1
e 変数
1
上段で m 変数の集合、すなわち mate を表している。
ある mate 値をもつ e 変数の集合がぶら下がっている
Mate-ZDD 法の変数順
フロンティアの2乗の段数
m 変数
…
e2
e1
…
フロンティアの2乗の個数の m 変数が存在し、
それらを更新しなければならない
e 変数
Hybrid 法
{e1, e3, e4, m14, m56, m33}
4 0 3 1 6 5 7 8 9 10 11 12
e4
…
e3
e1
…
e2
e1
e 変数
1
mate の管理に、m 変数ではなく、
(Simpath で使われている)配列を用いる
速度は Simpath と Mate-ZDD 法の中間くらいになる(と期待される)
Hybrid 法のメリット
4 0 3 1 6 5 7 8 9 10 11 12
{e1, e3, e4, m14, m56, m33}
e4
…
e3
e1
0
…
e2
e1
e 変数
1
枝に制約条件を加えて、列挙を行うことが容易になる。
例えば、e3 と e4 の少なくとも一方の枝を使うという条件なら
F = F / e 3 × e 3 + F / e4 × e 4
の演算を e4 の処理時に全体に施せばよい。
mate 配列に所属する e 変数がなくなれば、mate 配列を削除できる
CyPath: Read ‘75 のalg.
Simpath: Knuth のalg.
Mate-ZDD: 提案手法
Hybrid: 提案手法
実験結果
日本地図グラフ
北海道から鹿児島までの全パス
頂点数
CyPath
Simpath
Mate-ZDD
Hybrid
Mate-ZDD法の
ZDDノード数
日本地図
47
> 1000
0.02
<0.01
<0.01
951
1.4 × 1010
2重化
94
> 1000
40.64
248.72
340.77
18,971,787
5.0 × 1044
日本地図グラフの頂点を
2倍に増やしたグラフ
パスの数
(単位:秒)
14797272518 本
5039760385115189594214594926092397238616064 本
(= 503正9760澗3851溝1518穣9594杼2145垓9492京6092兆3972億3861万6064)
CyPath: Read ‘75 のalg.
Simpath: Knuth のalg.
Mate-ZDD: 提案手法
Hybrid: 提案手法
実験結果
L × L グリッド
頂点数 CyPath Simpath Mate-ZDD Hybrid
L
Mate-ZDD法の
ZDDノード数
パスの数
8
64
> 1000
0.17
0.28
0.11
3.1 × 104 7.8 × 1011
9
81
> 1000
0.48
1.58
0.32
1.1 × 105 3.2 × 1015
10
100
> 1000
1.40
5.69
1.75
3.7 × 105 4.1 × 1019
11
121
> 1000
3.50
24.49
8.37
1.2 × 106 1.5 × 1024
12
144
> 1000
10.29
92.96
30.77
4.2 × 106 1.8 × 1029
(単位:秒)
L
・
・
・
・
・
・
s
・
・
・
・
・
・
・
・
・
・
・
・
L
t
実験結果
n 頂点ランダムグラフ、枝の生成確率 0.5
Simpath
Mate-ZDD
Mate-ZDD法の
ZDDノード数
CyPath: Read ‘75 のalg.
Simpath: Knuth のalg.
Mate-ZDD: 提案手法
Hybrid: 提案手法
パスの数
n
CyPath
10
< 0.01
< 0.01
< 0.01
4.7 × 102
5.8 × 102
15
0.42
< 0.01
0.16
1.6 × 104
1.1 × 105
16
49.61
1.30
23.28
1.1 × 105
5.3 × 107
17
> 1000
2.42
70.10
2.3 × 106
8.1 × 107
18
> 1000
6.48
213.94
(単位:秒)
8.1 × 106
7.1 × 108
マルチパスの列挙
s2
s1
s3
s1 - t1 パス
の組を全列挙
交差しない
s2 - t2 パス
s3 - t3 パス
t3
t2
t1
ms1t1 と ms2t2 と ms3t3 を含む集合を
残せばよい
条件付きパス(サイクル)の列挙
条件付きパス(サイクル)の列挙
e2
e1
1
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
連結部分グラフの列挙
s
e2
e7
e1
e8
e3
e5
e6
e4
s
1
e1
s と t が連結になるような
部分グラフを列挙
→ ネットワーク信頼性評価への応用
t
e9
e10
4
e3 5
2
3
e
e4 6
6
e7
4 は 1 と同じ連結成分
5 は 6 と同じ連結成分
7
t
8
まとめ
• s-t-パスを列挙するアルゴリズム
– Simpath (Knuth)
– Mate-ZDD (提案手法)
– Hybrid 法 (提案手法)
• 今後の課題
– 計算時間の解析
– 頂点の順序付け
– 様々な条件下での列挙