第18講 対角線法による魔方陣自動生成速度の1万倍加へ

第9話 最適シード値自動探索ソフト

プログラム例
   ・・・
int cn,n;
int m[10][10]; //少し大きめに配列要素数を取っておく
int y[100],x[100];
clock_t hj,ow;
int main(){
  int i,mn,ik;
  clock_t jk[100];
  for(i=0;i<100;i++){
    jk[i]=0;
  }
  printf("n=");
  fflush(0); //pirntfを先に実行させるためのお呪い
  scanf("%d",&n);
  for(i=0;i<100;i++){
    srand(i);
    cn=0;
    zy();
    hj=clock();
    f(0);
    ow=clock();
    if(cn>0){
      jk[i]=ow - hj;
    }
    //printf("生成された%d次魔方陣=%d\n",n,cn);
    //printf("魔方陣生成にかかった時間は%f秒です。\n",(double)(ow - hj) / CLOCKS_PER_SEC);
  }
  mn=10000;
  for(i=0;i<100;i++){
    if(jk[i]>0){
      printf("%d :%d\n",i,jk[i]);
      if(mn>jk[i]){
        mn=jk[i];
        ik=i;
      }
    }
  }
  printf("最適シード値は%dです。",ik);
}
     ・・・
     ・・・
     ・・・
最適シード値自動探索ソフト

このソフトを6次についても、
実験を繰り返せば、
数分以内で100個を生成してしまうシード値を見つけられるでしょう。
皆さん、実験してみてください。
ただし、探索範囲は0〜99では不十分でしょう。
0〜9999辺りまで広げないと、
発見することは出来ないでしょう。
寝る前にプログラムを走らせておけば、
コンピュータは朝起きたときには、
6次魔方陣を数分以内で100個を
生成してしまうシード値を発見していることでしょう。

魔方陣自動生成については、
後の講でも何回も取り上げます。
最終的には、100次魔方陣も数分以内で、
100個生産できるようになるでしょう。
もちろん、現Ver.2では、
宇宙時間(宇宙の始まりから終わりまでの時間)かけても、
100次魔方陣は1個も生成できないのは確実です。

第18講にはまだ宿題が残されていましたね。
第10講第9話のように、
すべてローカル変数に変更してください。
グローバル変数は、プログラムが稼働いている間、
使っていようといまいとメモリ上に常駐していて、
メモリを無駄遣いしていますから、
なるべくグローバル変数は用いない方がよいのでしたね。
mainですべて宣言して、
引数で渡すと記述少し複雑になりますが、
ここまでついていらっしゃった皆さんなら、
余裕で出来るはずですよ。

講義を進めている内に、
最適シード値自動探索ソフト
が6次魔方陣の最適シード値を見つけたようです。
10 35 31 08 01 26
24 17 09 28 13 20

16 04 19 34 36 02
05 30 06 15 22 33
29 17 21 03 27 14
11 07 25 23 13 32
26 35 31 08 01 10
24 18 09 28 12 20

生成された6次魔方陣=10
魔方陣生成にかかった時間は6.430000秒です。


でも、そのシード値は皆さんが究明してください。
探索範囲は、0〜99で十分でした。



第8話へ 第10話へ

a


初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座

初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