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 だけでかなりの問題が解ける
問題生成
- パズルルールは法律で保護されていない
- パズルの問題には著作権が認められている
- 良質な問題生成プログラムはビジネス的な価値が高い
問題生成アルゴリズム
- 解生成
- 数字を間引く
- 解がユニークに存在するかチェック
- バックトラッキングアルゴリズム使用
- → 問題の出来上がり
難易度調整
- 空欄数で調整
- 例:入門:40、初級:45、中級:50、上級:55
- 統計的には妥当
- 人間的な難易度感覚とは異なる問題が生成されてしまう
- 空欄数が少なくても、ヒューリスティックに解けないと難しい問題と感じてしまう
- ヒューリスティックに解けるかどうかも考慮
- 入門・初級問題は基本テクニックだけで解けるもの
- 中級は実装済ヒューリスティックな解法で解けるもの
- 上級は実装済ヒューリスティックな解法で解けないもの
- 概ね人間的な難易度感覚と一致
まとめ・今後の課題
- cocos2d-x/C++ により数独アプリを実装・リリースした
- さくさく数独 for Windows
- SakuSaku Sudoku for Android
- 問題自動生成により、入門~上級の千問の事前生成された問題・リアルタイム生成問題を用意
- C++/ビット演算により高速な処理を実現
- ヒューリスティックな解法実装は工数が多く、未実装なものが多い
- そのうち全部実装したい
- 16x16 や、その他のバリエーションも実装してみたい
Sudoku Programing
By Nobuhide Tsuda
Sudoku Programing
Sudoku Programing
- 2,303