next up previous contents
Next: この文書について ... Up: 無題 Previous: 付録A パラメータ gs に対する検索結果

付録B サーチアクセスプログラム

 

/*** ネットワーク(二つのネットワーク+シナプス) ***/
/* * * * * カオティックサーチ 特徴表示 * * * * */
           
#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);
}



Deguchi Toshinori
1996年11月14日 (木) 12時50分06秒 JST