SlideShare una empresa de Scribd logo
1 de 57
スライドの前に
この発表の後数え上げお姉さんの問題が登場
します。
こいつの言ってること全然よくわかんねぇな
~ってなったら諦めて数え上げお姉さんの動
画でも見て暇を潰そう。
組み合わせ集合
組み合わせ集合
組み合わせの集合です(完)
組み合わせ集合
組み合わせの集合です(完)
例:{H,T,D,N}の組み合わせ集合
{{H,D,N}, {T,D,N}}
{{φ(空集合)}, {T},{H,T,N}}
etc…
組み合わせ集合
組み合わせの集合です(完)
愚直に列挙は列挙数が増えると大変
場合分け二分木
場合分け二分木
場合分け二分木とは
場合分け二分木
場合分け二分木とは
葉以外のノードに要素、辺と葉に1/0を割り当
てた二分木
子への辺は有向辺とする
場合分け二分木
場合分け二分木とは
葉以外のノードに要素、辺と葉に1/0を割り当て
た二分木
子への辺は有向辺とする
組み合わせ集合を表すときに用いられるデータ構造。
ある組み合わせが木のパスと対応する。
場合分け二分木の例
{{H,D,N},{T,D,N}}
実線は要素を用いる
1の枝
破線は要素を用いない
0の枝
T
D
NN
0 0 0 0
D
NN
0 0 0 1
T
D
NN
0 0 0 1
D
NN
0 0 0 0
H
場合分け二分木の問題点
ノードが増えすぎる!!!
場合分け二分木の問題点
ノードが増えすぎる!!!
要素が1つ増えるだけでノード数が二倍以上に
要素数が多くなるとメモリが足りなくなる
どうしよう?
アイデア
部分木が等しければまとめられそう?
T
D
NN
0 0 0 0
D
NN
0 0 0 1
T
D
NN
0 0 0 1
D
NN
0 0 0 0
H
アイデア
部分木が等しければまとめられそう?
T
D
NN
0 0 0 0
D
NN
0 0 0 1
T
H
※もっとまとめられそう
(下のN-0-0とか)
zero-suppress
(ゼロサプレス)という考え方
ざっくり言うと0を省くという考え方
zero-suppress
(ゼロサプレス)という考え方
ざっくり言うと0を省くという考え方
例
電卓の00000334→334
これをさっきの場合分け二分木に適用しよう!
(??)
zero-suppress
(ゼロサプレス)という考え方
T
D
NN
0 0 0 0
D
NN
0 0 0 1
T
D
NN
0 0 0 1
D
NN
0 0 0 0
H
zero-suppress
(ゼロサプレス)という考え方
T
D
NN
0 0 0 0
D
NN
0 0 0 1
D
NN
0 0 0 1
H
good bye…
※他もまとめられます
ZDD
ZDDのルール
基本は場合分け二分木
ZDDのルール
基本は場合分け二分木
それに加え以下の圧縮規則を適用(適用順は
任意)
等価節点の共有
等価なノード(自身のラベルと子が等しい)
を共有する。
ZDDのルール
基本は場合分け二分木
それに加え以下の圧縮規則を適用(適用順は任意)
等価節点の共有
等価なノード(自身のラベルと子が等しい)を共有
する。
冗長節点の削除
1の枝が0を指しているノードを削除して0の枝の子に直
結させる。
ZDDのルール
基本は場合分け二分木
それに加え以下の圧縮規則を適用(適用順は任意)
等価節点の共有
等価なノード(自身のラベルと子が等しい)を共有
する。
冗長節点の削除
1の枝が0を指しているノードを削除して0の枝の子に直
結させる。
これ以上圧縮出来ない形のZDDを既約なZDDという
ZDDの例
T
D
NN
0 0 0 0
D
NN
0 0 0 1
T
D
NN
0 0 0 1
D
NN
0 0 0 0
H
T
0
D
N
1
H
冗長節点の削除について
冗長節点の削除
1の枝が0を指しているノードを削除して0の枝の
子に直結させる。(謎規則)
背景にゼロサプレスという考え方がある
冗長節点の削除について
冗長節点の削除
1の枝が0を指しているノードを削除して0の枝の
子に直結させる。(謎規則)
背景にゼロサプレスという考え方がある
数千個のものから2つ、3つ選ぶとき、全部分
岐するのは冗長でしょみたいな
たまご・牛乳・パンケーキの集合ために何千
個の商品の0の枝を指すのはアホらしい
有効な場面
組み合わせ集合、中でも疎な集合に
有効(密な場合はBDDの方が良いこ
とも)
有効な場面
組み合わせ集合、中でも疎な集合に
有効(密な場合はBDDの方が良いこ
とも)
辺の集合からグラフの集合とかも表
せる(例:お姉さん問題)
有効な場面
組み合わせ集合、中でも疎な集合に有
効(密な場合はBDDの方が良いこと
も)
辺の集合からグラフの集合とかも表せ
る(例:お姉さん問題)
今回の後ろの発表はグラフがメインっぽ
い(本もグラフ列挙)
有効な場面
組み合わせ集合、中でも疎な集合に有効
(密な場合はBDDの方が良いことも)
辺の集合からグラフの集合とかも表せる
(例:お姉さん問題)
今回の後ろの発表はグラフがメインっぽい
(本もグラフ列挙)
※BDDはZDDの原型で圧縮ルールが少し違う
データ構造
ZDDの作り方
全探索しても作れるが、ZDDの意味が薄くなる
ZDDの作り方
全探索しても作れるが、ZDDの意味が薄くなる
ボトムアップ的手法とトップダウン的手法がある
ボトムアップ的な手法は集合(ZDD)に対して
様々な演算(2つの集合をくっつけたり、集合の
ある要素をON,OFFしたりなど)を行って構築す
る。(つらそう)
フロンティア法
フロンティア
コロンビアではない
グラフの頂点の内、処理済みの辺と未処理の
辺両方に接続されている頂点の集合
A.フ ロ ン テ ィ ア
フロンティア法
ZDDをトップダウン的な手法で構築する手法。
こっちも結構難しい(小並感)
フロンティア法
ZDDをトップダウン的な手法で構築する手法。
こっちも結構難しい(小並感)
既約な形で出来るとは限らない
雰囲気はグラフを幅優先で枝刈り探索みたい
な
フロンティア法の背景
ZDDを上から作っていきたい
フロンティア法の背景
ZDDを上から作っていきたい
ZDDの全部の頂点を保持しておくのはヤバイ
フロンティア法の背景
ZDDを上から作っていきたい
ZDDの全部の頂点を保持しておくのはヤバイ
作りながら枝刈りやノードの共有をしたい
フロンティア法の背景
ZDDを上から作っていきたい
ZDDの全部の頂点を保持しておくのはヤバイ
作りながら枝刈りやノードの共有をしたい
しかし子が生まれてないので難しい
フロンティア法の背景
ZDDを上から作っていきたい
ZDDの全部の頂点を保持しておくのはヤバイ
作りながら枝刈りやノードの共有をしたい
しかし子が生まれてないので難しい
集合の状態を持つことで共有できるかどうか
判定しよう
例:グラフのs-t経路の列挙
連結成分と次数だけを覚えておけばよい
例:グラフのs-t経路の列挙
連結成分と次数だけを覚えておけばよい
しかしそれだけでもZDDの1頂点あたりO(頂
点数)だけ記憶領域が必要
例:グラフのs-t経路の列挙
連結成分と次数だけを覚えておけばよい
しかしそれだけでもZDDの1頂点あたりO(頂
点数)だけ記憶領域が必要
グラフの全部の頂点を覚えるのはヤバそう
例:グラフのs-t経路の列挙
連結成分と次数だけを覚えておけばよい
しかしそれだけでもZDDの1頂点あたりO(頂
点数)だけ記憶領域が必要
グラフの全部の頂点を覚えるのはヤバそう
実はフロンティアの連結と次数だけ覚えてお
けばよい
例:グラフのs-t経路の列挙
S
S
T
T
フロンティア法まとめ
ZDD作ると記憶領域爆発しちゃうよぅ・・・
フロンティア法まとめ
ZDD作ると記憶領域爆発しちゃうよぅ・・・
枝刈りとかして乗り切ろう!
フロンティア法まとめ
ZDD作ると記憶領域爆発しちゃうよぅ・・・
枝刈りとかして乗り切ろう!
状態持たせすぎて爆発しちゃうよぅ・・・
フロンティア法まとめ
ZDD作ると記憶領域爆発しちゃうよぅ・・・
枝刈りとかして乗り切ろう!
状態持たせすぎて爆発しちゃうよぅ・・・
フロンティアの状態だけ覚えてなんとかしよ
う!
フロンティア法まとめ
ZDD作ると記憶領域爆発しちゃうよぅ・・・
枝刈りとかして乗り切ろう!
状態持たせすぎて爆発しちゃうよぅ・・・
フロンティアの状態だけ覚えてなんとかしよ
う!
辺の処理順はうまくやろう(フロンティアが
爆発する可能性アリ)
ふぇぇ・・・ZDD難しそうだよぅ・・・
C++のライブラリがあります(やったぜ)
https://github.com/junkawahara
Graphillionとかいう強そうなPythonのライブ
ラリもある
https://github.com/takemaru/graphillion/
wiki
まとめ
ZDDは組み合わせ集合を表すのに便利なデー
タ構造
場合分け二分木をゼロサプレスという考え方
などを用いて圧縮
ZDDの代表的な作り方はボトムアップ的手法
とフロンティア法がある
ライブラリで殴ろう(?)
おまけ1 BDD
BDDとZDD
ZDDは元々BDDの派生
ゼロサプレスではなくあってもなくてもどっ
ちでもいいような要素を省略する(適当)
おまけ2 競プロの問題を
解く
Alien Message
時間足りずにスライド書けなかったゾ~
入力のグリッドマップをグラフに変換します
グラフをライブラリに投げてハルミトン閉路
を検出します
終わり(やったぜ)

