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.

Solving Sudoku by SAT Solver 01

SATソルバーを使って数独を解くウェブサービスを作ったので、その方法を説明します。

  • Login to see the comments

  • Be the first to like this

Solving Sudoku by SAT Solver 01

  1. 1. 数独ソルバーについて 1 okmt
  2. 2. なぜ制約プログラミングを面白いと思ったか。 ◼ 賢く問題を解く • コーディングスピードや実行性能を競う競技が流行っているが、 アルゴリズムをどれだけ頑張って記述しても限界がある • 問題によるが、制約プログラミングにはアルゴリズムを記述する 言語の限界を優に超える性能が期待できる ◼ まだ応用されている分野が少ない • 例えば、経路問題など、既存のサービスでも制約プログラミングを フルに用いれば最適経路を返せる状況を増やせると考えている • (応用の成功例)Jリーグ・マッチスケジューラー など 2
  3. 3. 発信 ◼ このプレゼンの内容(数独を解く)について • Qiitaの記事として公開 https://qiita.com/okmt1230z/items/63f49e021c94077c343e • 自作した数独ソルバーについてはGitHubに公開 https://github.com/okayu1230z/NumberPlaceSolver • ウェブサービスとして公開 http://okmt1230z.com/sudoku/sudoku.html 3
  4. 4. 制約プログラミング、特にSATとは ◼ 制約プログラミングとは? • 変数間の関係を制約という形で記述するプログラミング ◼ SAT (Boolean satisfiability testing) とは? • 命題論理式の充足可能性判定のこと。 • CNF (Conjunctive Normal Form、連言標準形) 式を 扱うことが一般 • CNF式の例(変数 𝑥 は 0 か 1 を取ります。) • 以上のように、CNF式を満たす変数の値割り当てを探すことこそが SATで、SATソルバーとはこれを解くソルバーのこと 4 式を満たす変数の値 割り当てを探す
  5. 5. ◼ 求解フロー ◼ CNF式の作り方について • 問題ごとの条件や数独のルールを全て0か1をとる変数に置き換 え、ゴリゴリとCNF式に起こしていきます。(次のページより) SATソルバーの活用例|数独(ナンプレ) 5 SolvingEncoding 問題 Decoding 答え SATソルバーCNF
  6. 6. 実装|パズル・数独をCNF式に落とし込む(1) ◼ 数独の制約モデル(数式で表現したもの) • 𝑖 行目 𝑗 列目のマスの値を 𝑥𝑖𝑗 で表すことにする。 • 各 𝑥𝑖𝑗 は1から9の値をとるから 𝑥𝑖𝑗 ∈ 1, 2, 3, 4, 5, 6, 7, 8, 9 と書くことができ、この条件は全体で 9*9 = 81 個ある 6 𝑥11 ∈ 1, 2, 3, 4, 5, 6, 7, 8, 9 CNFファイルに書き込む情報
  7. 7. 実装|パズル・数独をCNF式に落とし込む(2) ◼ 数独の制約モデル(数式で表現したもの) • 𝑥𝑖𝑗 と 𝑥 𝑘𝑙 が同一行(あるいは同一列、同一ブロック)にある場 合、異なる値をとらなければならない条件 𝑥𝑖𝑗 ≠ 𝑥 𝑘𝑙 7 𝑥11 ≠ 𝑥21 , 𝑥11 ≠ 𝑥31 , 𝑥11 ≠ 𝑥41 , 𝑥11 ≠ 𝑥51 , 𝑥11 ≠ 𝑥61 , 𝑥11 ≠ 𝑥71 , 𝑥11 ≠ 𝑥81 , 𝑥11 ≠ 𝑥91 , 𝑥21 ≠ 𝑥31 , 𝑥21 ≠ 𝑥41 , … 𝑥81 ≠ 𝑥91 CNFファイルに書き込む情報
  8. 8. 実装|パズル・数独をCNF式に落とし込む(3) ◼ 数独の制約モデル(数式で表現したもの) • 𝑥𝑖𝑗 のマスにヒントとして数字𝑎がかかれていることは、 𝑥𝑖𝑗 = 𝑎 8 𝑥11 = 5 CNFファイルに書き込む情報
  9. 9. SATソルバーの活用例|数独(ナンプレ) ◼ 自作数独ソルバーの性能 • 数独問題集の問題 800問 ◼ 平均求解時間は 0.002秒 • アルゴリズムを記述する方法での比較 • 自作数独ソルバーは 16マス x 16マス の数独にも対応 ◼ 求解時間は 0.064秒 9 URL 言語 求解時間(サイト準拠) https://qiita.com/wsldenli/items /78596c8775a0673f255e Python 23秒 https://qiita.com/Anishishi/item s/00fa13fcf0850144cae1 C++ 0.28秒 https://www.codeflow.site/ja/art icle/java-sudoku Java 0.25秒 http://www.aoky.net/articles/pet er_norvig/sudoku.htm Python 0.20秒
  10. 10. おわりに ◼ まとめ • 数独のようなパズルは制約プログラミングを用いるとアルゴリズムを 書いていくよりも早く求解できる • パズルに限らずこの技術が活躍できる場所はもっとあるはずだと 考えている ◼ スケジューリング、運搬経路問題など 10

×