2009年8月24日月曜日

(39) アート・ナンプレの提唱

 SUDOKU_Ver20 では、16×16 (block 4×4)サイズ数独を作成した。このとき、さらに大規模な 25×25 (block 5×5) の数独、更に大きな数独にも対応できるように、Sheet の割り振りを考えていたので、SUDOKU_Ver23 (25×25 対応)は、マクロ group_search を変更するだけで、簡単に作成できた。



 さらに、変形block ナンプレ、12×12 (Block 3×4 )や28×28 (Block 4×7)もマクロを一つ変えるだけで難なく作成することができた。(SUDOKU_Ver24)

 大規模数独になると、問題を解く手順や解法を見つける楽しみにもまして、根気や忍耐力で問題に取り組み、やり遂げる達成感というより、苦しみと戦うマゾ的 要素が加わる。パソコンソフトでなら何でもないことが、人間が取り組むとなると莫大な時間と強靭な気力が必要になる。逆に、コンピュータで解くには多少の物足りなさを感じる。

 問題を作る方も大規模数独となると大変なのであろうと推察する。(作ったことがないからわからないが) 数独問題の唯一解の特性だけを考慮すれば、ある問題では、第一手から final answer に至るまでの各ステップが問題になりえる。また、一つの問題でも、数字交換(1から9までの数字を交換する方法、これだけでも 9! 通りの同じ問題ができる)、Block 毎の行交換、列交換、各行または各列の Block 内交換、さらには8種類の対称交換(後述)を行っても、問題の本質は変わらないから事実上無限個の同一種類の問題が存在する。

 このようなことを考えながら大規模数独の面白さを引き出すひとつの方法として、「アート・ナンプレ」というのがあったら面白いのではと思った。ニコリ社の数独では、数字の配列が対称であることというのを特徴にしているようだが、ナンプレの問題での数字の配置が何かの形をなぞらえていたり、final answer の状態での数字の配列が「お絵かきロジック」のように、アートになっているといった類のものである。数独の新しい分野として考えられるのではないかとおもった。詰将棋の分野でも、手順を楽しむのと別にその奇抜な形の不思議を楽しむのがあったように記憶している。

2009年8月20日木曜日

(38) 難易度レベルと脳力シミュレーション

 SUDOKU_Ver.21 はVer.18 の改変し、いくつかの新しい機能を追加した。
 まず、空白セルの数字が決定される毎に、計算時間( elapse time )をアウトプットするようにした。同時に使用した探索法も分かっているので、パソコンでの使用時間と関連づけて、数独を人間が解くに要する時間により脳力シミュレーションができないかと考えた。例えば、Pサーチは1.0、Mサーチは1.5、Gサーチは4という風に重みをつけ、人間の解く時間とそのプロセスを比較すれば、何らかの脳力検定ができるのではないかということである。

 このソフトでは、数独問題を途中人の手を介さず、自動連続計算することにしているので、計算結果の一覧表を Sheet 3  に表記するように、 arrangement_result_to_sheet3 のマクロを新設した。また、一問別の計算結果情報(計算過程の手順など)を一枚のシートに移す transfer_arranged_data マクロを追加した。

 数独解のプロセスとElapse time を示すグラフを追加した。このグラフより、問題を解く過程における問題の特性(解き味?)が一目瞭然とわかる。

 数独問題のレベルと探索法との関係がわかるレベル評価の方法を模索した。今のところ使用できる探索法は限られているので( P, S, G, Q, M, C, V, X ) 、Aサーチの回数を表わす klevel  の値により、例えば klevel=0 の場合は、「Easy」とし、klevel<=2 の場合、「Medium」のように、6段階に分けた。

2009年8月18日火曜日