Más contenido relacionado

La actualidad más candente

充足可能性問題のいろいろ
充足可能性問題のいろいろ充足可能性問題のいろいろ
充足可能性問題のいろいろHiroshi Yamashita
 
不均衡データのクラス分類
不均衡データのクラス分類不均衡データのクラス分類
不均衡データのクラス分類Shintaro Fukushima
 
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリングmlm_kansai
 
Optimizer入門&最新動向
Optimizer入門&最新動向Optimizer入門&最新動向
Optimizer入門&最新動向Motokawa Tetsuya
 
最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情Yuta Kikuchi
 
Layer Normalization@NIPS+読み会・関西
Layer Normalization@NIPS+読み会・関西Layer Normalization@NIPS+読み会・関西
Layer Normalization@NIPS+読み会・関西Keigo Nishida
 
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)Shota Imai
 
Transformerを多層にする際の勾配消失問題と解決法について
Transformerを多層にする際の勾配消失問題と解決法についてTransformerを多層にする際の勾配消失問題と解決法について
Transformerを多層にする際の勾配消失問題と解決法についてSho Takase
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)AtCoder Inc.
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムTakuya Akiba
 
最適輸送の解き方
最適輸送の解き方最適輸送の解き方
最適輸送の解き方joisino
 
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat ModelsDeep Learning JP
 
