490 likes | 869 Views
ZDD を用いたパスの列挙と索引生成. (JST ERATO 研究員 ) (JST ERATO 研究員 ) (JST ERATO 研究員 ). 川原 純 斎藤 寿樹 湊 真一 吉仲 亮. ○. ( 北海道大学・ JST ERATO 総括 ). (50 音順 ). 他、関わっている人. 井上 武 (ERATO) 、 岩下 洋哲 (ERATO ) 、 鈴木 拡(北海道大学)、 鶴間 浩二 (ERATO). パスの列挙. 入力:グラフ G =( V , E ) , 2 頂点 s , t 出力: s から t へ の 全て のパス. s.
E N D
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] • 関連研究 • パスの数え上げ • #P完全問題 • Baxのアルゴリズム[Bax, 94] • BDDを用いたパスのカウンティング[Sekineand Imai, 97] (以下、Read の アルゴリズムと呼ぶ)
これまでの研究の流れ(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 e1 e4 e1= 1 e1= 0 s t e3 e2= 0 e2= 1 e2= 1 e2= 0 e2 e5 1 0 1. 枝に順番を付ける (例えば、s から幅優先) e4 e2 e2 e3 e3 e3 e3 e1 e5 (もっと良い方法もあり) 2. 2分木を構築 s-t パスになっている 枝 e1,e2,… の順に処理 e1 e4 各枝変数ei に対し、 ei = 0 or 1 を決めていく 1 s t e3 e2 e5 ei = 1 である枝が s-t パスになっているか?
Knuth によるアルゴリズムSimpath e1 e4 e1= 1 e1= 0 s t e3 e2= 0 e2= 1 e2= 1 e2= 0 e2 e5 1 0 1. 枝に順番を付ける (例えば、s から幅優先) e4 e2 e2 e3 e1 e3 e3 e3 e5 (もっと良い方法もあり) 2. 2分木を構築 s-t パスに なっていない s-t パス + 余分な枝 枝 e1,e2,… の順に処理 e1 e1 e4 e4 各枝変数ei に対し、 ei = 0 or 1 を決めていく 0 0 s s t t e3 e3 e2 e2 e5 e5 ei = 1 である枝が s-t パスになっているか?
Knuth によるアルゴリズムSimpath e1 e4 e1= 1 e1= 0 s t e3 e2= 0 e2= 1 e2= 1 e2= 0 e2 e5 1 0 1. 枝に順番を付ける (例えば、s から幅優先) e4 e2 e3 e3 e2 e3 e1 e3 e5 (もっと良い方法もあり) 2. 2分木を構築 1 他は0 枝 e1,e2,… の順に処理 各枝変数ei に対し、 ei = 0 or 1 を決めていく が1つのパスに対応 2分木は全パスを保持している 1 1 1 1
Knuth によるアルゴリズムSimpath e1 e4 s t e3 e2 e5 木の枝刈り e1 = 0 かつ e2 = 0 なら s-t パスができることはない e1 e2 e2 e1= 1 e1= 0 e2= 0 0
Knuth によるアルゴリズムSimpath e1 e4 s t e3 e2 e5 木の枝刈り e1 = 0 かつ e2 = 0 なら s-t パスができることはない e1 e4 e2 e3 e2 e1= 1 e1= 0 e1 = 1 かつ e3 = 1 かつ e4= 1 ならs-t パスができることはない 1 e2= 1 e2= 0 e2= 0 0 0 … … (分岐が生じる) 0 1 … 1 0 木の枝刈りを行っても 場合の数は指数爆発 …
Knuth によるアルゴリズムSimpath e4 e8 e1 e6 s t e3 e10 e7 以下の2つからは同じ木が生成される e2 e11 e5 e9 e11 e11 e10 e10 e9 e9 e8 e8 e8 e8 t t s s 1 0 0 0 0 0 0 1 0 0 e10 e10 e8 e11 e11 t s e9 e9 e10 e11 e9
Knuth によるアルゴリズムSimpath e4 e8 e1 e6 s t e3 e10 e7 e2 e11 … … e5 e9 … … … e11 e11 e9 e9 e8 e10 e10 e7 e7 e8 … … 0 0 0 0 1 1 0 0 0 0 e8 t s e10 e11 e9
Knuth によるアルゴリズムSimpath e4 e8 e1 e6 s t e3 e10 e7 e2 e11 … … e5 e9 … … … e11 e11 e10 e9 e8 e8 e10 e7 e7 e9 … … … 1 0 0 0 1 0 0 0 0 e8 t s e10 同じ形をもつ子は共有したい e11 e9
Knuth によるアルゴリズムSimpath e4 e8 5 5 e1 e6 s t e3 e10 e7 e7 e7 e2 7 7 e11 … … 6 6 e5 e9 … … … e7 e7 e8 e8 e7 = 1 e7 = 0 … e8 e8 e8 t t t s s s … 共有する e10 e10 e10 e11 e11 e11 e9 e9 e9 5 6は sとつながっている 5 は 7とつながっている 7 6
Knuth によるアルゴリズムSimpath 接続情報の記憶法 mate 配列 5 8 1 2 3 4 5 6 7 8 9 i 2 4 1 7 mate[i] 6 0 0 0 7 1 5 8 9 9 6 3 逆端の番号 頂点がパスの端 t s 0 頂点がパスの途中 頂点がいずれの パスにも含まれない 自身の番号
Knuth によるアルゴリズムSimpath 接続情報の記憶法 mate 配列 この部分のみ記憶 5 1 2 3 4 5 6 7 8 9 i 8 2 4 1 mate[i] 6 0 0 0 7 1 5 8 9 7 9 6 3 頂点がパスの端 逆端の番号 frontier 頂点がパスの途中 0 頂点がいずれの パスにも含まれない 自身の番号 t s どの頂点の接続情報を覚えればよいか? ei 枝 i を処理するとき、 枝 i に接続している頂点を「訪れた」と表現する F := {訪れたことのある頂点} {二度と訪れない頂点} F を frontierという。 frontier 頂点の接続情報を覚える
Knuth によるアルゴリズムSimpath e4 e8 5 5 e1 e6 s t e3 e10 e7 e7 e7 e2 7 7 e11 … … 6 6 e5 e9 … … … e8 e7 e7 e8 e7 = 1 e7 = 0 … e8 e8 e8 t t t s s s … e10 e10 e10 5 6 7 i 5 6 7 i e11 e11 e11 mate[i] mate[i] 7 1 5 7 1 5 e9 e9 e9 5 frontier の部分の mate が同じなら共有する 7 6
Knuth によるアルゴリズムSimpath 1 mate の更新 1 1 2 5 1 2 e4 e8 2 4 2 1 e1 e6 1 2 s t e3 e10 1 7 e7 1 2 3 3 1 2 3 e2 e11 2 1 3 6 3 2 1 e5 e9 ex e4 e2 e2 e3 e1 e3 ex+1 1 2 3 4 忘れてよい 一般に … 4 0 3 1 a c a b c d 0 0 c d a b ex d b a b c d 0 0 d c 最大4か所書きかえれば更新できる
Simpathでは、(既約とは限らない)ZDDを構築しているSimpathでは、(既約とは限らない)ZDDを構築している → 既約化アルゴリズムによって、 節点サイズに比例する時間で既約化できる 節点の共有 節点の削除 e1= 0 … e2= 1 e2= 0 e10 e10 e9 e8 e7 e8 e6 e9 e1 e2 e7 e6 … … … したがって、パスの列挙だけでなく、 ・ 列挙した結果を圧縮して保持 ・ 列挙したパスの索引生成 ・ 列挙した結果から条件を満たすパスを得る もできたことになる 0 0 0 0 0 0 0 0 1 0 1
Mate-ZDD 法(提案手法) ZDD の代数演算のみを用いて、ZDD を構築できないか? e1 s 7 4 1 t e3 5 2 3 8 e6 e4 6 各頂点のペア (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 法(提案手法) i, j が1本のパスの両端なら mi, j= 1 e1 s 7 4 1 t e3 5 2 3 8 e6 e4 6 選ばれた枝+mate を集合として表す {e1, e3, e4, m14, m56, m33,…}
Mate-ZDD 法(提案手法) e7 e7 e1 e1 s 7 s 4 7 4 e7 = 1 1 t 1 t e3 5 e3 5 2 3 8 2 3 8 e6 e4 e6 e4 6 6 {e1, e3, e4, m14, m56, m33,…} {e1, e3, e4, e7, m17, m56, m33,…} e6まで処理済み、次は e7 e7 = 0 なら mate は変化なし e7 = 1 なら m14→m17
Mate-ZDD 法(提案手法) e6の処理が終わった時点での全状態を集めたものを考える e1 e1 e1 s s s 7 7 7 4 4 4 1 1 1 t t t … e3 e3 e3 5 5 5 2 2 2 3 3 3 8 8 8 e6 e6 e6 e4 e4 e4 6 6 6 {e1, e3, e4, m14, m56, m33,…} {e1, e3, m14, m25, m33,…} {e2, e3, m15, m44,…} … これらの全状態に対して、先ほどの操作を行いたい
ZDD と集合族 集合の集合(集合族)は ZDD で効率よく保持できる 1 0 b c d c c b a d {{a, b, c, d}, {a, c}, {b, c}, {b, d}} 1 1 0 1 1 は省略
ZDD と集合族 集合族への操作例: a を含む集合だけを取り出し、a を消去する {{b, c, d}, {c}} {{a, b, c, d}, {a, c}, {b, c}, {b, d}} a を含まない集合だけ 取り出すなら、LO 枝側を もってこればよい 1 0 a b c d c b c d b c d c 1 1 1 1 1 1 トップの要素なら簡単にできる
ZDD と集合族 集合族への操作例: c を含む集合だけを取り出し、c を消去する {{a, b, d}, {a}, {b}} {{a, b, c, d}, {a, c}, {b, c}, {b, d}} 1 0 1 0 b c d c b a c a b d b d c c c 1 1 1 1 1 1 1 d 1 トップでなければ、その変数の深さまで潜って、 枝の付け替えを行う
ZDD と集合族 集合族への操作例: c を含む集合だけを取り出し、c を消去する {{a, b, d}, {a}, {b}} {{a, b, c, d}, {a, c}, {b, c}, {b, d}} c を含まない集合だけ 取り出すなら、LO 枝の 方に付け替えればよい 1 0 1 0 d c c b a c a d b b d b c c c 0 1 1 0 1 1 1 d 1 1 1 トップでなければ、その変数の深さまで潜って、 枝の付け替えを行う
ZDD と集合族 集合族への操作例: eを各要素に追加する {{a, b, c, d, e}, {a, c, e}, {b, c, e}, {b, d, e}} {{a, b, c, d}, {a, c}, {b, c}, {b, d}} b d a b c c c b d e d c a b c d c 1 0 1 1 1 1 1 1 1 1 トップに加える場合
ZDD と集合族 集合族への操作例: eを各要素に追加する {{a, b, c, d, e}, {a, c, e}, {b, c, e}, {b, d, e}} {{a, b, c, d}, {a, c}, {b, c}, {b, d}} d b a b c d e c e c d e c a b c d e c b 1 0 1 1 1 1 1 1 1 1 間に加える場合
ZDD と集合族 集合族を積と和で表現すると見やすい {{a, b, c, d}, {a, c}, {b, c}, {b, d}} abcd + ac + bc + bd (abcd + ac + bc + bd) ×e = abcde + ace + bce + bde eを各要素に追加する (abcd + ac + bc + bd) = a(bcd + c) + bc + bd なので、 a を含む集合だけを取り出し、 a を消去する (abcd + ac + bc + bd) / a = bcd + c a を含まない集合だけを取り出し、 a を消去する (abcd + ac + bc + bd) % a = bc + bd (多項式の除算、剰余算)
Mate-ZDD 法(提案手法) e6の処理が終わった時点での全状態を集めたものを考える e1 e1 e1 s s s 7 7 7 4 4 4 1 1 1 t t t … e3 e3 e3 5 5 5 2 2 2 3 3 3 8 8 8 e6 e6 e6 e4 e4 e4 6 6 6 f = e1e3e4m14m56m33 + … e2e3m15m44 + e1e3m14m25m33 + これらの全状態に対して、先ほどの操作を行いたい 集合族を ZDD で表したものを f とする
Mate-ZDD 法(提案手法) e6の処理が終わった時点での全状態を集めたものを考える f = e1e3e4m14m56m33 + … e2e3m15m44 + e1e3m14m25m33 + これらの全状態に対して、先ほどの操作を行いたい m14 → m17 の付け替え演算 f = f + f / m14 ×e7 ×m17 m14 を含むものを取り出し、 m14 を削除 e7 を追加 m17 を追加
Mate-ZDD 法(提案手法) i i k k アルゴリズム 初期値 f = m11 × m22 × m33 × ... e e 各枝 e = {i, j} について j j l l frontier を計算 frontier の中の各頂点k,lについて f = f + f × e /mik/ mjl × mkl k 頂点 p を二度と訪れないならば 各 k = p についてf = f % mpk(頂点p の次数が1の項は削除) f = f / mpp + f % mpp(mpp変数の除去) p 最後にf = f / mst
Mate-ZDD 法の変数順 変数は ZDD のトップに追加する方が計算が早いので、 Mate-ZDD 法では、先に処理した枝変数を ZDD の下にするのがよい (ボトムアップ的) (Simpathはトップダウン的) e1 e2 e2 e1 e1 e1 m11 m12 m11 m11 m11 m12 m22 m11 m 変数は頻繁に操作されるので、e 変数の上に するのがよい … … … e2処理 e1処理
Mate-ZDD 法の変数順 {e1, e3, e4, m14, m56, m33} m 変数 e1 e3 e4 m33 m56 m14 e 変数 … … e2 e1 1 … 上段で m 変数の集合、すなわち mate を表している。 ある mate 値をもつ e 変数の集合がぶら下がっている
Mate-ZDD 法の変数順 フロンティアの2乗の段数 m 変数 e 変数 … e2 e1 … フロンティアの2乗の個数の m 変数が存在し、 それらを更新しなければならない
Hybrid 法 {e1, e3, e4, m14, m56, m33} 4 0 3 1 6 5 7 8 9 10 11 12 e4 e3 e1 e 変数 … e2 e1 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} e 変数 … e2 e1 e4 e3 e1 … 1 0 枝に制約条件を加えて、列挙を行うことが容易になる。 例えば、e3 と e4の少なくとも一方の枝を使うという条件なら F = F / e3 ×e3 + F / e4 ×e4 の演算を e4の処理時に全体に施せばよい。 mate 配列に所属する e 変数がなくなれば、mate 配列を削除できる
CyPath: Read ‘75 のalg. Simpath: Knuth のalg. Mate-ZDD: 提案手法 Hybrid: 提案手法 実験結果 日本地図グラフ 北海道から鹿児島までの全パス 日本地図グラフの頂点を 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グリッド L ・・・ ・・・ L ・・・ ・・・ ・・・ ・・・ ・・・ (単位:秒) s t
実験結果 CyPath: Read ‘75 のalg. Simpath: Knuth のalg. Mate-ZDD: 提案手法 Hybrid: 提案手法 n 頂点ランダムグラフ、枝の生成確率 0.5 (単位:秒)
マルチパスの列挙 s2 s1 - t1パス s1 の組を全列挙 交差しない s2 - t2パス s3 - t3パス t3 ms1t1と ms2t2 と ms3t3を含む集合を 残せばよい t2 s3 t1
条件付きパス(サイクル)の列挙 e2 e1 e3 1 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
連結部分グラフの列挙 e7 e1 s s と t が連結になるような 部分グラフを列挙 → ネットワーク信頼性評価への応用 e8 t e9 e3 e2 e5 e10 e6 e4 e7 4 は 1 と同じ連結成分 5 は 6 と同じ連結成分 e1 s 7 4 1 t e3 5 2 3 8 e6 e4 6
まとめ • s-t-パスを列挙するアルゴリズム • Simpath(Knuth) • Mate-ZDD (提案手法) • Hybrid 法 (提案手法) • 今後の課題 • 計算時間の解析 • 頂点の順序付け • 様々な条件下での列挙