PowerPoint プレゼンテーション

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