(37) 大型数独への展開 (16×16 数独)

 先に購入した雑誌「ナンプレ・ファン」には、9×9 の数独(ノーマルナンプレと呼ぼう)の他に拡張したナンプレ(16×16 や 25×25 )問題が掲載されている。SUDOKU_Ver19 では、16×16 ナンプレ専用のプログラムを考えてみた。

 コンピュータ・ソフトの特徴は、大規模化にもかかわらず、正確さと計算時間が人間の能力をはるかに上回るその馬鹿さ加減にある。アルゴリズムは同じなのだから、簡単に大規模化には対応できるものであると考えてやってみた。

 実際には、簡単に拡張ソフトにはすることができたが、そのソフト自体の設計およびアルゴリズムの特徴により細かいところで、いくつかの変更を必要とした。これは、最初からこういう事態を想定していなかったための問題に起因するもので、アルゴリズムが違えばもっと手数は掛からないのかもしれない。

 (1) 計算はSheet 1 の A画面 とのやり取りから始まる。A画面の拡張により、candy_table の表示部分を移す必要があった。
 (2) 問題の入力(Sheet 3)におけるセルの調整。
 (3) 解答の表示場所を新たに確保すること。 などである。
 (4) 探索マクロは、1から9 を 1から Z に変更し、Z=16 をSheet 1 のインプットで与える。これで、Z=25 にも対応できる。今回の拡張では、さらに大規模のものまで対応できるように考慮した。
 (5) 特に、Aサーチの new_class_search では変更箇所が多く面倒であった。
 (6) 当然、group_search や iblock_search なども範囲の拡大をおこなった。

 今回の拡張で、セルの番地 ( i , j ) の取り出しで新しいマクロ row_column_number を作成した。このマクロを使えば、81×81 ナンプレまで対応できる。つまり、9×9 は一桁で済んだが、二桁になるとちょっと取り出すのに工夫がいるので、その簡単なマクロを下に示そう。

 Sub row_column_number()
If Len(cc) = 5 Then
aa = Int(Val(Mid(cc, 2, 1))) : bb = Int(Val(Mid(cc, 4, 1)))
ElseIf Len(cc) = 6 Then
   If Mid(cc, 3, 1) = "," Then
 aa = Int(Val(Mid(cc, 2, 1))) : bb = Int(Val(Mid(cc, 4, 2)))
   ElseIf Mid(cc, 4, 1) = "," Then
 aa = Int(Val(Mid(cc, 2, 2))) : bb = Int(Val(Mid(cc, 5, 1)))
 End If ElseIf Len(cc) = 7 Then
 aa = Int(Val(Mid(cc, 2, 2))): bb = Int(Val(Mid(cc, 5, 2)))
Else MsgBox ("Banchi is mismatching!")
End If
End Sub

 番地から、行・列番号が必要なときには、次のように使う。
  row_column_number
i=aa : j=bb

100×100 ナンプレにも同じようなマクロが作れるが、まだ試してはいない。
49×49ナンプレはその後問題があったので、解いてみたがインプットに時間が掛かる割には簡単にとけた。一般に大規模ナンプレはPサーチだけで解ける簡単な(コンピュータには)問題が多いようだ。人間には手に負えないというか忍耐力だけを試すことになってしまうためなのか。

2009年8月17日月曜日

(36) Ver.18 で大改造する。

 SUDOKU_Ver18 でプログラムの構成方法とマクロの組み立てを大幅に改変した。大きくは、探索方法の種類が増えたこと、その役割が何となくはっきりしてきたからである。

まず、 part_search_table を廃止して、 candy_table のみとする。流れとしては、(A) candy_table の後、P, M, S, Q, V, などのサーチをする。 (B) refine_candy_table の後の P, S, Mサーチ(PR,MRなど) (C) two_candidate_search (A サーチ ) といった流れとなる。

 数独の解法の過程を考えてみると、空白セルの数字を決定するのは、あくまでも基本サーチだけである。その他のサーチでは、「候補になる可能性がない」ことにより候補から外されるだけで、結果として、その影響により、他のセルの候補の数字が single candidate になり、基本サーチにより数字が決定される。つまり、基本サーチ以外の探索法では、candy_table を書き換えて、 refine_candy_table を作るだけのことである。このことは、マクロの書き方にも関係してくることである。今のやり方では、これまでに決定された数字を含めた A画面より candy_table が作られる。もし、refine_candy_table のあとの基本サーチでA 画面が変わらなければ、折角のサーチが無駄になってしまうのだ。

 もう一つの大きな改変は、candy_table を作るとき、各blockのなかで、空白セルの数字の数(anum) を探すやり方で candidate をさがしていた。新しいやり方では、数字(numb)を1から9まで回して candidate を決定する方法である。この方法の採用により、計算時間は大幅に短縮された。

2009年8月10日月曜日

