フロンティア法 - 組合せ問題の解を列挙 索引化するZDD構築アルゴリズム 川原 純 科学技術振興機構 ERATO湊離散構造処理系プロジェクト 北海道大学 情報科学研究科 列挙問題 • 例:グラフ上の2点間のパスを列挙 既存の 列挙Alg. s 列挙結果は1つずつ出力 t 列挙結果を1つずつ出力すると… • 保存ができない 17×17 グリッドグラフ 6344814611237963971310297540795524400449443986866480693646369387855336 = 6.3 × 1061 = 約 63 那由多 個 • 欲しい解を検索、絞り込みが難しい 辺 p, q を使用、辺 r を使用していないパスをすべて列挙 長さ最小のものは? s 数え上げ、ランダムサンプリング等 … … • 活用が難しい … … … … 17 17 t 列挙結果の保存・活用 • ZDD: 集合の集合をDAGで表したデータ構造 展開 ZDD構築 Alg. s … (一様)ランダムサンプリング 数え上げ t 全 s-t パスを表す ZDD 6×1061個のパスが ノード数4×108 個の ZDDに圧縮 重み最小の要素を計算 検索、絞り込み 列挙結果の検索・絞り込み • ZDDには様々な代数演算が用意されている – ある辺 e を通らないパスの集合 圧縮したままの演算が可能 ZDDの形で出力することで、 % e 単に列挙だけでなく、列挙結果の活用が可能となる → 列挙索引化 – 2つのZDDが表す集合族の共通部分 ∩ 全s-t パスを 表すZDD 制約Aを 表すZDD 制約Aを満たす 全s-tパスを表すZDD 制約A: 例えば、要素数が 10個以下 本発表の内容 パス列挙(ZDD構築)アルゴリズム [D.Knuth 08] Tutte多項式計算アルゴリズム [K.Sekine, H.Imai 95] (見かけは異なるが、) 本質的に同じアルゴリズム → 様々な対象について、ZDDを構築可能 → フロンティア法として汎用化 本質的に何が必要かを抽出 フロンティア法によって ZDD構築可能な問題を整理 ZDD: 集合の集合を表現するデータ構造 (Zero-suppressed Binary Decision Diagram) [S.Minato 93] e1 0 , { e2 e 5 } , { e2 e4 e 5 } { e3 e4 e5 } , { e3 e5 } , { e5 } } { e2 { e1 } 集合の集合 e3 e4 e5 0 1 ZDD 1 ZDD: 集合の集合を表現するデータ構造 e1 0 , { e2 e 5 } , { e2 e4 e 5 } { e3 e4 e5 } , { e3 e5 } , { e5 } } { e2 { e1 } 集合の集合 0 : 0 終端 1 : 1 終端 ei : ノード それぞれ1つずつもつ e3 e4 e5 0 e1 ~ e5 いずれかのラベル e1 , e2,…, e5 の順序 1 ZDD 1 ZDD: 集合の集合を表現するデータ構造 ノードは0枝と1枝を1つずつもつ , { e2 e 5 } , { e2 e4 e 5 } { e3 e4 e5 } , { e3 e5 } , { e5 } } { e2 { e1 } 集合の集合 0 : 0 終端 1 : 1 終端 ei : ノード それぞれ1つずつもつ e1 0 e3 e4 e5 0 e1 ~ e5 いずれかのラベル e1 , e2,…, e5 の順序 1 ZDD 1 ZDD: 集合の集合を表現するデータ構造 ノードは0枝と1枝を1つずつもつ , { e2 e 5 } , { e2 e4 e 5 } { e3 e4 e5 } , { e3 e5 } , { e5 } } { e2 { e1 } 集合の集合 1つの集合が、 top から 1 までの1本のパスに対応 e1 0 e3 e4 e5 0 1 ZDD 0 : 0 終端 1 : 1 終端 ei : ノード それぞれ1つずつもつ e1 ~ e5 いずれかのラベル 1 ZDD: 集合の集合を表現するデータ構造 ノードは0枝と1枝を1つずつもつ , { e2 e 5 } , { e2 e4 e 5 } { e3 e4 e5 } , { e3 e5 } , { e5 } } { e2 { e1 } 集合の集合 1つの集合が、 top から 1 までの1本のパスに対応 e1 0 e3 e4 e5 0 1 ZDD 0 : 0 終端 1 : 1 終端 ei : ノード それぞれ1つずつもつ e1 ~ e5 いずれかのラベル 1 ZDD: 集合の集合を表現するデータ構造 ノードは0枝と1枝を1つずつもつ , { e2 e 5 } , { e2 e4 e 5 } { e3 e4 e5 } , { e3 e5 } , { e5 } } { e2 { e1 } 集合の集合 1つの集合が、 top から 1 までの1本のパスに対応 e1 0 e3 e4 e5 0 1 ZDD 0 : 0 終端 1 : 1 終端 ei : ノード それぞれ1つずつもつ e1 ~ e5 いずれかのラベル 1 ZDDの性質 e1 0 e2 1 0 e2 e2 e3 e3 e4 e5 0 e1 e4 e5 1 0 等価な2つのノードは必ず共有される 1 1 パスは辺の集合で表現できる s e1 e2 s e1 e2 s e4 e3 {e1, e4} t e3 e5 s e4 e3 e5 s t {e1, e3 ,e5} e1 e2 e5 e1 e2 t e4 e4 e3 e5 e1 e2 t e4 e3 e5 t {e2, e5} {e2, e3 ,e4} パスは辺の集合で表現できる s e1 e2 s e1 e2 s e4 e3 {e1, e4} e4 e3 辺集合の集合で表す e5 s e3 e5 {e1, e3 ,e5} e1 e2 s t 全ての s-t パスを列挙して、 t e5 e1 e2 t e4 e4 e3 e5 e1 e2 t e4 e3 e5 t {e2, e5} {e2, e3 ,e4} パスは辺の集合で表現できる s e1 e2 e4 全ての s-t パスを列挙して、 t e3 辺集合の集合で表す e5 all s-t path = {{e1, e4}, {e2, e5}, {e1, e3 ,e5}, {e2, e3 ,e4}} s e1 e2 s e4 e3 {e1, e4} s e2 e5 e1 e2 t e4 e3 e5 s t {e1, e3 ,e5} e1 e4 e3 e5 e1 e2 t e4 e3 e5 t {e2, e5} {e2, e3 ,e4} Knuth のパス列挙アルゴリズム 全 s-t パスを表現する ZDD をトップダウン的に構築 ZDD パス列挙(ZDD構築)アルゴリズム [Knuth 08] 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. ZDDを構築 辺 e1, e2,… の順に処理 各辺変数 ei に対し、 ei = 0 or 1 を決めていく s-t パスになっている 1 e1 e4 s t e3 e2 e5 ei = 1 である辺が s-t パスになっているか? パス列挙(ZDD構築)アルゴリズム [Knuth 08] 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. ZDDを構築 辺 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 パスになっているか? パス列挙(ZDD構築)アルゴリズム [Knuth 08] 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. ZDDを構築 辺 e1, e2,… の順に処理 各辺変数 ei に対し、 ei = 0 or 1 を決めていく e4 1 1 1 1 他は0 1 が1つのパスに対応 パス列挙(ZDD構築)アルゴリズム [Knuth 08] s e1 e3 e2 e4 t e1 = 0 e1 e1 = 1 e2 e2 e2 = 1 e 2 = 0 e2 = 1 e2 = 0 e3 e3 e3 0 1 1 0 0 1 1 0 パス列挙(ZDD構築)アルゴリズム [Knuth 08] s e1 e3 e2 e4 t e1 = 0 e1 e1 = 1 e2 e2 e2 = 1 e 2 = 0 e2 = 1 e2 = 0 e3 e3 0 1 1 0 ノードを共有できるときは共有したい ただし、子DAGを作成せずに、共有可能か判定を行う パス列挙(ZDD構築)アルゴリズム [Knuth 08] 接続情報の記憶法 e1 1 mate 配列 2 e4 e3 e2 3 e5 4 i 1 2 3 4 mate[i] 3 0 1 4 頂点がパスの端 逆端の番号 頂点がパスの途中 0 頂点がいずれの パスにも含まれない 自身の番号 パス列挙(ZDD構築)アルゴリズム [Knuth 08] e1 e4 2 接続情報の記憶法 1 4 e3 e 3 e 2 [1, 2, 3, 4] e1 e = 1 e = 0 [2, 1, 3, 4] 1 [1, 2, 3, 4] 1 [2, 1, 3, 4] e e2 2 [1, 2, 3, 4] e3 mate 配列 i 1 2 3 4 mate[i] 3 0 1 4 5 逆端の番号 0 頂点がパスの端 頂点がパスの途中 頂点がいずれの パスにも含まれない 自身の番号 [3, 2, 1, 4] e3 e3 … [4, 0, 0, 1] e4 [4, 0, 0, 1] e4 mate 配列が一致すれば共有可能 パス列挙(ZDD構築)アルゴリズム [Knuth 08] e1 e4 2 接続情報の記憶法 1 4 e3 e 3 e 2 5 頂点がパスの端 頂点がパスの途中 頂点がいずれの パスにも含まれない 一般に c d i 1 2 3 4 mate[i] 3 0 1 4 a b ex ex ex+1 a b c d c d a b a b c d 0 0 d c 最大4か所書きかえれば更新できる 逆端の番号 0 自身の番号 パス列挙(ZDD構築)アルゴリズム [Knuth 08] 処理済み 接続情報の記憶法 s 未処理 t mate 配列はすべての頂点について 記憶する必要はない 5 1 s 7 5 t 1 7 t 6 6 e8 i 5 6 7 mate[i] 7 1 5 s e8 等価 i 5 6 7 mate[i] 7 1 5 フロンティア上のmate値のみ記憶、比較 処理済みの辺と 未処理の辺の 両方が接続している 頂点集合を フロンティアという パス列挙(ZDD構築)アルゴリズム [Knuth 08] mate 配列を用いると、枝刈りも容易に可能 i 5 6 7 mate[i] 1 6 7 フロンティア 5 1 t s 7 6 i 5 6 7 mate[i] 0 6 1 mateを見れば 分岐が生じることが 判定できる 0 に接続 i 5 6 7 mate[i] 1 7 6 5 1 t s 1 に接続 7 6 5 1 t s 7 6 s-tパスが 完成 s-tパス + 余計な辺 0 に接続 パス列挙アルゴリズム [Knuth 08] パス列挙の場合の 固有の処理 実験結果 日本地図グラフ 北海道から鹿児島までの全パス 頂点数 計算時間 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) n ・ ・ ・ 実験結果 ・ ・ ・ n × n グリッド ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ n n 構築時 間(秒) 15 206.0 16 701.9 17 2326.0 18 7607.1 19 28279.2 20 91944.1 21 284117.0 Thanks to 岩下洋哲氏 ZDD と集合族 集合の集合(集合族)は ZDD で効率よく保持できる 0 a 1 {{a, b, c, d}, {a, c}, {b, d}, {b, c}} b b d 1 d 1 c c c 1 0 は省略 d 1 ZDD と集合族 集合族への操作例: a を含む集合だけを取り出し、a を消去する {{a, b, c, d}, {a, c}, {b, d}, {b, c}} 0 a 1 b d 1 b c c c 1 d 1 a を含まない集合だけ 取り出すなら、LO 枝側を b もってこればよい c c {{b, c, d}, {c}} 1 d 1 トップの要素なら簡単にできる d 1 ZDD と集合族 集合族への操作例: c を含む集合だけを取り出し、c を消去する {{a, b, c, d}, {a, c}, {b, d}, {b, c}} {{a, b, d}, {a}, {b, d}} 0 a 1 0 a 1 b b d 1 d 1 c c c 1 b b d d 1 1 d 1 c c c 1 d 1 トップでなければ、その変数の深さまで潜って、 枝の付け替えを行う ZDD と集合族 集合族への操作例: c を含む集合だけを取り出し、c を消去する {{a, b, c, d}, {a, c}, {b, d}, {b, c}} 0 a 1 b 1 d 1 1 0 a 1 b b c c c d c を含まない集合だけ 取り出すなら、LO 枝の b 方に付け替えればよい {{a, b, d}, {a}, {b, d}} d d d 1 1 c c c 1 1 d 1 トップでなければ、その変数の深さまで潜って、 枝の付け替えを行う ZDD と集合族 集合族への操作例: e を各要素に追加する {{a, b, c, d, e}, {a, c, e}, {b, d, e}, {b, c, e}} e {{a, b, c, d}, {a, c}, {b, d}, {b, c}} 0 a 1 a b b d 1 d 1 c c c 1 b b d d 1 トップに加える場合 1 d 1 c c c 1 d 1 ZDD と集合族 集合族への操作例: e を各要素に追加する {{a, b, c, d, e}, {a, c, e}, {b, d, e}, {b, c, e}} a {{a, b, c, d}, {a, c}, {b, d}, {b, c}} 0 a 1 b b d 1 d 1 c 1 e d 1 間に加える場合 e e d d 1 c c c c c b b 1 1 e d 1 ZDD と集合族 ∩ {{a, b, c, d}, {b, d}, {b, c}} {{a, b, c, d}, {a, b}, {b, d}, {c, d}} {{a, b, c, d}, {b, d}} 様々な集合演算が効率よく実行可能 (再帰を用いたアルゴリズム) 列挙結果の検索・絞り込み(再掲) • ZDDには様々な代数演算が用意されている – ある辺 e を通らないパスの集合 % e – 2つのZDDが表す集合族の共通部分 ∩ 全s-t パスを 表すZDD 制約Aを 表すZDD 制約Aを満たす 全s-tパスを表すZDD 制約A: 例えば、要素数が 10個以下 解の数え上げ 13 0 a 1 6 3 b b 7 3 c c c 1 d d 0 1 2 4 {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} 一様ランダムサンプリング 確率 6 13 13 0 a 1 6 3 b b 7 d d 0 1 7 13 7 6 c c 1 確率 b 3 c a 13 2 4 {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} b 一様ランダムサンプリング 13 確率 0 a 1 6 3 b b 7 3 c c c 1 d d 0 3 6 1 2 4 b 6 確率 3 6 3 3 c {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} c 一様ランダムサンプリング {b, d} 13 0 a 1 6 3 b b 7 3 c c c 1 d d 0 1 2 4 {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} フロンティア法とは トップダウンにZDDを構築する技法 e 1 = 0 e1 e 1 = 1 e2 e2 e2 = 1 e 2 = 0 e2 = 1 e2 = 0 e3 e3 フロンティア 5 1 t s 7 6 0 1 1 0 ノードを共有できるときは共有したい フロンティア上に 何らかの情報を持たせて、 共有可能性と枝刈りを判定 i 5 6 7 mate[i] 0 6 1 一般化して configuration と呼ぶ 辺変数型 パス型 森型 [Knuth 2008] パス ハミルトンパス 森 カット(セット) s-tカット k 終端カット オイラー路 サイクル グラフ フラグ型 [Knuth 2008] 連結成分 ハミルトンサイクル 複数終端対パス (ナンバーリンク) 全域木 信頼性多項式 [Imai et al. 1997] シュタイナー木 根付き森、木 信頼性多項式 [Hardy et al. 2007] Tutte多項式 [Yoshinaka et al. 2012] 一般化 辺被覆 集合被覆 完全 マッチング 集合分割 マッチング 集合 パッキング Jones多項式 複数サイクル 有向グラフ ハイパー グラフ (ひもの絡み目) 上記2つ[関根, 今井 1996] 上記3つ [今井, 今井 1998] 有向パス [Knuth 08] 頂点変数型 頂点被覆 独立集合 支配集合 0-1 ナップザック 特殊 部分和 特殊 数分割 クリーク 頂点彩色 マトロイド 括弧列 [Saitoh et al. 2009] Tutte 多項式 動的計画法的な見方も可能 [Imai et al. 1996] 全域木の列挙 (本質的には [K.Sekine, H.Imai 95]) configuration の設計 5 t s 7 1 1 2 処理済み 5 1 1 7 t s t 2 6 6 e8 i 5 6 7 mate[i] 1 2 1 s 未処理 e8 等価 i 5 6 7 mate[i] 1 2 1 configuration として、各頂点が属する 連結成分の番号を記憶 フロンティアの 定義は同じ 全域木の列挙 (本質的には [K.Sekine, H.Imai 95]) 枝刈りの設計 5 s 7 1 1 2 同じ連結成分を 両端とする辺を加えるとき、 サイクルができる t 0 に接続 1 5 s 1 6 2 7 t 6 加えない i 5 6 7 mate[i] 1 2 1 5 最後の辺まで処理後、 0 に接続されないなら 1 に接続 1 s 1 2 7 t 孤立成分が 生じる 0 6 に接続 フロンティア法(再掲) 枝刈り の設計 configuration の設計 マッチングの列挙 configuration の設計 枝刈りの設計 5 1 s 7 5 t 6 i 5 6 7 mate[i] 0 1 1 既にマッチングに使われている頂点は 1 使われていない頂点は 0 と すればよい 1 s t 7 マッチングに 使われている 頂点に 辺を加える時 6 0 に接続 i 5 6 7 mate[i] 0 1 1 最後の辺まで処理後、 0 に接続されないなら 1 に接続 辺変数型 パス型 森型 [Knuth 2008] パス ハミルトンパス 森 カット(セット) s-tカット k 終端カット オイラー路 サイクル グラフ フラグ型 [Knuth 2008] 連結成分 ハミルトンサイクル 複数終端対パス (ナンバーリンク) 全域木 信頼性多項式 [Imai et al. 1997] シュタイナー木 根付き森、木 信頼性多項式 [Hardy et al. 2007] Tutte多項式 [Yoshinaka et al. 2012] 一般化 辺被覆 集合被覆 完全 マッチング 集合分割 マッチング 集合 パッキング Jones多項式 複数サイクル 有向グラフ ハイパー グラフ (ひもの絡み目) 上記2つ[関根, 今井 1996] 上記3つ [今井, 今井 1998] 有向パス [Knuth 08] 頂点変数型 頂点被覆 独立集合 支配集合 0-1 ナップザック 特殊 部分和 特殊 数分割 クリーク 頂点彩色 マトロイド 括弧列 [Saitoh et al. 2009] Tutte 多項式 動的計画法的な見方も可能 [Imai et al. 1996] 支配集合の列挙 v1 v2 v3 頂点の取捨選択の情報を (フロンティア上の)頂点に記憶しているため、 v4 v7 効率が良いとは限らない v5 v8 ではない全ての頂点は v6 v9 v2 = 0 v1 v2 v3 v4 v5 v6 v1 = 0 v1 v2 v1 = 1 v2 = 1 v2 = 0 少なくとも1つの v2 に隣接する v2 = 1 v7 頂点を変数とするZDDを構築 v8 v9 i 4 5 6 mate[i] 0 1 0 頂点が支配されているなら1 支配されていないなら0 と すればよい 0/1 ナップザック問題の列挙 x1 x2 重さ 50 … 100 … xn 210 各アイテムを 取るかとらないかを選択 重さが M 以下になるような取り方 0 0 x1 x2 = 0 x2 … xn x1 = 0 x1 x2 configuration = 重さの総和 x1 = 1 x2 = 1 x 2 = 0 50 x2 x2 = 1 動的計画法のテーブルと見ることもできる このグラフに対する フロンティア法と 見ることができる 辺変数型 パス型 森型 [Knuth 2008] パス ハミルトンパス [Knuth 2008] s-tカット k 終端カット 連結成分 ハミルトンサイクル 複数終端対パス (ナンバーリンク) 全域木 森 カット(セット) オイラー路 サイクル グラフ フラグ型 シュタイナー木 根付き森、木 信頼性多項式 [Hardy et al. 2007] Tutte多項式 [Yoshinaka et al. 2012] 一般化 辺被覆 集合被覆 完全 マッチング 集合分割 マッチング 集合 パッキング Jones多項式 複数サイクル 有向グラフ 有向パス [Knuth 08] (ひもの絡み目) 上記2つ[関根, 今井 1996] まとめ 上記3つ [今井, 今井 1998] ・フロンティア法によって様々な対象を表現する ZDDを構築可能 → configuration と枝刈りの設計 頂点変数型 頂点被覆 独立集合 支配集合 信頼性多項式 [Imai et al. 1997] ハイパー グラフ 0-1 ナップザック 特殊 部分和 特殊 数分割 クリーク 課題: 計算量評価等の理論的裏付け 頂点彩色 マトロイド 括弧列 [Saitoh et al. 2009] Tutte 多項式 動的計画法的な見方も可能 [Imai et al. 1996]
© Copyright 2024 ExpyDoc