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

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

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <local/bgi.h>

#define step 100
#define nyuron_kazu 49
#define masume 7
#define Kr 0.95 
#define Ks 0.95
#define Km 0.1
#define a 2.0
#define v 2.0
#define Q 0.0
#define E 0.015
#define zikan 1800

static char tim[zikan];

FILE *data_file; 
FILE *guraf_file;

double drand48();

void gaibunuryoku();
void sougoketugou();
void fuousei();
void naibu_zyoutai();
void hanbetu_gakusyu();
void input_noizu();
void graw();
void hopfild();

int in_pattan[zikan][nyuron_kazu];
int time;
int noizu_number;
int gurafikku;
int hanten;
int number;
int kaunter;
int kasan;
int kasan_zikan;
int lerne[zikan][nyuron_kazu];
int kaisi;

double gaibu_input[zikan][nyuron_kazu];
double sougo_input[zikan][nyuron_kazu];
double fuou_input[zikan][nyuron_kazu];
double wait[nyuron_kazu][nyuron_kazu];
double output[zikan+50][nyuron_kazu];

main()
{ 
  printf("パターンごとに時間加算  YES 1 NO 0        ");
  scanf("%d",&kasan);
  printf("ノイズなら 1 欠落させるなら0          ");
  scanf("%d",&hanten);
  if(hanten==1)
    printf("何個 ノイズをいれる      ");
  else
    printf("何個 欠落させる          ");
  scanf("%d",&noizu_number);
  while(time<zikan)
    {
      gaibunuryoku();
      sougoketugou();
      fuousei();
      naibu_zyoutai();
      hanbetu_gakusyu();
      time=time+1;
    }
  hopfild();
    }
}

 /*外部入力*/

void gaibunuryoku()
{
  int i,j;
  char pattan[masume];
     
  if(kaunter<step)
    {
      kaunter=kaunter+1;
      kasan_zikan=0;
    }
  else
    {
      if(number==5)
        number=0;
      else
        number=number+1;
      kaunter=1; 
      if(kasan==1)
        kasan_zikan=1;   
    }
  if(number==0)
    data_file=fopen("PATTAN/A_pattan.dat","r");
  if(number==1)
    data_file=fopen("PATTAN/B_pattan.dat","r");
  if(number==2)
    data_file=fopen("PATTAN/C_pattan.dat","r");
  if(number==3)
    data_file=fopen("PATTAN/a_pattan.dat","r");
  if(number==4)
    data_file=fopen("PATTAN/b_pattan.dat","r");
  if(number==5)
    data_file=fopen("PATTAN/c_pattan.dat","r");
  for(j=0;j<masume;j++) 
    {
      fscanf(data_file,"%s",pattan);
      for(i=0;i<masume;i++) 
        {
  
          if(pattan[i]=='#')
            in_pattan[time][masume*j+i]=1;
          else
            in_pattan[time][masume*j+i]=-1;
        }
    }
  input_noizu();
  fclose(data_file);
  for(i=0;i<nyuron_kazu;i++)
    {
      if(time==0||kasan_zikan==1)
        gaibu_input[time][i]=v*in_pattan[time][i];   
      else
        gaibu_input[time][i]=Ks*gaibu_input[time-1][i]+v*in_pattan[time][i];
    }
} 

/*ノイズ付加*/

void input_noizu()
{
  int i,j,noizu_same,noizu_kazu,bango,noizu[nyuron_kazu],noi,noizu_onazi;
  
  noizu_kazu=0;
  noizu_same=1;
  noizu[0]=(int)(drand48()*49);
  i=1;
  noizu_kazu=1;
  while(noizu_kazu<noizu_number)
    { 
      noizu_onazi=0;  
      while(noizu_onazi<1)
        {
          noizu_same=0;
          noi=(int)(drand48()*49);     
          if(noi==49)
            noi=48;
          for(j=0;j<i;j++)
            if(noizu[j]==noi)
              noizu_same=1;
          if(noizu_same==0)
            noizu_onazi=1;
          else
            noizu_onazi=0;
        }
      noizu[i]=noi;
      i=i+1;
      noizu_kazu=noizu_kazu+1;
    }
  for(i=0;i<noizu_number;i++)
    {
      if(hanten==1)
        {
          if(in_pattan[time][noizu[i]]==1)
            in_pattan[time][noizu[i]]=-1;
          else
            in_pattan[time][noizu[i]]=1;
        }
      else
        in_pattan[time][noizu[i]]=0;
    }
}

