/*** ネットワーク(二つのネットワーク+シナプス) ***/ /* * * * * カオティックサーチ 特徴表示 * * * * */ #include <math.h> #include <stdio.h> #include <string.h> #include <local/bgi.h> #define U 100 #define PATTERN 4 #define SOUKITIME 5 #define No_IUnits 100 #define No_HUnits 10 #define No_OUnits 2 #define gaib 4.0 #define CTRL(x) ((x) - '@') #define fout(x) (1/(1+ exp(-(x)))) static int levo[U],levn[U],kai,kx,ky,kx0,ky0,ko,ka,ki,kka,kki, ku,ke,time,hi,jik,jyoutai,jyoutai2,N,nn,a,ikm,ikr, t,data[4000]; static char st0[256],st1[256],st2[256],fname[512],st3[256], par1[256]; static double alp,eps,sok,km,kr,rsnp,Rs,Gs,xnew[U],xold[U], m[U],n[U],w[U][U],tokuchou1,tokuchou2,gosa, gosa1,gosa2,data1[8000]; double out_hid[No_HUnits],out_out[No_OUnits]; double witoh[No_HUnits][No_IUnits],dwitoh[No_HUnits][No_IUnits]; double whtoo[No_OUnits][No_HUnits],dwhtoo[No_OUnits][No_HUnits]; double hbias[No_HUnits],dhbias[No_HUnits]; double obias[No_OUnits],dobias[No_OUnits]; double drand48(); FILE *fp; double out_in[PATTERN][U] = {{1,1,0,0,0,0,0,0,1,1, 1,1,1,0,0,0,0,1,1,1, 0,1,1,1,0,0,1,1,1,0, 0,0,1,1,1,1,1,1,0,0, 0,0,0,1,1,1,0,0,0,0, 0,0,0,0,1,1,1,0,0,0, 0,0,1,1,1,1,1,1,0,0, 0,1,1,1,0,0,1,1,1,0, 1,1,1,0,0,0,0,1,1,1, 1,1,0,0,0,0,0,0,1,1}, {0,0,0,0,0,1,0,0,0,0, 0,0,0,0,1,1,1,0,0,0, 0,0,0,0,1,1,1,0,0,0, 0,0,0,1,1,0,1,1,0,0, 0,0,0,1,1,0,1,1,0,0, 0,0,1,1,1,0,1,1,1,0, 0,0,1,1,0,0,0,1,1,0, 0,1,1,1,0,0,0,1,1,1, 0,1,1,1,1,1,1,1,1,1, 0,1,1,1,1,1,1,1,1,1}, {0,0,1,1,1,0,0,0,1,1, 0,1,1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1,0,0, 1,1,0,0,0,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,0,0,0,1,1, 0,0,1,1,1,1,0,1,1,1, 1,1,1,1,1,1,1,1,1,0, 1,1,0,0,0,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0}, {0,0,1,0,0,0,0,1,0,0, 0,0,1,1,0,0,1,1,0,0, 0,0,1,1,1,1,1,1,0,0, 0,0,1,1,1,1,1,1,0,0, 0,0,1,1,1,1,1,1,0,0, 0,1,1,1,1,1,1,1,1,0, 1,1,1,1,1,1,1,1,1,1, 0,0,0,1,1,1,1,0,0,0, 0,0,0,0,1,1,0,0,0,0, 0,0,0,0,0,1,0,0,0,0}}; main(argc,argv) int argc; char *argv[]; { int i,j,fin,*gd,*gm; sok = 0.25; alp = 10.0; eps = 0.015; hi = 1; Gs = 0.5; Rs = 0.4; N = 10; jyoutai = 4; sprintf(fname,"fnetwork.dat"); printf("\n%s",fname); fp = fopen(fname,"w"); if (fp == NULL){ fprintf(stderr,"error\n"); exit(1); } fwrite(&N,sizeof(int),1,fp); soukan(); backpro_ini(); for(ikm = 1; ikm < N; ikm++){ km = (double)ikm / N; for(ikr = 1; ikr < N; ikr++){ kr = (double)ikr / N; for(jyoutai2 = 0; jyoutai2 < 4; jyoutai2++){ wariate(jyoutai2); for(nn = 0; nn < N ; nn++){ shoki(); t = 0; for(kai = 0; kai < 2000 ; kai++){ ryoushika(); if (kai != 0) hi = hikaku(); if (hi == 0) time++; else time=0; for (i = 0; i < U; i++) levn[i] = levo[i]; tokuchou_output(); if (t > 0) break; for(i = 0; i < U; i++) neuro(i); } printf(" ikm=%d ikr=%d jyou=%d nn=%d t=%d\n" ,ikm,ikr,jyoutai2,nn,t); data[ikm*400+ikr*40+jyoutai2*10+nn] = t; data1[ikm*400+ikr*40+jyoutai2*10+nn] = out_out[0]; data1[ikm*400+ikr*40+jyoutai2*10+nn+4000] = out_out[1]; } } } } fwrite(data, sizeof(int), 4000, fp); fwrite(data1, sizeof(double), 8000, fp); fclose(fp); } wariate(p) int p; { tokuchou1 = 0.0; tokuchou2 = 0.0; if (p == 2 || p == 3) tokuchou1 = 1.0; if (p == 1 || p == 3) tokuchou2 = 1.0; } ptnname(p) int p; { if (p == 0){ sprintf(st0,"X"); }else if (p == 1){ sprintf(st0,"triangle"); }else if (p == 2){ sprintf(st0,"wave"); }else if (p == 3){ sprintf(st0,"star"); }else { sprintf(st0,"random"); } } soukan() /* 相関学習 */ { int i,j,k; for(i = 0; i < PATTERN; i++){ for(j = 0; j < U; j++){ for(k = 0; k < U; k++){ w[j][k] += sok * (2*out_in[i][j] - 1)*(2*out_in[i][k] - 1); } } } } shoki() /* 初期パターン作成 */ { int i,r; /* ランダムパターン作成 */ srand48(nn); if (jyoutai == 4){ for(i = 0; i < U; i++){ if (drand48() < 0.5) r=0; else r=1; xold[i] = r; xnew[i] = r; m[i] = n[i] = 0; } } else{ /* 各パターン作成 */ for(i = 0; i < U; i++){ xold[i] = 0.8 * 0.8 * out_in[jyoutai][i]; m[i] = n[i] = 0; } } } backpro_ini() /* バックプロパゲーションのしきい値、重みを読み込む */ { int i,j; FILE *fp; double data[1032],data2[25]; for(i = 0; i < No_HUnits; i++) out_hid[i] = 0; for(i = 0; i < No_OUnits; i++) out_out[i] = 0; if((fp=fopen("backpro1.data","r")) == NULL){ puts("read [backpro1.data] open error !!"); fclose(fp); return(-1); } if (fread(data,sizeof(double),1032,fp) != 1032){ puts("read backpro1.data open error !!"); fclose(fp); return(-1); } for (i = 0 ; i < 1032 ; i++){ if (i<10) hbias[i] = data[i]; if (i>=10 && i<1010){ j = i - 10; witoh[j/100][j%100] = data[i]; } if (i>=1010 && i<1012){ j = i - 1010; obias[j] = data[i]; } if (i>=1012){ j = i - 1012; whtoo[j/10][j%10] = data[i]; } } fclose(fp); } ryoushika() /* 表示のため出力を量子化 */ { int i; for(i = 0; i < U; i++){ if(xold[i] < 0.1){ levo[i] = 0; } else if(xold[i] < 0.25){ levo[i] = 1; } else if(xold[i] < 0.5){ levo[i] = 2; } else if(xold[i] < 0.75){ levo[i] = 3; } else if(xold[i] < 0.90){ levo[i] = 4; } else { levo[i] = 5; } } } hikaku() /* 出力を前の出力と比較 */ { int i; for(i = 0; i < U; i++){ if(levo[i] != levn[i]) return(1); } return(0); } tokuchou_output() /* 特徴抽出 */ { int i,j; double q; i=0; for(j = 0; j < U; j++) out_in[i][j] = xold[j]; forward_propagation(i); gosa1 = tokuchou1 - out_out[0]; gosa2 = tokuchou2 - out_out[1]; gosa = sqrt(gosa1 * gosa1 + gosa2 * gosa2); if(gosa > Gs) rsnp = Rs; else rsnp = 1; if (time == SOUKITIME){ kentou(); } } forward_propagation(p) int p; { int i,j; double sum; for(i = 0; i < No_HUnits; i++){ sum = 0.0; for(j = 0; j < No_IUnits; j++) sum += witoh[i][j] * out_in[p][j]; out_hid[i]=fout(sum + hbias[i]); } for(i = 0; i < No_OUnits; i++){ sum = 0.0; for(j = 0; j < No_HUnits; j++) sum += whtoo[i][j] * out_hid[j]; out_out[i]=fout(sum + obias[i]); } } neuro(i) /* ニューラルネットワーク */ int i; { int j; /* カオスニューロン */ double kas = 0; double kas1 = 0; for(j = 0; j < U; j++){ kas += (rsnp * w[i][j] * xold[j]); kas1 += (rsnp * w[i][j] * xnew[j]); } m[i] = kas + kas1 + km * m[i]; n[i] = -alp * xold[i] + kr * n[i] + gaib; xold[i] = fout((m[i] + n[i]) / eps); /* 普通のニューロン */ kas = 0; kas1 = 0; for(j = 0; j < U; j++){ kas += (rsnp * w[i][j] * xold[j]); kas1 += (rsnp * w[i][j] * xnew[j]); } xnew[i] = fout((kas + kas1) / eps); } kentou() /* 見つかった時 */ { int c; t = kai - SOUKITIME; printf(" Search!!"); printf(" access_time = %d",kai-SOUKITIME); }