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