next up previous contents
Next: 付録C サーチアクセスプログラム Up: 無題 Previous: 付録A パターン作成プログラム

付録B パターンの内積値計算・変更プログラム

 

#include <stdio.h>
#include <math.h>

double drand48();

#define PN 4 /* パターン数 */
#define N1 10 /* 縦または横の数 */
#define N2 N1 /* 同上 */
#define HENKO_MAX 1000000 /* 変更する最大回数 */

main(argc,argv)
     int argc;
     char *argv[];
{
  
  FILE *f,*fs;/* f:読み込み, fs:書き込み ファイルポインタ */
  int P[PN][N1][N2];/* パターン配列 */
  int sum[PN-1][PN];/* 相関内積 */
  int cho,cho_0;/* パターン変更変数 */
  int ran_n;/* 乱数初期値 */
  int nai_cho;/* 直交数 */
  int nai_max;/* 最大内積値の設定 */
  int n_m_over;/* 最大内積値の有無の判定用変数 */
  int i,j,k,k1,k2,x;/* その他の変数 */
  static int l,n;/* 同上 */
  static int nai_kaki;/* 内積値ファイル書き込み判定 */
  double nai_h_max;/* 最大平均値の設定 */
  double nai_h_min;/* 最小平均値の設定 */
  double n_h_over[PN];/* 範囲外の平均値の有無の判定用変数 */
  char fname[50];/* ファイル名 */
  
  /* コマンドラインのパラメータの使用方法 */
  if(argc < 2 || argc > 7){
    printf("nai_pat_c12h <内積調査ファイル記号> <直交数> ");
    printf("<最大内積値> <最大平均値> <最小平均値>\n");
    printf("\tファイル名: pat_<内積調査ファイル記号>.dat\n");
    printf("\t<直交数>: 入力なし == 制限なし(== -1)\n");
    printf("\t<最大内積値>: 入力なし == 12以下\n");
    printf("\t<最大平均値>: 入力なし == 8+4/3以下 (各パターンごとの平均値)\n");
    printf("\t<最小平均値>: 入力なし == 4+4/3以上 (各パターンごとの平均値)\n");
    exit(-1);
  }
  nai_cho = -1;/* 制限なし */
  /* 入力なしの時の設定 */
  nai_max = 12;
  nai_h_max = 8+4/(double)3;
  nai_h_min = 4+4/(double)3;
  /* コマンドラインからの入力値の代入 */
  if(argc >= 3)
    nai_cho = atoi(argv[2]);
  if(argc >= 4)
    nai_max = atoi(argv[3]);
  if(argc >= 5)
    nai_h_max = atof(argv[4]);
  if(argc == 6)
    nai_h_min = atof(argv[5]);

  n=-1;/* 終了判定 */
  sprintf(fname,"pat_%s.dat",argv[1]);/* ファイル名入力 */
  if((f=fopen(fname,"r")) == NULL){
    printf("ファイルなし\n\007");
    exit(-1);
  }
  for(i=0; i<PN; i++)
    for(j=0; j<N1; j++)
      for(k=0; k<N2; k++)
        fscanf(f,"%d",&P[i][j][k]);
  /* 内積値がすでに書き込まれているかを判定 */
  if(fscanf(f,"%d",&x) != EOF)
    nai_kaki = 1;
  fclose(f);
  /* 相関内積計算 */
 naiseki:
  /* 画面表示判定 */
  if(n==-1)
    printf("相関内積:\n");
  cho=-1;
  cho_0 = 0;
  n_m_over = 0;
  for(i=0; i<PN; i++)
    n_h_over[i] = 0;
  for(i=0; i<PN-1; i++)
    for(j=i+1; j<PN; j++){
      sum[i][j]=0;
      for(k1=0; k1<N1; k1++)
        for(k2=0; k2<N2; k2++)
          if(P[i][k1][k2] == P[j][k1][k2])
            sum[i][j]++;
          else
            sum[i][j]--;
      /* 画面表示判定 */
      if(n==-1)
        printf("pattern-%d & pattern-%d %4d\n",i,j,sum[i][j]);
      /* 変更パターン判定 */
      if(nai_cho == -1){
        if(abs(sum[i][j]) > nai_max){
          cho = i;
          n_m_over = -1;
        }
      }
      else{
        if(abs(sum[i][j]) <= nai_max && n_m_over != -1){
          if(sum[i][j] == 0){
            cho_0++;
            if(cho_0 == nai_cho)
              cho = -1;
          }
          if(cho_0 > nai_cho && sum[i][j] == 0) cho = j;
          if(cho_0 < nai_cho && sum[i][j] != 0) cho = i;
        }
        else{
          n_m_over = -1;
          if(abs(sum[i][j]) > nai_max) cho = i;
        }
      }
      n_h_over[i] += abs(sum[i][j]);
      n_h_over[j] += abs(sum[i][j]);
    }
  if(cho == -1)
    for(i=0; i<PN; i++)
      if(n_h_over[i] > nai_h_max*3 || n_h_over[i] < nai_h_min*3){
        cho = i;
        break;
      }
  /* パターン変更 */
  if(cho!=-1){
    /* 乱数初期値入力および設定, 書き込みファイル設定 */
    if(n==-1){
      printf("乱数初期値:");
      scanf("%d",&ran_n);
      n=1;
      if(nai_cho == -1)
        sprintf(fname,"pat_%s_%lu.dat",argv[1],ran_n);
      else
        sprintf(fname,"pat_%s_%lu_%d.dat",argv[1],ran_n,nai_cho);
      srand48(ran_n);
    }
    /* 白黒交換 */
    i=drand48()*N1;
    j=drand48()*N2;
    if(P[cho][i][j]==1){
      P[cho][i][j]=0;
      do{
        i=drand48()*N1;
        j=drand48()*N2;
        k=P[cho][i][j];
      }
      while(k==1);
      P[cho][i][j]=1;
    }
    else{
      P[cho][i][j]=1;
      do{
        i=drand48()*N1;
        j=drand48()*N2;
        k=P[cho][i][j];
      }
      while(k==0);
      P[cho][i][j]=0;
    }
  }
  /* 内積計算繰り返し判定 */
  if(n!=-1){
    /* 画面表示後終了 */
    if(cho==-1)
      n=-1;
    l++;
    /* 繰り返し回数オーバー */
    if(l < HENKO_MAX)
      goto naiseki;
    printf("\007");
  }
  if(l == 0)
    sprintf(fname,"pat_%s_%d.dat",argv[1],nai_cho);
  fs=fopen(fname,"w");
  for(k=0; k<PN; k++){
    for(i=0; i<N1; i++){
      for(j=0; j<N2; j++)
        fprintf(fs,"%d ",P[k][i][j]);
      fprintf(fs,"\n");
    }
    fprintf(fs,"\n");
  }
  for(i=0; i<PN-1; i++)
    for(j=i+1; j<PN; j++)
      fprintf(fs,"%d ",sum[i][j]);
  fprintf(fs,"\n");    
  fclose(fs);
}



Deguchi Toshinori
1996年09月05日 (木) 11時50分24秒 JST