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

付録A 本研究の学習法プログラム

想起用プログラム

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <iostream.h>

#define X 7
#define Y 7
#define N_num X*Y

#define E 0.015
#define All_pat 100

int A_num = 19;
int Pat_num = 52;
int Ler_num = 1;

int time;
int pat_num;
int a_num; 
int pat[All_pat][N_num];

double w[N_num][N_num];
double out[N_num];
double outo[N_num];
double gaibu_in[N_num];

inline double lim(double x)
{
  int a=1;
  if( x < 0 ) a=-a;
  return( a );
}

void read_pat()
{
 int n_num,pat_num;
 char p;
 FILE *data_fp;
 char data_fn[30]="",a[]="patt",b[]="_";
 char c[2]="a";

 for(pat_num=0;pat_num<Pat_num;pat_num++){
   strcpy(data_fn,"patt");
   if( islower(c[0]) != 0 ){
     strcat(data_fn,"_");
   }
   strcat(data_fn,c);
   if (c[0] ++ == 'z'){
     c[0]='A';
   }
   strcat(data_fn,".dat");

   data_fp = fopen(data_fn,"r");
   for( n_num=0;n_num<N_num;){
     if( (p =fgetc(data_fp)) != EOF){ 
       if( p=='@' ){
         pat[pat_num][n_num]=1;
         n_num++;
       }
       if( p=='.' ){
         pat[pat_num][n_num]=-1;
         n_num++;
       }
     }
   }
   fclose(data_fp);
 }
}


void input()
{
  int n_num;

  for(n_num=0;n_num<N_num;n_num++){
    outo[n_num]=pat[pat_num][n_num];
  }
}

void sougou()
{
  int n_num;
  int ton_num;

  for(n_num=0;n_num<N_num;n_num++){
    out[n_num]=0;
    for(ton_num=0;ton_num<N_num;ton_num++)
      out[n_num]+=w[n_num][ton_num]*outo[ton_num];
    out[n_num]=lim(out[n_num]);
  }
}

void load_w()
{
  FILE *w_fp;
  char fn[30];
  char a[20];

  strcpy(fn,"w");
  sprintf(a,"%d",a_num);
  strcat(fn,a);
  strcat(fn,".dat");
  w_fp = fopen(fn,"r");

  fread(w,sizeof(double),N_num*N_num,w_fp);

  fclose(w_fp);
}

main(int argc, char* argv[])
{
  int i,h,f=0,t=19;
  int ler_num;
  int n_num;
  int k;
  char p='a';

  char* argnam[] = {"a","f","t","pat"};

  for(i=1;i<argc-1;i++){
    if(argv[i][0] == '-'){
      h=0;
      do{
        if(!strcmp(&(argv[i][1]),argnam[h]))
          break;
        h++;
      }while(h<4);
      
      switch(h){
      case 0:
        a_num = atoi(argv[++i]);
        f = a_num;
        t = a_num;
        break;
      case 1:
        f = atoi(argv[++i]);
        break;
      case 2:
        t = atoi(argv[++i]);
        break;
      case 3:
        Pat_num = atoi(argv[++i]);
        break;
      default:
        break;
      }
    }
  }

  read_pat();

  for(pat_num=0;pat_num<Pat_num;pat_num++){
    cout << p;
    if (p++=='z'){
      p='A';
    } 
  }
  cout << "\n";




  for( a_num=f ; a_num<=t; a_num++){
    h=0; //gakushu dekita kazu
    
    load_w();
    for(pat_num=0;pat_num<Pat_num;pat_num++){

      input();
      
      for( k=0;k<10;k++){

      sougou();

        for(i=0,n_num=0;n_num<N_num;n_num++){
          if( out[n_num]!=outo[n_num] ){
            i++;}
          outo[n_num]=out[n_num];
        }
        if(i==0){
          break;
          cout << "asdf";}
      }
      
      for(i=0,n_num=0;n_num<N_num;n_num++){
        if( out[n_num]!=pat[pat_num][n_num] ){
          i++;}
      }      
      if(i==0){
        cout << "o";
        h++;
      }
      else{
        cout << ".";
      }
 
    }
    cout << "  " << h << " O.K." << a_num << "\n";   
  }
  
}

学習用プログラム

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <iostream.h>

#define X 7
#define Y 7
#define N_num X*Y

#define Km 0.1
#define Kr 0.95
#define Ks 0.95
#define Al -2
#define E 0.015
#define All_pat 100

int A_num = 20;
int Pat_num = 52;
int Ler_num = 50;

int time;
int pat_num;
int a_num; 
int pat[All_pat][N_num];

double w[N_num][N_num];
double eta[N_num],guz[N_num],zet[N_num];
double out[N_num];
double etao[N_num],guzo[N_num],zeto[N_num];
double outo[N_num];
double gaibu_in[N_num];

