広域的な追加学習をするプログラムと同じ関数 (kazyu1,gaibu,sougo,fuou,keisan,kakikomi,syuturyoku,graf) は除いてある。 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <local/bgi.h> #define S 3 /*始めに覚えるパターンの数*/ #define Z 49 /*ニューロンの総数*/ #define Kr 0.95 /*外部入力の係数*/ #define Ks 0.99 /*相互結合の係数*/ #define Km 0.1 /*不応性の係数*/ #define a 2.0 /*不応性の係数*/ #define v 2.0 /*外部入力の係数*/ #define Q 0.0 /*閾値*/ #define A 7 /*ニューロンの縦の数*/ #define ll 7 #define kkk 6 #define Vth 30 /*変化量の閾値*/ #define ZZ 300 /*離散時間の総数*/ #define E 0.015 /*シグモイド関数の係数*/ #define AA 50 #define BB 100 #define CC 150 #define DD 175 /*各外部入力の離散時間の数*/ #define EE 200 #define FF 225 #define GG 250 #define HH 275 static char tim[ZZ],fname[]; FILE *e; FILE *f1; FILE *ff; FILE *ee; FILE *f2; char c[10]; char ccc[10]; char mm[Z]; char gg[Z]; void kazyu1(); /*始めに覚えるパターンを読み込む*/ void kazyu2(); /*始めに覚えるパターンの結合荷重を計算する*/ void kazyu4(); /*結合荷重を変化させる*/ void gaibu(); /*外部入力の計算*/ void sougo(); /*相互結合の計算*/ void fuou(); /*不応性の計算*/ void keisan(); /*ニュウロンの出力の計算*/ void hanbetu1(); /*外部入力と相互結合、不応性の関係で判別する*/ void hanbetu2(); /*変化量の計算*/ void hanbetu3(); /*入力パターンの変化の判別*/ void kakikomi(); /*ファイルに書き込む*/ void syuturyoku(); /*グラフィクで表す*/ void graf(); /*グラフを書く*/ void mitipatan(); /*未知パターンをファイルに書き込む*/ double drand48(); int t,oo[Z],r,tt,ttt,yy,ss,rr,onazi,onazi1,ooo; int m[ZZ][Z],mnoi[ZZ][Z],mnoi1[ZZ][Z],g[10][Z],xx[ZZ][Z]; double V,yyy; double w[Z][Z],w1[Z][Z],n[ZZ][Z],nn[ZZ][Z],nnn[ZZ][Z],x[ZZ][Z]; double xdata[ZZ],xnoi[ZZ],xdata2,dou2[Z]; /*メインプログラム*/ main(){ int i,j; ff=fopen("AS1.DAT","w"); ee=fopen("MITI.DAT","w"); r=S; kazyu1(); kazyu2(); for(i=0;i<Z;i++) for(j=0;j<Z;j++) w[i][j]=w1[i][j]; printf("ノイズなら 1 欠落させるなら0 "); scanf("%d",&ss); if(ss==1) printf("何個 ノイズをいれる "); else printf("何個 欠落させる "); scanf("%d",&yy); t=0; tt=0; ttt=0; while(ttt<ZZ) { gaibu(); hanbetu3(); mitipatan(); ooo=0; sougo(); fuou(); keisan(); hanbetu1(); kazyu4(); t=t+1; ttt=ttt+1; } syuturyoku(); graf(); fclose(ff); fclose(ee); } /*未知パターンを書き込む*/ void mitipatan() { int i,j; if(ooo==1) { for(rr=0;rr<r;rr++) { onazi=0; for(i=0;i<Z;i++) if(g[rr][i]==xx[tt-1][i]) onazi=onazi+1; if(onazi==Z) onazi1=1; } if(onazi1!=1) { for(i=0;i<Z;i++) g[r][i]=xx[tt-1][i]; fprintf(ee,"\n"); for(i=0;i<Z;i++) if(g[r][i]==1) gg[i]='#'; else gg[i]=':'; j=0; for(i=0;i<Z;i++) if(j==kkk) { fprintf(ee,"%c\n",gg[i]); j=0; } else { fprintf(ee,"%c",gg[i]); j=j+1; } r=r+1; } } } /*局所的な結合荷重割り当て*/ void kazyu4() { int i,j; double dou; for(i=0;i<Z;i++) if(oo[i]==1) for(j=0;j<Z;j++) if(i!=j) { dou=n[t][i]*n[t][j]; if(dou>0) w1[i][j]=w1[i][j]+0.05; else w1[i][j]=w1[i][j]-0.05; } } /*初期パターンの学習プログラム*/ void kazyu2() { int i,ham; for(ham=0;ham<3;ham++) { t=0; ttt=0; while(ttt<100) { for(i=0;i<Z;i++) { mnoi[ttt][i]=g[ham][i]; if(t==0) n[t][i]=v*mnoi[ttt][i]; else n[t][i]=Ks*n[t-1][i]+v*mnoi[ttt][i]; } sougo(); fuou(); keisan(); hanbetu1(); kazyu4(); t=t+1; ttt=ttt+1; } } } /*未知パターン、既知パターンの判別*/ void hanbetu1() { int i,j; double u,uu,z,zz; for(i=0;i<Z;i++) { u=fabs(n[t][i]); z=fabs(nn[t][i]+nnn[t][i]); uu=fabs(n[t][i]+nn[t][i]+nnn[t][i]); zz=(u+z)/1000; if(uu<(u+z)-zz) oo[i]=1; else oo[i]=0; } } void hanbetu2() { int h,i,j; V=0; for(h=tt+2;h<ttt;h++) for(i=0;i<Z;i++) V=fabs(x[h][i]-x[h-1][i])+V; printf("%d",ttt-1); printf("%c",' '); printf("%c",' '); printf("%f\n",V); if(V>Vth) { ooo=1; printf("%d",ttt-1); printf("%c",' '); printf("%c",' '); printf("%f\n",V); for(i=0;i<Z;i++) for(j=0;j<Z;j++) w[i][j]=w1[i][j]; } else { for(i=0;i<Z;i++) for(j=0;j<Z;j++) w1[i][j]=w[i][j]; ooo=0; } } void hanbetu3() { int i,j,zz; zz=0; if(ttt!=0) for(i=0;i<Z;i++) if(m[ttt][i]!=m[ttt-1][i]) zz=zz+1; if(zz>9) { hanbetu2(); t=0; tt=ttt; gaibu(); } }