第18講 一般種法×末項確定法(魔方陣作成マクロVer.4)への挑戦

第6話 予想外の展開
解説の途中でしたが、予想外の展開がありました。
それは、いよいよ一般種法の改良の取りかかろうとして、
Private Sub CommandButton1_Click()
  Dim i, j As Integer
  n = Cells(3, 8)
  Rnd (-1)
  syokika
  zhy
  zhy1 (0)
  'zhykakunin
  ms (0)

End Sub
と一カ所だけ変更して、試しに実行ボタンを押すとなんと6次魔方陣がVer.3の10倍以上の速さになっていたのです。
まだ、本体部分Subプロシージャのmsを何もいじっていないにもかかわらずです。
想定していなかったとはいえ、
よく考えてみると当然の展開です。なぜなら、

10 11
12 13
14 15



4
10 11
12 13 14
15 16 17 18
19 20 21
4 22 23 24





















10 12
11 14
13 15



4
10 11
12 15 16
13 17 19 20
14 21 23
4 18 22 24





















はy、はxに、ピンクはiに対応)
の2つの番号付けはどちらが有利か明らかです。
上の番号付けの場合、5次魔方陣を例にとるなら、
19まで来た段階で列(縦)合計が5次魔方陣の列や行などの合計である65になっていない場合、
12まで遡ってやり直さなければならない可能性があるのに対して、
下の番号付けの場合14から最大12まで遡ればよいのです。
19→12と14→12では場合の数が比べものにならないぐらい小さくなるます。
上の番号付けの場合、行合計に対しては有利であるのに対して、
列に関しては、非常に迂遠です。
それに対して、行と列を交互に行く下の番号付けは行と列に対して比較的公平になっています。
それが大きな違いの原因になっています。
皆さんも、
Private Sub CommandButton1_Click()
  Dim i, j As Integer
  n = Cells(3, 8)
  Rnd (-1)
  syokika
  zhy
  zhy1 (0)
  'zhykakunin
  ms (0)

End Sub
に変更して、速さの違いを体感して下さい。
もちろん、Subプロシージャmsを一般種用に変更すれば、
さらに、数十倍から数十万倍ほど速くなります。





第5話へ 第7話へ

004
  

VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ

数学研究室に戻る