(35) 探索法の表示方法

 数独を解くにあたって、どのセルから、どの数字が、どのような順番で満たされていくのか。またそれは、どのような探索法を使えばよいのかが分かればよい。数独のどの本にも、最終結果(以後 final answer と呼ぶ。)は示してあるものの、それにいたる途中経過が示されていないので、行き詰まったときどのような手順を使うのかがはっきりしない場合がある。そこで、VBAソフトでは、決定される順にその探索法をアウトプットできるようにした。

 数独の解法は山に登るのと同じで、いくつかのルートがある。人間が解くのと同じとは必ず一致するものではないが、ソフトで求めた一つの手順があれば、それを参考にして人間が解く段階で行き詰ったときには「次の一手」を示すことが出来る。その論理は、コンピュータの手順と人間のそれまでの決定セルを比較して、コンピュータの手順に初めて表れる未決定セルが「次の一手」となる。

 ソフトで手順を示すには、基本サーチを徹底的に検索する。しかる後、V, G, Q などのサーチを使うのだが、これらは基本サーチではないので、このサーチを行った後、また、基本サーチを繰り返せばよい。具体的には、基本サーチ ”B” では、
   sch=""
   extra="B"
とおき、  sch=sch & extra  をループの中にいれる。 結果、”B" は最初の Bサーチで求まったもの、さらにその結果を使って、求まったものは、”BB" をなる。

さらに、基本サーチ以外では、そのサーチ・マクロを通ったとき、 sch="V" のようにする。その結果、
基本サーチの ”L” で求まると ”VL" のように、表記される。これらの表示はその決定されたセルと数字とともに、決定順にカウントされ、アウトプットされる。

2009年8月7日金曜日

(34) 基本系 Sサーチの発見

2006年7月21日(金) イオン旭屋書店にて、「ナンバープレース40号記念号」という数独の雑誌を買った。これを見ていると突然 Sサーチというのを思いついた。これまで漠然と数字を決定するのはPサーチとMサーチの二つの基本系ばかりに目を奪われていたのだが、Block と同様にColumn(列) と Row(行)も同様の役割を果たすのだ。つまりBlock, Column, Row は対等でBlock で考ええる手法はColumn や Row でも同等に成立するし、一つのセルはどのセルも、そしてすべてのセルが、ひとつのBlock , 一つのColumn そしてひとつのRow に属するということである。

目からうろことはこの事か。乙女の姿がよく見るとおばあさんの顔にも見えるという「隠し絵」のように、Pサーチとおもっていたのが、実はSサーチでも解けるということがわかった。(ニコリ数独名品100選
の初級パターン①から⑤は、すべてPサーチであると同時にSサーチでもあるのだ。純粋にPサーチであるのは初級パターン④だけである。)

この発見により、数独の基本手順は4通りに分類できることがわかった。基本系とはその手順だけで、数字が決定する手順のことである。そこで、プログラムの書き換えを行い、かつ探索法の名前の変更をおこなった。
 
 Bサーチ(Pサーチ) あるBlock の中で入るセルが一つしかない数字を探す。
 Lサーチ(Sサーチ) ある 行 の中で入るセルが一つしかない数字を探す。
 Cサーチ(Sサーチ) ある 列 の中で入るセルが一つしかない数字を探す。
 Mサーチ(Mサーチ) ひとつの候補しか持たないセルを探す。

 

2009年8月6日木曜日

(33) Ver.16(ポケット数独)の開発

2006年7月17日(月) 和歌山近鉄百貨店のとなりの本屋で、ニコリ社から最近発売された「ポケット数独」の初級版と中級版を購入、SUDOKU_Ver.16 の新しいシートに入力した。新しい解法として、refine_special_search_table を作成した。数独の解法において著しい進歩があった。

 実際に人間が数独を解く場合どのような順序で探して、考えるのだろうかと思いをめぐらした。初級の問題では、表出数(givens)の多い数字から「平行線の常識」(つまりPサーチ)で single candidate のセルを見つけ、同じ数字をしつこく追いかける。これで初級問題は大体とける。パソコンでは、candy table を作るから、「残り物の常識」(Mサーチ)が一番さきに分かりやすい。これが将来 g_matrix となる。

2009年8月5日水曜日

(32) ナンプレの雑誌・本を買う。