/*ニューロン間の相互結合*/

void sougoketugou()
{
  int i,j;
  double sougo;

  for(i=0;i<nyuron_kazu;i++)
    {
      if(time==0||kasan_zikan==1)
        sougo_input[time][i]=0;
      else
        {
          sougo=0;
          for(j=0;j<nyuron_kazu;j++)
            sougo=wait[i][j]*output[time-1][j]+sougo;
          sougo_input[time][i]=Km*sougo_input[time-1][i]+sougo;
        }
    }
}

/*ニューロン自身の不応性*/

void fuousei()
{
  int i,j; 

  for(i=0;i<nyuron_kazu;i++)
    {
      if(time==0||kasan_zikan==1)
        fuou_input[time][i]=0;
      else
        fuou_input[time][i]=Kr*fuou_input[time-1][i]-a*output[time-1][i]-Q;
    }
}

 /*ニューロンの内部状態*/

void naibu_zyoutai()
{
  int i,j;
  double naibu_input; 

  for(i=0;i<nyuron_kazu;i++)
    {     
      naibu_input=gaibu_input[time][i]+sougo_input[time][i]+fuou_input[time][i];
      output[time][i]=2/(1+exp(-naibu_input/E))-1; 
    }
} 

/*未知、既知パターンの判別 と学習*/
 
void hanbetu_gakusyu()
{
  int i,j,syuusei[nyuron_kazu];
  float zyouken1,zyouken2,zyouken3;

  for(i=0;i<nyuron_kazu;i++) 
    {
      zyouken1=fabs(gaibu_input[time][i])+fabs(sougo_input[time][i]+fuou_input[time][i]);
      zyouken2=fabs(gaibu_input[time][i]+sougo_input[time][i]+fuou_input[time][i]);
      if(zyouken2<zyouken1)     
        {
          lerne[time][i]=10;
          for(j=0;j<nyuron_kazu;j++)
            if(i!=j)
              {
                if(gaibu_input[time][i]*output[time-1][j]>0)    
                  wait[i][j]=wait[i][j]+0.05;
                else            
                  wait[i][j]=wait[i][j]-0.05;
              }
        } 
    }
}

/*ホップフィールドネットによる学習の確認*/

void hopfild()
{
  int i,j,pattan,timezikan,onazi,kaisu;
  double hop,hopfild[nyuron_kazu],maepattan[nyuron_kazu]; 

  timezikan=0;
  for(pattan=0;pattan<6;pattan++)
    {
      for(i=0;i<nyuron_kazu;i++)
        maepattan[i]=in_pattan[timezikan][i];
      onazi=0;
      kaisu=0;
      while(onazi<nyuron_kazu)
        {
          onazi=0;
          for(i=0;i<nyuron_kazu;i++)
            {
              for(j=0;j<nyuron_kazu;j++) 
                hop=wait[i][j]*maepattan[j]+hop;    
              if(hop<0)
                hopfild[i]=-1;
              else
                hopfild[i]=1;
              hop=0;
            }
          for(i=0;i<nyuron_kazu;i++)
            if(maepattan[i]==hopfild[i])
              onazi=onazi+1;
          for(i=0;i<nyuron_kazu;i++)
            maepattan[i]=hopfild[i];
          kaisu=kaisu+1;
          if(kaisu==50)
            onazi=49;
        }
      for(i=0;i<nyuron_kazu;i++)
        output[zikan+pattan][i]=maepattan[i];     
      timezikan=timezikan+step;
      printf("%d\n",kaisu); 
    }
}



Deguchi Toshinori
Wed Jul 12 09:07:09 JST 2000