/* chaos3en 0.5 0.55 ? ? 0.4 7 */ #include <math.h> #include <stdio.h> #include <string.h> #include <local/bgi.h> #define U 100 #define PATTERN 4 #define SOUKITIME 15 #define No_IUnits 100 #define No_HUnits 10 #define No_OUnits 2 #define r_No_IUnits 4 #define r_No_HUnits 3 #define r_No_OUnits 1 #define CTRL(x) ((x) - '@') #define fout(x) (1/(1+ exp(-(x)))) char *datafilename1 = "backpro1.data"; char *datafilename2 = "backpro2.data"; static int levo[U],levn[U],kai,ko,ka,ki,kka,kki,ku,ke,jik,time,hi,jyoutai, jyoutai2,page,retsu,gyou,outend; static char par[256],tim[256],ptn[256],fname[500],size[256]; static double alp,eps,sok,km,kr,rsnp,rcha,xold[U],xold2[U],m[U],n[U], w1[U][U],w2[U][U],tokuchou1,tokuchou2,gaib; double drand48(); 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 r_out_in[16][4],r_out_hid[r_No_HUnits],r_out_out[r_No_OUnits]; double r_witoh[r_No_HUnits][r_No_IUnits],r_dwitoh[r_No_HUnits][r_No_IUnits]; double r_whtoo[r_No_OUnits][r_No_HUnits],r_dwhtoo[r_No_OUnits][r_No_HUnits]; double r_hbias[r_No_HUnits],r_dhbias[r_No_HUnits]; double r_obias[r_No_OUnits],r_dobias[r_No_OUnits]; double out_in1[PATTERN+1][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}}; double out_in2[PATTERN][U] = {{0,0,0,1,1,1,1,0,0,0, 0,1,1,1,1,1,1,1,1,0, 0,1,1,0,0,0,0,1,1,0, 1,1,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,0,1,1, 0,1,1,0,0,0,0,1,1,0, 0,1,1,1,1,1,1,1,1,0, 0,0,0,1,1,1,1,0,0,0}, {0,0,0,0,1,1,0,0,0,0, 0,0,0,1,1,1,1,0,0,0, 0,0,1,1,0,0,1,1,0,0, 0,0,1,1,0,0,1,1,0,0, 0,1,1,0,0,0,0,1,1,0, 0,1,1,0,0,0,0,1,1,0, 0,1,1,1,1,1,1,1,1,0, 1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,0,1,1}, {1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0, 1,1,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,0,0, 1,1,1,1,1,1,1,1,0,0, 1,1,0,0,0,0,0,0,0,0, 1,1,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,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,0,0,0,1,1,0,0, 0,0,0,0,0,0,1,1,0,0, 0,0,0,0,0,0,1,1,0,0, 0,0,0,0,0,0,1,1,0,0, 1,1,0,0,0,0,1,1,0,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,1,0,0,0,0}}; main(argc,argv) int argc; char *argv[]; { int i, j, fin; sok = 0.25; alp = 10.0; eps = 0.015; km = 0.2; kr = 0.9; rcha = 0.5; ko = 0; gaib = 2.0; gyou = 5; if (argc != 7){ fprintf(stderr,"\n\n使用法:chaos?? <km> <kr> <初期値> <サーチ> <rcha> <列>\n"); fprintf(stderr," <初期値パターン> 0-バツ,1-三角,2-波,3-星.\n"); fprintf(stderr," <サーチパターン> 0-O ,1-A ,2-E ,3-J .\n\n"); exit(-1); } km = atof(argv[1]); kr = atof(argv[2]); jyoutai = atoi(argv[3]); jyoutai2 = atoi(argv[4]); rcha = atof(argv[5]); retsu = atoi(argv[6]); outend = retsu*gyou; srand48(jyoutai); wariate(jyoutai2); sprintf(par,"km=%3.2f kr=%3.2f rc=%3.2f alp=%3.1f a=%3.2f eps=%4.3f search=>%s",km,kr,rcha,alp,gaib,eps,ptn); sprintf(fname,"bitmap/chaos/e%2.0lf%2.0lf%d%d%d.xbm",km*100,kr*100,jyoutai,jyoutai2,page); sprintf(size, "%dx%d", retsu*150,gyou*150+50); initgraph(&i, &j, size); settextfont("12x24"); soukan(); /* 初期値パターン設定 */ shoki(); backpro_ini(); for(kai = 0; kai < 3000 ; kai++){ /* 量子化 */ ryoushika(); /* 直前の出力と比較 */ hi = hikaku(); if (hi == 0) time++; else time=0; /* 画面出力 */ output(kai); /* 特徴抽出 */ tokuchou_output(); if (jik == 1) break; for(i = 0; i < U; i++) neuro(i); for(i = 0; i < U; i++) neuro2(i); } fin == getchar(); if (fin == 'p') graph2xbm(fname); closegraph(); beep(); exit(); } 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; switch (p) { case 0: sprintf(ptn,"O"); break; case 1: sprintf(ptn,"A"); break; case 2: sprintf(ptn,"E"); break; default: sprintf(ptn,"J"); break; } } soukan() { int i, j, k; for (i = 0; i < PATTERN; i++){ for (j = 0; j < U; j++){ for (k = 0; k < U; k++){ w1[j][k] += sok * (2 * out_in1[i][j] - 1) * (2 * out_in1[i][k] - 1); w2[j][k] += (2 * out_in2[i][j] - 1) * (2 * out_in1[i][k] - 1); } } } } shoki() { int i,j; if (jyoutai > 3){ for(i = 0; i < 10; i++){ for(j = 0; j < 10; j++){ if(drand48() < 0.5) out_in1[PATTERN+1][i*10+j] = 0; else out_in1[PATTERN+1][i*10+j] = 1; } } for(i = 0; i < U; i++){ xold[i] = 0.8 * 0.8 * out_in1[PATTERN+1][i]; xold2[i] = xold[i]; m[i] = n[i] = 0; } } else{ for(i = 0; i < U; i++){ xold[i] = 0.8 * 0.8 * out_in1[jyoutai][i]; xold2[i] = xold[i]; m[i] = n[i] = 0; } } } backpro_ini() { char *s; FILE *fp; s = datafilename1; if ((fp = fopen(datafilename1, "r")) == NULL){ fprintf(stderr, "% open error !!\n", datafilename1); fclose(fp); return(-1); } if (fread(hbias, sizeof(double), No_HUnits, fp) < No_HUnits) { short_data: fprintf(stderr, "%s is too short !!\n", s); fclose(fp); return(-1); } if (fread(witoh, sizeof(double), No_HUnits*No_IUnits, fp) < No_HUnits*No_IUnits ) { goto short_data; } if (fread(obias, sizeof(double), No_OUnits, fp) < No_OUnits) { goto short_data; } if (fread(whtoo, sizeof(double), No_OUnits*No_HUnits, fp) < No_OUnits*No_HUnits) { goto short_data; } fclose(fp); s = datafilename2; if ((fp = fopen(datafilename2, "r")) == NULL){ fprintf(stderr, "% open error !!\n", datafilename2); fclose(fp); return(-1); } if ((fread(r_hbias, sizeof(double), r_No_HUnits, fp)) < r_No_HUnits) { goto short_data; } if ((fread(r_witoh, sizeof(double), r_No_HUnits * r_No_IUnits, fp)) < r_No_HUnits * r_No_IUnits) { goto short_data; } if ((fread(r_obias, sizeof(double), r_No_OUnits,fp)) < r_No_OUnits) { goto short_data; } if ((fread(r_whtoo, sizeof(double), r_No_OUnits * r_No_HUnits, fp)) < r_No_OUnits * r_No_HUnits) { goto short_data; } fclose(fp); } ryoushika() { int i; for(i = 0; i < U; i++){ if(xold2[i] < 0.1){ levo[i] = 0; } else if(xold2[i] < 0.25){ levo[i] = 1; } else if(xold2[i] < 0.5){ levo[i] = 2; } else if(xold2[i] < 0.75){ levo[i] = 3; } else if(xold2[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); } output(kai) unsigned int kai; { int i, j, cc; if (ko == 0){ if (kai != 0){ cc = getchar(); if (cc == 'p'){ graph2xbm(fname); page++; sprintf(fname,"bitmap/chaos/d%2.0lf%2.0lf%d%d%d.xbm",km*100,kr*100,jyoutai,jyoutai2,page); }else if (cc =='q'){ closegraph(); exit(); } } cleardevice(); if (kai == 0) outtextxy(10,23,par); } sprintf(tim,"t=%u",kai); ka = 10 + (ko % retsu) * 150; ki = 50 + ((int)(ko / retsu)) *152; outtextxy(ka,ki,tim); for(i = 0; i < 10; i++){ for(j =0; j < 10; j++){ if(i==0 && j==0){ kka = ka; kki = ki; } if(levo[10 * i + j] == 0){ ka = j * 11 - levo[10 * i + j] + 15 + (ko % retsu) * 150; ki = i * 11 + 60 + ((int)(ko / retsu)) * 152; putpixel(ka,ki,WHITE); } else { ka = j * 11 - levo[10 * i + j] + 15 + (ko % retsu) * 150; ki = i * 11 - levo[10 * i + j] + 60 + ((int)(ko / retsu)) * 152; ku = j * 11 + levo[10 * i + j] + 15 + (ko % retsu) * 150; ke = i * 11 + levo[10 * i + j] + 60 + ((int)(ko / retsu)) * 152; bar(ka,ki,ku,ke); } } } ko++; for (i = 0; i < U; i++) levn[i] = levo[i]; if (ko % outend == 0) ko = 0; } tokuchou_output() { int i,j; double q; i=0; for(j = 0; j < U; j++) out_in1[i][j] = xold2[j]; forward_propagation(i); r_out_in[0][0]=tokuchou1; r_out_in[0][1]=tokuchou2; r_out_in[0][2]=out_out[0]; r_out_in[0][3]=out_out[1]; r_forward_propagation(0); q = r_out_out[0]; if (q < 0.4) { /* 0.5 */ rsnp = ((1 - rcha) * cos(q * M_PI * 2) + rcha + 1) / 2; } else { rsnp = rcha; } /* if (r_out_out[0] < 0.2) rsnp = 7; printf("%d t1=%1.1lf t1'=%lf t2=%1.1lf t2'=%lf",kai,tokuchou1,out_out[0],tokuchou2,out_out[1]); printf(" rsnp=%lf yokusei=%lf\n",rsnp,r_out_out[0]); */ 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_in1[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]); } } r_forward_propagation(p) int p; { int i, j; double sum; for(i = 0; i < r_No_HUnits; i++) { sum = 0.0; for(j = 0; j < r_No_IUnits; j++) sum += r_witoh[i][j] * r_out_in[p][j]; r_out_hid[i]=fout(sum + r_hbias[i]); } for(i = 0; i < r_No_OUnits; i++) { sum = 0.0; for(j = 0; j < r_No_HUnits; j++) sum += r_whtoo[i][j] * r_out_hid[j]; r_out_out[i]=fout(sum + r_obias[i]); } } neuro(i) int i; { int j; double kas = 0; for(j = 0; j < U; j++) kas += (rsnp * w1[i][j] * xold[j]); m[i] = kas + km * m[i]; n[i] = -alp * xold[i] + kr * n[i] + gaib; xold[i] = fout((m[i] + n[i]) / eps); } neuro2(i) int i; { int j; double kas = 0; for(j = 0; j < U; j++) kas += w2[i][j] * xold[j]; xold2[i] = fout(kas); } kentou() { int cc; printf("Search!!\n"); printf("access_time = %d\n\n",kai-SOUKITIME); outtextxy(kka+70,kki,"?"); cc = getchar(); if (cc == 'p') graph2xbm(fname); closegraph(); exit(); } beep() { putchar(CTRL('G')); }