第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講プロシージャの再帰的使用の応用においてです。

9話へ 第9講第1話へ


トップ

初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門

数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