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 や、その他のバリエーションも実装してみたい
Made with Slides.com