解法アルゴリズム
□ 用語とデータ表現
<<用語> ・マス :9x9に区切られた81個の領域のひとつひとつ
・行 :横1行
・列 :縦1列
・ブロック:3x3に区切らてた小さな仕切り
・タップル:行、列、ブロックを総称して扱うときの呼称
・ヒント :問題の初期値として与えられた数字とその位置
各々のマスには、そのマスに可能性のある数字のリスト(候補リスト)を保持する。
マスの数字が確定するにしたがって、候補リスト内の数字は絞られていく。
・内部形式
1ー9の数字をビット位置で表す。候補リストはこれらのビット位置
ORで表現する。
”1”...0x01 ”2”...0x02
”3”...0x04 ”4”...0x08
”5”...0x10 ”6”...0x20
”7”...0x40 ”8”...0x80
”9”...0x100
{1,3,9}という候補リストは、0x105となる。
・アドレス表現
i行、j列のマスを(i,j)であらわす。
・確定処理
あるマス(i,j)の数字が確定した場合、関連するマスの候補リストから確定
した数字を消去し、マス(i,j)の確定処理済表示(最上位ビット)をオンに
する処理をいう。
関連するマスとは、i行に含まれるマス、j列に含まれるマス、(i,j)を含
むブロックのマスである。
・(あるマスの)ビット数
候補リストの要素の数は、内部表現のビット数に等しい。例えば上記の候補リス
トの内部表現0x105のビット数は3である。特に、
ビット数=0のマスは候補リストが空集合を意味しており、ナンプレ問題と
しては不適切と判断できる
ビット数=1のマスは候補リストの要素が1つしかないので、マスの数字が
確定したことを意味する
□ A1:通常のアルゴリズム(探索をベースとした)
探索をベースとした試行錯誤のアルゴリズムであるため、どんな問題でも解くこと
ができる。問題を解くだけの目的であれば、このアルゴリズムで十分と思われる。
(0)初期値の設定
各マスの0x1ffを設定する(1−9のすべての数字を候補リストに)
ヒントで指定されたマスに該当のビットを設定する
以下の(1)−(3)は再帰呼び出しの処理となっている。
(1)全マスをスキャンして最小のビット数(m)とそのマスの位置をもとめる。
ただし、確定処理済のマスは対象外とする。
(2)上記の結果、すべてのマスが確定済の場合は、解がひとつ得られたので、
もし、既に解が得られていれば、重複解のエラーで終了する。
これが、最初の解であれば、この解を覚えておき、次の解を探す。
(エラー復帰する)
(3)上記の結果、最小のビット数(m)に応じて以下の処理を行う。
m=0であれば、解なしのエラーでリターンする。
m=1であれば、そのマスを確定処理を行い、次のマスを決定するため、
再帰的に(1)をcallする。
m>1の場合、 候補の数字は複数あるので、そのなかの数字をひとつ選
択して、確定処理を行い再帰的に(1)をcallする。
再帰呼び出しが重複解エラーで復帰した場合は直ちに復帰
する。そうでない場合は、次の数字を選択して同様の処理
を繰り返す。
すべての数字の処理が終了した場合は復帰する。
□ A2:確定的アルゴリズム(経験的アルゴリズム)
ナンプレ問題を解く技そのものです。技自身は、発見的アプローチであるため、網
羅性に不安がのこります。
A2−1:Sbitサーチ
ビット数が1のマスがあれば、そのマスの確定処理を行う。
ビット数が0のマスがあれば、解なしであるので処理を終了する。
A2−2:Ubitサーチ
ひとつのタップルに着目したとき、あるマスにしか現れないビットがあれば
そのマスをそのビットに確定する。下図の例ではGのビット位置がUbit
となっているので、マス1は010000000(0x80)に確定する。
HGFEDCBA@ <−−ビット位置
マス1:011000111
マス2:101111011
マス3:001001110
マス4:100001101
マス5:001110011
マス6:101010100
マス7:000011111
マス8:000100100
マス9:000011111
A2−3:InterSection
交差する2つのタップル(ex.行とブロック)の関係に着目する。
+−−−−−+−−−−+
| a | c | タップル1の構成は、a,c
+−−−−−+−−−−+ タップル2の構成は、b,c
| b |
| |
+−−−−+
あるビット位置(数字)の出現パターンとその対処
a c b
(1) 1 1 1
(2) 1 1 0 −−> aの部分の1を0にする
(3) 1 0 1
(4) 0 1 1 −−> bの部分の1を0にする
(5) 1 0 0 −−> 解なし
(6) 0 1 0
(7) 0 0 1 −−> 解なし
(8) 0 0 0 −−> 解なし
A2−3:E(n) n=2−4
あるタップルt内のnケのマスのORをとったものをEとし、Eのビット数を
mとする。
m < n :解なし(nケのますより候補のリストの要素がすくない)
m = n :これをEnclosure(n)と定義する。
この場合、タップルt内の他のマスにあるEのビットをすべて
0にしてよい。
m > n :Enclosure(n)は成立していない。
例題
HGFEDCBA@ <−−ビット位置
マス1:011000111
マス2:101111011
マス3:000001110
マス4:000001100 マス3、4、7のORをとると0x0eと
マス5:001110011 なり、Enclosure(3)が成立している
マス6:101010100
マス7:000001010
マス8:000100100
マス9:010011111
Enclosure(3)の処理でビットが0になる部分は
以下の*の部分である。
マス1:011000**1
マス2:10111*0*1
マス3:000001110
マス4:000001100
マス5:0011100*1
マス6:101010*00
マス7:000001010
マス8:000100*00
マス9:01001***1
上記の結果、マス8ではSbitが成立する
A2−4:X(n) n=2−4
あるタップルt内のnケのビットに着目する。nケのビットのいずれかを持つ
マスの数をmとする。
m < n :解なし(nケのビットをもつ候補のリストの要素がすくない)
m = n :これをExclosure(n)と定義する。
この場合、該当するマスの他のビットをすべて0にしてよい。
m > n :Exclosure(n)は成立していない。
例題
HGFEDCBA@ <−−ビット位置
マス1:011000111
マス2:101111011
マス3:000001110
マス4:000001100 ビットH,G,Fに着目すると、マス1,
マス5:000110011 マス2,マス6のみが該当する
マス6:101010100 n=3,m=3なので Exclosure(3)
マス7:000001010
マス8:000100100
マス9:000011111
Exclosure(3)の処理でビットが0になる部分は
以下の*の部分である。
マス1:011000***
マス2:101***0**
マス3:000001110
マス4:000001100
マス5:000110011
マス6:1010*0*00
マス7:000001010
マス8:000100100
マス9:000011111
上記の結果、マス3,4,7でEnclosure(3)が成立する
(補足)
EnclosureとExclosureの関係は縦と横が入れ替わったようなものです。
A2−5:Negation − 背理法
ある任意のマス(P)の候補リストをmとする。mから1ビット(=a)落と
した候補リストを~aとする。
「マス(P)を~aに置き換えて上記のアルゴリズムA2−1〜A2−4を適用
したとき、解なしという結果がえられた」
とするとマス(P)は aに決定してよい。(解があるとしたらaしかない)
例えば、m=0x29とすると
a=0x20 −> ~a=0x09
a=0x08 −> ~a=0x21
a=0x01 −> ~a=0x28
を順に解なしの結果がえられるまで調べていけばよい。
(補足−1)
上記のアルゴリズムの結果を整理すると
解なしという結論がえられない場合 : 解が複数存在する
解なしという結論が複数ある場合 : 解が存在しない
(補足−2)
マス(P)は任意に選ぶことができるので、なるべくmのビット数が少ない
位置を選ぶのが効率がよい。
A2−6:試行錯誤 (最後の砦)
上記のいずれでも解がえられない場合、試行錯誤的に解をさがす方法がある。
A2−5とA2−6の相違は、A2−5は再帰的ではない点にある。一方、
A2−6の本質は、再帰的に探す部分にある。
□ Rank − 難易度
A2−1は一番簡単であり、A2−5,6はかなり複雑で難しい。
この確定的アルゴリズムの難しさを使って、ナンプレ問題の難易度を測ることがで
きる。
Rank 表示 説明 解法に必要なアルゴリズム
(1) * 大変やさしい A2−1(Sbit)のみ
(2) ** やさしい A2−2(Ubit)まで
(3) *** 普通 A2−3 (InterSection)まで
(4) **** ちょっと難しい A2−4(E(2),X(2))まで
(5) ***** 難しい A2−4(E(3),X(3))まで
(6) ****** 難しい A2−4(E(4),X(4))まで
(7) ******* 大変難しい A2−5(Negation)まで
(8) ******** 超難問 A2−6(試行錯誤)まで
Rank(8)が存在するかどうかが興味深いところであるが、現時点(99.08.12)
では見つかっていない。
□ 確定的アルゴリズム仮説
まず、A2−1〜A2−5を整理する。
EnclosureをE(1)−E(8)に拡張し、Sbit,Ubit,X(n)
を包含する。
Sbit :E(1) これは自然な拡張
Ubit :E(t−1) tはタップル内の要素の数
X(n) :E(t−n) tはタップル内の要素の数
Ubit,X(n)は、アルゴリズムの説明の例題をよく見て理解してください。
InterSectionは、Negationにふくまれる。これは、InterSectionで消すことのでき
るビットはNegationでも消すことができるので問題ないでしょう。
以上により、A2−1〜A2−5は、以下の2つの操作に集約できる。
・Enclosure
・Negation
現時点では、A2−6を必要とする問題は検出されていないので、以下の仮説を
提案する。
仮説
「すべてのナンプレ問題は、EnclosureとNegationの操作を
繰り返し適用することにより解くことができる」
この件に関して、反例・完備性の証明等の情報がありましたらお知らせください。