広域的な追加学習をするプログラムと同じ関数
(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();
}
}