第6講 残された課題の解消とマルチスレッド化
第9話 お詫び
ながらく更新が止まっていたことについてお詫び申し上げます。
2つの謎が解けずに時間だけが過ぎていきました。
謎の1つは、シングルバージョンでは試行錯誤法で数独を自動生成しているのに、
ことごとく理詰めで解ける数独を生成しているという現象が起きていたことです。
もう1つの謎は、シングルスレッドバージョンを利用してマルチスレッドバージョンを作ったのに、
シングルバージョンとは逆でことごとく理詰めだけでは解けない問題を生成しているという
不思議な現象が起きていました。
シングルではヒント数が多めに設定してあって、
それで唯一解の数独を作れば理詰めで解けていただけということがわかりました。
シングルでもヒント数を24辺りまで減らすと、
理詰めで解けない問題を7題に1題ぐらいの割合で生成していることがわかりこちらは
比較的早い段階で謎を解明することに成功していました。
ところが、
マルチスレッドの場合どのような工夫をしても理詰めで解けない問題を生成し続けました。
ヒント数24でも理詰めで解ける15回に対して、
理詰めで解けないが2回程度にまで行ったことがありました。
このときはシングルの方は100%理詰めで解ける問題のみを生成していると誤解していましたから、
15vs2 で充分な成績を収めていたのに、
改良を続けて0対20になるなどいじればいじるほど悪くなったりしました。
いくら工夫を凝らして取り組んでも15vs2 を再現することができませんでした。
前にも説明しました通り理詰め解法エンジンを搭載していない段階では、
17回の内15回の成功を収めれば、
VBAに理詰めで解けるか解けないかを判定させ、
解けなければ再度C++30スレッドプログラムに数独を生成させればよいことに、
気が付いていなくて15vs2でも不十分だと思い込んで、
改良を続けて結果が悪くなったり、少し改善される程度の毎日を過ごしてきました。
あせればあせるほど正解から遠ざかっていったのです。
ところが、コードを見ていて考えられないミスを発見しました。
if (mondai[a][s + (j / 3)][t + (j % 3)] == 0) {と記述されるところが
if (mondai[s + (j / 3)][t + (j % 3)] == 0) {
となっていたのです。これは大きなミスで
の場合のように
とこのコードには問題がありますよと指摘されるレベルの大きなミスで
ここに赤い四角が表示されるはずなのに何も表示されず、
デバッグエラーまたはビルドエラーも起こさないのです。
赤い四角がある場合デバッグエラーしますよね。
プログラミング35年の中でデバッガがミスを見落とす現象に初めて遭遇していたのです。
前話のコードをコピペするか、
テキストファイルを開いてif (mondai[a][s + (j / 3)][t + (j % 3)] == 0) {の[a]を削って実験してみてください。
も表示されないし、デバッグの開始をすると
と起動してしまうのです。
100%デバッガを信頼していたためにミスの原因に気が付かなかったのです。
昨日敗北宣言を出して講義をやめてしまおうと考えていたところ、
ついに第2の謎を解明することに成功したのです。
成功したソフトの圧縮ファイルを載せておきます。
圧縮ファイルを解凍する場所は『C:\』にしてください。
圧縮ファイルを解凍した人には必要のないファイルですが、
念のためにエクセルファイルも載せておきます。
どうしてエクセルファイルを載せるかと申しますと、
これから開発して行く理詰め解法エンジンがエクセルファイルの中に搭載されているからです。
ですから、私の更新が待てない方はVBAコードを見て30スレッド数独自動生成ソフトを開発してください。
ここで第6講は終了として、
問題配置の左右対称形・上下対称形・点対称形・上下にも左右にも対称(線対称にして点対称と同じ)・こころ型
の研究を行っていきます。こころだけ型の漢字を使っていますが、理由はありません。ただの気まぐれです。
第8話へ 第7講第1話へ
トップへ