第6講 数独自動生成アプリVer.1の開発
第8話 ハイブリッドと解答を作ってから問題を作るの速さ比較
数独自動生成アプリVer.1(ハイブリッド方式)のコード例
Private Sub CommandButton1_Click()
CommandButton2_Click
n = 9
hnt = Cells(4, 14) 'ヒント数
Dim ty As Byte
ty = Cells(5, 14) 'タイプの取得 0:非対称 1:上下対称 2:左右対称 3:点対称
hj = Timer
Dim ks As Long '試行回数をカウントする変数
ks = 0
Do While 1
Select Case ty 'シートのO5で指定しているタイプを選択
Case 0
hitaisyou '非対称座標作成
Case 1
retutaisyou '上下対称に生成させるための座標作成
Case 2
gyoutaisyou '左右対称に生成させるための座標作成
Case 3
tentaisyou '点対称に生成させるための座標作成
End Select
syokika 'm(i, j),rlst(i, j, k),cnを0に初期化、cnは生成した数独をカウントする変数
cpy 'fにおいて座標が壊されてしまうので、座標を複写
md = 2 'nyuryokujunで新しい座標を作成させて、探索範囲を80までにする
cn = 0
f (0)
gcpy 'fにおいて座標が壊された座標を復元
dainyu 'fによって全体リスト構造解析が壊されているので、再代入して再度全体リスト構造解析を行う
md = 1 'nyuryokujunで新しい座標を作成させて、探索範囲を80までにする
f (hnt) '問題を解かせる
ks = ks + 1 '試行回数をカウント
If cn = 1 Then '唯一解である場合
hyouji1 '問題の表示
hyouji '解答の表示
Cells(10, 15) = "適切な数独です。"
Exit Do '適切な数独が見つかったのでDo文を強制的に抜ける
End If
Loop
Cells(7, 15) = "数独生成にかかった時間は"
Cells(8, 15) = Timer - hj
Cells(9, 15) = "秒です。"
Cells(11, 15) = "試行錯誤回数は"
Cells(12, 15) = ks
Cells(13, 15) = "回です。"
End Sub
以下は同じ
参考ダウンロード添付ファイル
実行結果はなどで数回の実験では甲乙がつけられないようですから、
やはり、数万回の実験が不可能であるにしても、
百回程度の実験は必要でしょう。
そこで、実験ファイルを添付しておきます。
ハイブリッド方式
解答から問題を作る方式
ハイブリッド方式の実験結果
解答から問題を作る方式の実験結果
ヒント数27で点対称の百回の実験結果は、
平均時間も平均試行錯誤回数もハイブリッド方式が圧倒しました。
やはり、ヒント数27以下では、
問題を作ってから解いた方が速いようです。
ですが、それでも平均5.4秒はかかりすぎです。
数独自動生成新方式アプリ(ハイブリッド方式)Ver.3
の平均作成時間が0.99秒でしたから、
改善が必要ですが、
理詰め解法エンジンを掲載すればより早く生成できる可能性もありますので、
とりあえずは第6講は終了して、
第7講以降で理詰め解法エンジンの研究を始めます。