第14講 末項確定法による魔方陣自動生成ソフトの高速化
第3話 時間計測を加えて改善効果を確認する


魔方陣自動生成ソフト改良その1ファイルも次のように変更します。
Private Sub CommandButton1_Click()
  Dim n As Byte, cn As Integer, x(10, 10) As Byte
  Dim iz(100) As Byte, jz(100) As Byte
  
Dim hajime As Variant, owari As Variant
  Rows("5").Select
  Selection.ClearContents
  Range("A1").Select
  hajime = Timer
  n = Cells(3, 11)
  cn = 0
  Call zahyousakusei(n, iz(), jz())
'  hyouji (n)  '番号付けが上手くいっているかの確認 上手くいっていることが確認できたら'をつけて注釈文に変更する。
  Call f(0, cn, n, x(), iz(), jz())
'  Cells(5, 14) = n   時間計測のため100個で止めるように変更してあるので、総数表示は意味がないので外している。
'  Cells(5, 15) = "次魔方陣は"
'  Cells(5, 20) = cn
'  Cells(5, 23) = "個存在しました。"
  owari = Timer
  Cells(5, 30) = "100個制作にかかった時間は"
  Cells(5, 40) = owari - hajime
  Cells(5, 44) = "秒です。"

End Sub
        ・・・
        ・・・
        ・・・
Sub f(g As Byte, cn As Integer, n As Byte, x() As Byte, iz() As Byte, jz() As Byte)
        ・・・
        ・・・
        ・・・
'  ii = Int(n * n * Rnd) 時間比較のためにランダム要素を外している。
'  If n = 4 Then kk = 7
'  If n = 5 Then kk = 24
'  If n = 6 Then kk = 13
'  If n = 3 Then kk = 1

  For i = 0 To n * n - 1
'    iii = (ii + kk * i) Mod n * n 時間比較のためにランダム要素を外している。
'    x(gi, gj) = iii + 1
    x(gi, gj) = i + 1

    h = 1
    If g > 0 Then
        ・・・
        ・・・
        ・・・
    If h = 1 Then
      If g + 1 < n * n Then
        Call f(g + 1, cn, n, x(), iz(), jz())
        If cn = 100 Then Exit Sub '100個できた段階でプログラムを止めている。
      Else
        For j = 0 To n - 1
          For k = 0 To n - 1
            Cells(7 + j + (n + 1) * s, 2 + k + (n + 1) * a) = x(j, k)
          Next
        Next
        cn = cn + 1
        If cn = 100 Then Exit Sub '100個できた段階でプログラムを止めている。
        ・・・
        ・・・
        ・・・

参考ファイル
時間計測版魔方陣自動生成ソフト
時間計測版改良その1ファイル

実験結果
改良前
改良前

改良その1
新
たった1カ所改善しただけで、約4/11もの短縮効果が生じています。

第2話へ 第4話へ



トップ

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

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