next up previous contents
Next: 付録C 広域的追加学習のグラフィック Up: 無題 Previous: 付録A 広域的な追加学習をするプログラム

付録B 局所的な追加学習をするプログラム

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



Deguchi Toshinori
1998年03月18日 (水) 13時22分42秒 JST