Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ZDDでSATを解く

3,110 views

Published on

JOI2015夏季セミのスライドです。

Published in: Technology
  • Be the first to comment

ZDDでSATを解く

  1. 1. ZDDでSATを解く お姉さんよりも恐ろしい問題
  2. 2. そもそもSATとは? • SATとは、論理式が与えられたとき、その式をtrue にすることができるかという問題 • NP完全 • 今回は答えが複数あるときは、それをすべて列挙 することにする
  3. 3. 連言標準形 • 今回は入力データは連言標準形という形式で与 えた。 • これは論理変数をいくつか論理和でつないだ節 が論理積でつながった形になっている。
  4. 4. フロンティア法 • 今回はこのSATを解くプログラムをフロンティア法 を用いて作った。 • 今回はフロンティアとして、今までに処理した論理 変数のみを考えたときのそれぞれの節の状態を保 持した。
  5. 5. 実装 • 今回は、フロンティアに含まれる節の数が数百から 数千になるので、long longの配列にビットとして情 報を保持した。 • 追加していく論理変数の順序はとりあえず1から順 番に追加していくことにした。
  6. 6. 高速化① • このままでは各状態のデータが多すぎるので、い らない情報を捨てる • この場合、すでにすべての論理変数を処理した節 や、まだ1つも論理変数を処理していない節の情 報を捨てる
  7. 7. 動かしてみた • ランダムなケースを作って動かしてみた。
  8. 8. 動かしてみた • ランダムなケースを作って動かしてみた フロンティアの状態の数 枝刈りされたもの 一致したフロンティアの数
  9. 9. 動かしてみた • 一応動く • でも遅い • メモリも食う
  10. 10. 高速化② • このままだとまずいので違うところを工夫してみる。 • フロンティア法ではフロンティア状態の数が増える と計算が遅くなる。 • まずい • 減らさなければ・・・
  11. 11. 高速化② • 今まで論理変数の追加順序は適当 • これをちゃんとした順番でやれば状態数が減りそう • 今回はまだ使っていない論理変数に対してスコア をつけ、それが最も大きいものを使った。
  12. 12. 高速化② スコアのつけ方 • その論理変数を使うとフロンティアとして持つ節の 数が減る→スコアを増やす • 逆にフロンティアの節が増える→その節の論理変 数が多いほどスコアを減らす • すでにフロンティアに含まれている節に存在する →その節の残っている論理変数が多いほどスコア を増やす
  13. 13. 動かしてみた② • こうなる
  14. 14. 動かしてみた② • こうなる フロンティアの状態の数 枝刈りされたもの 一致したフロンティアの数 追加する論理変数の番号
  15. 15. 応用してみた • これをSATソルバーとして使って数独を解いてみ た • パズルをSATに落とすのはsnukeさんが作ってくれ たものを使わせていただきました。
  16. 16. 応用してみた • 動かしてみる
  17. 17. 応用してみた • 動かしてみる
  18. 18. 応用してみた • 動かしてみる フロンティアの状態の数 枝刈りされたもの 一致したフロンティアの数
  19. 19. 応用してみた • ZDDは、この例のようにフロンティア同士が一致す るものが少ない場合は単なる枝刈り探索となってし まう。 • そうなると実行時間がたくさんかかってしまってつ らい
  20. 20. 結論 • このようにフロンティア同士が同じ状態にならないよ うなものはZDDに向いていない • ZDDは用法用量を守って正しく使いましょう
  21. 21. おまけ
  22. 22. 数え上げお姉さん • 一応自分もやってみた。 • こっちはSATソルバーと違ってフロンティアの情報 がlong longに収まるので楽
  23. 23. 数え上げお姉さん • この問題で扱うのは平面グラフなので、フロンティ アに含まれる各頂点は次の4種類のうちどれか1つ の状態になる。
  24. 24. 数え上げお姉さん • 接続している辺が0本 • 接続している辺が1本で、自分より前の頂点とつな がっている • 接続している辺が1本で、自分より後の頂点とつな がっている • 接続している辺が2本
  25. 25. 数え上げお姉さん • このようにするとフロンティアに含まれる各頂点に ついて2ビットの情報を持つだけでよい • すると1辺の辺の数が31、頂点の数が32のときま でフロンティアのデータを1つのlong long型の中に 収めることができる
  26. 26. 実行すると • こんな感じ 個数 実行時間
  27. 27. 実行すると • こんな感じ フロンティアの状態の数 枝刈りされたもの 一致したフロンティアの数
  28. 28. 実演
  29. 29. 結果 • このようにこの問題ではフロンティアの状態が一致 しているものがとても多いことが分かる • 自分のパソコンでは14*14まで実行することができ た。 • お姉さん救出成功!
  30. 30. ご清聴ありがとうございました

×