Sudoku Programing

数独(Sudoku)

  • アメリカ人建築家ハワード・ガーンスが匿名で考案
  • 1979年にニューヨークの出版社デル・マガジン社から初めて出版
    • 「Number Place」という名称
  • 2003年、ニュージーランド人ウェイン・グールドが問題生成プログラムを開発
    • 開発期間:6年
    • イギリスの新聞・タイムズに売り込み
    • 2004年から Su Doku の名で連載を開始
    • ワールドワイド(含む日本)にブーム化
  • 「数独」は登録商標@日本のみ

数独のルール

3x3のブロックを3x3に並べた盤面のセルに

1~9の数字を重ならないように入れる

数独 特徴

  • 数字には意味は無い。アルファベットや図形でも可
  • 制約充足問題 に分類される
  • 解はユニークであること
  • 1~9の順列:9! = 362,880。
  • 9行:362,880^9 = 1.09*10^50
  • 解になっているものは上記よりはるかに少ない
  • 問題は解の一部分のみを表示したもの
    • 同じ解でも、多数の問題が存在しうる
  • 上下左右反転・回転対称・数字置換問題も存在

Solver

  • ソルバーとは問題を解くプログラムのこと
  • 方式:
    • バックトラッキングで一気に解く
    • ヒューリスティックな解法を順次適用
  • 場合の数が多いので、バックトラッキングでは時間がかかり過ぎて実用的でない
    • と思っていたのだけど、試してみたら世界一難しい問題でも1秒もかからなかった

データ構造:

  • int8    cell[81]; で事足り
  • 数字をビットマップにすると、重なり判定が楽になる
    • b8 b7 b6 ... b0:値 num → 1<<(num-1) とする
    • 行・列・ブロックのビットの総論理和の反転:
      • → 配置可能な数値のビット

バックトラッキング アルゴリズム:

※ 上記アルゴリズムは解があれば、それを発見できる。

が、解がユニークかどうかは判定できない

ヒューリスティックな解法

  • テクニック:
    • Hull House, Hidden Single, Naked Single, Locked Candidates, X-Wing, Pair, ...
  • ヒューリスティックな解法は人間には実行可能だが、プログラミングするコストが高い
  • 高速化するにはビット演算が効果的
  • Hidden/Naked Single だけでかなりの問題が解ける

問題生成

  • パズルルールは法律で保護されていない
  • パズルの問題には著作権が認められている
    • 良質な問題生成プログラムはビジネス的な価値が高い

問題生成アルゴリズム

  1. 解生成
  2. 数字を間引く
  3. 解がユニークに存在するかチェック
    1. バックトラッキングアルゴリズム使用
  4. → 問題の出来上がり

難易度調整

  • 空欄数で調整
    • 例:入門:40、初級:45、中級:50、上級:55
    • 統計的には妥当
  • 人間的な難易度感覚とは異なる問題が生成されてしまう
    • 空欄数が少なくても、ヒューリスティックに解けないと難しい問題と感じてしまう
  • ヒューリスティックに解けるかどうかも考慮
    • 入門・初級問題は基本テクニックだけで解けるもの
    • 中級は実装済ヒューリスティックな解法で解けるもの
    • 上級は実装済ヒューリスティックな解法で解けないもの
  • 概ね人間的な難易度感覚と一致

まとめ・今後の課題

  • cocos2d-x/C++ により数独アプリを実装・リリースした
  • 問題自動生成により、入門~上級の千問の事前生成された問題・リアルタイム生成問題を用意
  • C++/ビット演算により高速な処理を実現
  • ヒューリスティックな解法実装は工数が多く、未実装なものが多い
    • そのうち全部実装したい
  • 16x16 や、その他のバリエーションも実装してみたい
Made with Slides.com