next up previous contents
Next: この文書について ... Up: 無題 Previous: 参考文献

A サーチアクセスプログラム

 
/* 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'));
}



Deguchi Toshinori
1997年03月18日 (火) 14時34分51秒 JST