double delta=0.05;

inline double sig(double x)
{
  if(x < -24) x=-24;

  return( 2.0/(1.0+exp(-x/E))-1.0);
}

void input_pat()
{
 int n_num,pat_num;
 char p;
 FILE *data_fp;
 char data_fn[30]="";
 char c[2]="a";

 for(pat_num=0;pat_num<Pat_num;pat_num++){
   strcpy(data_fn,"patt");
   if( islower(c[0]) != 0 ){
     strcat(data_fn,"_");
   }
   strcat(data_fn,c);
   if (c[0]++=='z'){
     c[0]='A';
   }
   strcat(data_fn,".dat");

   data_fp = fopen(data_fn,"r");
   for( n_num=0;n_num<N_num;){
     if( (p =fgetc(data_fp)) != EOF){ 
       if( p=='@' ){
         pat[pat_num][n_num]=1;
         n_num++;
       }
       if( p=='.' ){
         pat[pat_num][n_num]=-1;
         n_num++;
       }
     }
   }
 }
}


void gaibu()
{
  int n_num;

  for(n_num=0;n_num<N_num;n_num++){
    gaibu_in[n_num]=2*pat[pat_num][n_num];
  }
}

void sougou()
{
  int n_num;
  int ton_num;

  for(n_num=0;n_num<N_num;n_num++){
    eta[n_num]=0;
    for(ton_num=0;ton_num<N_num;ton_num++)
      eta[n_num]+=w[n_num][ton_num]*outo[ton_num];
    eta[n_num] += Km * etao[n_num];
    guz[n_num] = gaibu_in[n_num] + Ks * guzo[n_num];
    zet[n_num] = Al * outo[n_num] + Kr * zeto[n_num];
    out[n_num] = sig( eta[n_num] + guz[n_num] + zet[n_num] );
  }
}

void save_w()
{
  FILE *w_fp;
  char fn[30];
  char a[20];

  strcpy(fn,"w");
  sprintf(a,"%d",a_num);
  strcat(fn,a);
  strcat(fn,".dat");
  w_fp = fopen(fn,"w");

  fwrite(w,sizeof(double),N_num*N_num,w_fp);

  fclose(w_fp);
}

void learn()
{
  int n_num;
  int ton_num=0;

  float a,b;

  for(n_num=0;n_num<N_num;n_num++){
    a=(fabs(guz[n_num])+fabs(eta[n_num]+zet[n_num]));
    b=fabs(guz[n_num]+eta[n_num]+zet[n_num]);
    if( a > b ){
      for(ton_num=0;ton_num<N_num;ton_num++){
        if( n_num != ton_num){
          if(guz[n_num]*outo[ton_num] > 0)
            w[n_num][ton_num] += delta; // def delta = 0.05
          else
            w[n_num][ton_num] -= delta; // def delta = 0.05
        }
      }
    }
  }
}

main(int argc, char* argv[])
{
  int ler_num;
  int n_num;
  int i,h;

  char* argnam[] = {"a","pat","ler","d"};

  for(i=1;i<argc-1;i++){
    if(argv[i][0] == '-'){
      h=0;
      do{
        if(!strcmp(&(argv[i][1]),argnam[h]))
          break;
        h++;
      }while(h<4);
      
      switch(h){
      case 0:
        A_num = atoi(argv[++i]);
        break;
      case 1:
        Pat_num = atoi(argv[++i]);
        break;
      case 2:
        Ler_num = atoi(argv[++i]);
        break;
      case 3:
        delta = atof(argv[++i]);
        break;
      default:
        break;
      }
    }
  }


  input_pat();
  
  for(a_num=0;a_num<A_num;a_num++){
    for(pat_num=0;pat_num<Pat_num;pat_num++){
      for(ler_num=0;ler_num<Ler_num;ler_num++){
        gaibu(); //cout << "ga  \n";
        sougou();//cout << "so  \n";
        learn(); //cout << "le  \n";
        for(n_num=0;n_num<N_num;n_num++){
          zeto[n_num]=zet[n_num];
          guzo[n_num]=guz[n_num];
          etao[n_num]=eta[n_num];
          outo[n_num]=out[n_num];
        }
      }

      for(n_num=0;n_num<N_num;n_num++){
        zeto[n_num]=0;
        guzo[n_num]=0;
        etao[n_num]=0;
        outo[n_num]=0;
      }
    
    }
    
    for(n_num=0;n_num<N_num;n_num++){
      zeto[n_num]=0;
      guzo[n_num]=0;
      etao[n_num]=0;
      outo[n_num]=0;
    }
  
    save_w();
  }  
}



Deguchi Toshinori
Mon Feb 26 15:23:22 JST 2001