#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); }