基礎線形代数講座
基礎線形代数講座基礎線形代数講座
基礎線形代数講座SEGADevTech
 
トピックモデルの評価指標 Perplexity とは何なのか?
トピックモデルの評価指標 Perplexity とは何なのか?トピックモデルの評価指標 Perplexity とは何なのか?
トピックモデルの評価指標 Perplexity とは何なのか?hoxo_m
 

La actualidad más candente (20)

明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
充足可能性問題のいろいろ
充足可能性問題のいろいろ充足可能性問題のいろいろ
充足可能性問題のいろいろ
 
不均衡データのクラス分類
不均衡データのクラス分類不均衡データのクラス分類
不均衡データのクラス分類
 
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
 
Optimizer入門&最新動向
Optimizer入門&最新動向Optimizer入門&最新動向
Optimizer入門&最新動向
 
最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情
 
Convex Hull Trick
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
 
Layer Normalization@NIPS+読み会・関西
Layer Normalization@NIPS+読み会・関西Layer Normalization@NIPS+読み会・関西
Layer Normalization@NIPS+読み会・関西
 
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
 
Transformerを多層にする際の勾配消失問題と解決法について
Transformerを多層にする際の勾配消失問題と解決法についてTransformerを多層にする際の勾配消失問題と解決法について
Transformerを多層にする際の勾配消失問題と解決法について
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)
 
直交領域探索
直交領域探索直交領域探索
直交領域探索
 
Binary indexed tree
Binary indexed treeBinary indexed tree
Binary indexed tree
 
CuPy解説
CuPy解説CuPy解説
CuPy解説
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
 
最適輸送の解き方
最適輸送の解き方最適輸送の解き方
最適輸送の解き方
 
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models
 
Topological sort
Topological sortTopological sort
Topological sort
 
基礎線形代数講座
基礎線形代数講座基礎線形代数講座
基礎線形代数講座
 
トピックモデルの評価指標 Perplexity とは何なのか?
トピックモデルの評価指標 Perplexity とは何なのか?トピックモデルの評価指標 Perplexity とは何なのか?
トピックモデルの評価指標 Perplexity とは何なのか?
 

ZDD基礎