解法アルゴリズム


□ 用語とデータ表現

<<用語>   ・マス    :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の操作を
     繰り返し適用することにより解くことができる」

   この件に関して、反例・完備性の証明等の情報がありましたらお知らせください。


Home
Up
Back
Next