想起用プログラム
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <ctype.h> #include <iostream.h> #define X 7 #define Y 7 #define N_num X*Y #define E 0.015 #define All_pat 100 int A_num = 19; int Pat_num = 52; int Ler_num = 1; int time; int pat_num; int a_num; int pat[All_pat][N_num]; double w[N_num][N_num]; double out[N_num]; double outo[N_num]; double gaibu_in[N_num]; inline double lim(double x) { int a=1; if( x < 0 ) a=-a; return( a ); } void read_pat() { int n_num,pat_num; char p; FILE *data_fp; char data_fn[30]="",a[]="patt",b[]="_"; char c[2]="a"; for(pat_num=0;pat_num<Pat_num;pat_num++){ strcpy(data_fn,"patt"); if( islower(c[0]) != 0 ){ strcat(data_fn,"_"); } strcat(data_fn,c); if (c[0] ++ == 'z'){ c[0]='A'; } strcat(data_fn,".dat"); data_fp = fopen(data_fn,"r"); for( n_num=0;n_num<N_num;){ if( (p =fgetc(data_fp)) != EOF){ if( p=='@' ){ pat[pat_num][n_num]=1; n_num++; } if( p=='.' ){ pat[pat_num][n_num]=-1; n_num++; } } } fclose(data_fp); } } void input() { int n_num; for(n_num=0;n_num<N_num;n_num++){ outo[n_num]=pat[pat_num][n_num]; } } void sougou() { int n_num; int ton_num; for(n_num=0;n_num<N_num;n_num++){ out[n_num]=0; for(ton_num=0;ton_num<N_num;ton_num++) out[n_num]+=w[n_num][ton_num]*outo[ton_num]; out[n_num]=lim(out[n_num]); } } void load_w() { FILE *w_fp; char fn[30]; char a[20]; strcpy(fn,"w"); sprintf(a,"%d",a_num); strcat(fn,a); strcat(fn,".dat"); w_fp = fopen(fn,"r"); fread(w,sizeof(double),N_num*N_num,w_fp); fclose(w_fp); } main(int argc, char* argv[]) { int i,h,f=0,t=19; int ler_num; int n_num; int k; char p='a'; char* argnam[] = {"a","f","t","pat"}; for(i=1;i<argc-1;i++){ if(argv[i][0] == '-'){ h=0; do{ if(!strcmp(&(argv[i][1]),argnam[h])) break; h++; }while(h<4); switch(h){ case 0: a_num = atoi(argv[++i]); f = a_num; t = a_num; break; case 1: f = atoi(argv[++i]); break; case 2: t = atoi(argv[++i]); break; case 3: Pat_num = atoi(argv[++i]); break; default: break; } } } read_pat(); for(pat_num=0;pat_num<Pat_num;pat_num++){ cout << p; if (p++=='z'){ p='A'; } } cout << "\n"; for( a_num=f ; a_num<=t; a_num++){ h=0; //gakushu dekita kazu load_w(); for(pat_num=0;pat_num<Pat_num;pat_num++){ input(); for( k=0;k<10;k++){ sougou(); for(i=0,n_num=0;n_num<N_num;n_num++){ if( out[n_num]!=outo[n_num] ){ i++;} outo[n_num]=out[n_num]; } if(i==0){ break; cout << "asdf";} } for(i=0,n_num=0;n_num<N_num;n_num++){ if( out[n_num]!=pat[pat_num][n_num] ){ i++;} } if(i==0){ cout << "o"; h++; } else{ cout << "."; } } cout << " " << h << " O.K." << a_num << "\n"; } }
学習用プログラム
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <ctype.h> #include <iostream.h> #define X 7 #define Y 7 #define N_num X*Y #define Km 0.1 #define Kr 0.95 #define Ks 0.95 #define Al -2 #define E 0.015 #define All_pat 100 int A_num = 20; int Pat_num = 52; int Ler_num = 50; int time; int pat_num; int a_num; int pat[All_pat][N_num]; double w[N_num][N_num]; double eta[N_num],guz[N_num],zet[N_num]; double out[N_num]; double etao[N_num],guzo[N_num],zeto[N_num]; double outo[N_num]; double gaibu_in[N_num]; double delta=0.05; inline double sig(double x) { if(x < -24) x=-24; return( 2.0/(1.0+exp(-x/E))-1.0); } void input_pat() { int n_num,pat_num; char p; FILE *data_fp; char data_fn[30]=""; char c[2]="a"; for(pat_num=0;pat_num<Pat_num;pat_num++){ strcpy(data_fn,"patt"); if( islower(c[0]) != 0 ){ strcat(data_fn,"_"); } strcat(data_fn,c); if (c[0]++=='z'){ c[0]='A'; } strcat(data_fn,".dat"); data_fp = fopen(data_fn,"r"); for( n_num=0;n_num<N_num;){ if( (p =fgetc(data_fp)) != EOF){ if( p=='@' ){ pat[pat_num][n_num]=1; n_num++; } if( p=='.' ){ pat[pat_num][n_num]=-1; n_num++; } } } } } void gaibu() { int n_num; for(n_num=0;n_num<N_num;n_num++){ gaibu_in[n_num]=2*pat[pat_num][n_num]; } } void sougou() { int n_num; int ton_num; for(n_num=0;n_num<N_num;n_num++){ eta[n_num]=0; for(ton_num=0;ton_num<N_num;ton_num++) eta[n_num]+=w[n_num][ton_num]*outo[ton_num]; eta[n_num] += Km * etao[n_num]; guz[n_num] = gaibu_in[n_num] + Ks * guzo[n_num]; zet[n_num] = Al * outo[n_num] + Kr * zeto[n_num]; out[n_num] = sig( eta[n_num] + guz[n_num] + zet[n_num] ); } } void save_w() { FILE *w_fp; char fn[30]; char a[20]; strcpy(fn,"w"); sprintf(a,"%d",a_num); strcat(fn,a); strcat(fn,".dat"); w_fp = fopen(fn,"w"); fwrite(w,sizeof(double),N_num*N_num,w_fp); fclose(w_fp); } void learn() { int n_num; int ton_num=0; float a,b; for(n_num=0;n_num<N_num;n_num++){ a=(fabs(guz[n_num])+fabs(eta[n_num]+zet[n_num])); b=fabs(guz[n_num]+eta[n_num]+zet[n_num]); if( a > b ){ for(ton_num=0;ton_num<N_num;ton_num++){ if( n_num != ton_num){ if(guz[n_num]*outo[ton_num] > 0) w[n_num][ton_num] += delta; // def delta = 0.05 else w[n_num][ton_num] -= delta; // def delta = 0.05 } } } } } main(int argc, char* argv[]) { int ler_num; int n_num; int i,h; char* argnam[] = {"a","pat","ler","d"}; for(i=1;i<argc-1;i++){ if(argv[i][0] == '-'){ h=0; do{ if(!strcmp(&(argv[i][1]),argnam[h])) break; h++; }while(h<4); switch(h){ case 0: A_num = atoi(argv[++i]); break; case 1: Pat_num = atoi(argv[++i]); break; case 2: Ler_num = atoi(argv[++i]); break; case 3: delta = atof(argv[++i]); break; default: break; } } } input_pat(); for(a_num=0;a_num<A_num;a_num++){ for(pat_num=0;pat_num<Pat_num;pat_num++){ for(ler_num=0;ler_num<Ler_num;ler_num++){ gaibu(); //cout << "ga \n"; sougou();//cout << "so \n"; learn(); //cout << "le \n"; for(n_num=0;n_num<N_num;n_num++){ zeto[n_num]=zet[n_num]; guzo[n_num]=guz[n_num]; etao[n_num]=eta[n_num]; outo[n_num]=out[n_num]; } } for(n_num=0;n_num<N_num;n_num++){ zeto[n_num]=0; guzo[n_num]=0; etao[n_num]=0; outo[n_num]=0; } } for(n_num=0;n_num<N_num;n_num++){ zeto[n_num]=0; guzo[n_num]=0; etao[n_num]=0; outo[n_num]=0; } save_w(); } }