2006年7月15日(土) 本屋に行ったら、ナンプレの雑誌がたくさん並んでいた。そこで「ナンプレ・ファン」という雑誌を買った。通常のナンプレのほかに対角線ナンプレとか幾何学ナンプレとかいう種類のナンプレがあり、どういう風にマクロを変更すればこれらのナンプレに対応できるのかを考えた。

通常のナンプレもファーストステージからサードステージまで、レベルごとのたくさんのナンプレがのっていた。順番に解いてみたが、最初の方は簡単すぎて面白くなかった。

2006年7月16日(日) 本屋さんでまた400円の雑誌をかった。これも簡単すぎて手ごたえがなかった。「MR」と同じような手筋で「PR」というマクロをつくった。これは、refine_search_table の中の single value を抽出するものである。single candidate を抽出する「MR」と対をなすものだと思うが、V, B, Q サーチとの関係を調べておく必要がある。あまりにも多くのアイディアが次から次へと思い浮かぶので整理しておかないと自分でも分からなくなるのではと心配である。

2009年8月3日月曜日

(31) 公開されているナンプレの解法

2006年7月11日 インターネットでナンプレ(数独)の解法なるものを検索した。これまで数独単行本の最初にのっている「解き方のガイド」なるものを参考にしてきたが、できるだけ自力で解法を見つけようとする方針というか性格であるので意識して独創的な解法をめざしてきたのだ。しかし、その解法は見つからないままAサーチに頼るという道を歩み始めた。真似はしなくとも独創性は発揮できることに気づいて、解法を体系的に論じたものがないかと思った。結果はなかった。というか見つからなかった。解法のいろいろな技術的方法は少し形は違うがにたようなものはたくさんあるが、理論的分類のようなのもはみつからなかった。

「ナンバープレース解法教室」(藤原)には一番分かりやすく、解法の種類も豊富である。「平行線の常識」とか解法のネーミングもユニークである。少なくともこれらの解法はマクロに加えるべきであろうと思った。ただし、どれが重要なものか、頻度が高いのかなどは、数独を実際に解いたことのないものにはわからなかった。わたしはいまでも、ほんのビギナーの問題しかとくことが出来ないのである。その理由は自分が一番よく知っている。恐ろしくせっかちで、数独を解く根気にかけているのである。

インターネットでさらに調べると、すでに数独ソルバーなるものはいくつもあるらしい。どんなものか分からないが、連続で全自動というのはないだろうとおもった。現在、開発中のものには、解法とレベルをうまく組合すと、これまでにないユニークな数独ソフトができあがるだろうと楽観した。

和歌山ソフトウエアーコンテストの締め切りまで、あと二ヶ月もあるので、新しい手筋を3つばかりは付け加えるようにしようと決心した。

2009年8月2日日曜日

(30) Aサーチ(仮定法)の候補の選択方法

 Sudoku_Ver.14 において、新しく購入した「激辛1」の衝撃の105問を、Sheet12のインプット・シートとして使う。(isheet) Sheet13 は dsheet (解答シート)とする。

 A サーチは二つの候補を持つセルを選び、そのうちの一つを仮定して先の計算を進める。どちらかが正解なのだが、選びようによっては、また仮定する必要がでてくる。プログラムでは、5階層まで扱えるようにはなっているが、計算時間が掛かったり、答えに至らない場合がある。

そこで、二つの候補をもつセルの選び方を変えてその状況を調べてみた。正回転はBlock 1 から最初に出てきたセルを選択、逆回転とは、Block 9 から逆に探し出したセルから取り出す。中央回転とは、empty_cell の真ん中から最初のものをとる場合である。

 「激辛 Vol.3」の問題を例にとり、試してみた結果は次の通りである。
            正回転     逆回転   中央回転
 問題 32番    47         19      7 
 問題 35番    9          57      52
 問題 44番    27         -      61
 問題 68番    28         -      24
 問題 70番    58         22      29
 問題 80番    31         68      19
 問題 90番    15         80      12
 問題 99番    65         -      60
 問題 100番   -         18      10
 問題 104番   61         25      48
 ここに、「-」は解が得られなかったもの(5階層以上)である。

仮定法において、どのセルの候補を選ぶと効率よく解がえられるかはまだ理論はない。