第8講 配列の学習
第10話 時間計測
ところで、n=5だとプログラムが正常に動いているか分かりません。
そこで、さらにコードを次のように変更してみましょう。
Private Sub CommandButton1_Click()
Dim i As Byte, j As Byte, k As Byte, a(10, 10) As Byte, h As Byte, n As Byte
n = Cells(5, 12)
For i = 0 To n - 1
For j = 0 To n - 1
a(i, j) = Int(n * Rnd) + 1
Cells(7 + i, 2 + j) = a(i, j)
h = 1
If j > 0 Then
For k = 0 To j - 1
If a(i, k) = a(i, j) Then
j = j - 1
h = 0
End If
Next
End If
If h = 1 Then
If i > 0 Then
For k = 0 To i - 1
If a(k, j) = a(i, j) Then
i = i - 1
h = 0
End If
Next
End If
End If
Next
Next
For i = 0 To n - 1
For j = 0 To n - 1
Cells(7 + i, 2 + j) = a(i, j)
Next
Next
End Sub
参考ファイル5
変更箇所は
Cells(7 + i, 2 + j) = a(i, j)
一カ所のみです。
薄くなっているのはVBAが稼働しているためです。
一瞬の画面を捉えていますが、
参考ファイル5
を開いてマクロを実行してみれば分かりますように、
激しく数字が動いています。
つまり、途中経過が見えるようにしたのです。
実は、皆さんに試して頂きたいのはn=4の場合です。
Cells(7 + i, 2 + j) = a(i, j)
がなかったときは
は一瞬で打ち出されましたが、
途中経過が見えるように変更した方は、終了までかなりかかってしまっています。
時間を計測するために、参考ファイル4とファイル5
をそれぞれ次のように変更して、
Private Sub CommandButton1_Click()
Dim i As Byte, j As Byte, k As Byte, a(10, 10) As Byte, h As Byte, n
As Byte, hj As Variant, ow As Variant
n = Cells(5, 12)
hj = Timer
・・・
ow = Timer
Cells(6, 16) = ow - hj
End Sub
参考ファイル6 ファイル7
Timerは現在の時刻を返してくれるものです。
Dim hj As Variant, ow As Variant
Timerつまり現在時刻を入れる変数はバリアント型です。
バリアントか型はVBが扱う変数の中でも最もメモリーを食う変数で、
万能タイプです。つまり、何でも収納することができます。
プログラムの作動時間を計るには
hj = Timer
・・・
ow = Timer
Cells(6, 16) = ow - hj
とすれば良いことを覚えてください。
処理時間が約300倍もかかっています。
第8講第1話でなるべくCellsは使わない方が良いと書きましたが、
その意味がお分かりかと思います。
尚、実験結果は毎回異なります。
ランダムに数字を入れていますので、
すぐに答えにたどり着く場合もあれば、
なかなかたどり着けない場合もあるのです。
ですから 参考ファイル6 ファイル7においても
速度差が1000倍を超える場合さえあります。
5行5列1ブロックでさえ歯が立たない!
ですから、9行9列9ブロックの本来の数独では
スーパコンピュータでさえ歯が立ちません。
数独自動生成など夢のまた夢でしょうか。
そうではありません。
ファイル6のやり方では歯が立たないだけです。
私の開発した
良問難問数独自動生成アプリVer.3(非対称形)
良問難問数独自動生成アプリVer.4(対称形)
を開いて実行してみてください。
設定ヒント数とCPUの能力にもよりますが、
ヒント数23ぐらいなら数秒で良問を作成してしまいます。
良問というのは、試行錯誤法=トライアンドエラー=仮定法=背理法を
一切使用しないで、理詰め(確定法)のみでとけるということです。
2つのアプリは、確定法のみで解ける良問を100%の確率で生成します。
そして、このサイト=魔方陣 数独で学ぶ 初心者のための vba 入門
の目的は、皆さんに数独自動生成アプリを開発して頂くことなのです。
是非とも2つのアプリを改良して、
ヒント数17であっても瞬時に作れるアプリ=ソフトを開発して頂きたいのです。
研究が進むなら、まだ解明されていない問題、
例えば最小ヒント数問題も解明できるでしょう。
また、
新次元難問数独自動生成ソフトVer.1
も参照してみてください。
こちらのソフトは残念ながら、4題に1題の割合で
理詰めのみでは解けない問題も生成してしまいますが、
速度の点では先の2つのソフトを上回ります。
では、数独自動生成に近づくのはいつでしょうか。
予定では第11講プロシージャの再帰的使用の応用においてです。
初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門
数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