Listing des Programms PERCEPT2.C


/*      Programm percept2.c                                */        
/*      Perceptron mit Rosenblatts Perceptron-Lernregel    */
/*      --- Iterierte Variante ---                         */
/*      Burkhard Lenze                                     */
/*      13.02.2009                                         */

/*      header-files                                       */

#include <stdio.h>
#include <math.h>
#include "percept2.h"

/*      globale Variablen                */

float x[10][100];                /*  Eingabevektorfeld                */
float y[10][100];                /*  Ausgabevektorfeld                */
float theta[10];                 /*  Schwellwertvektorfeld            */
float w[10][10];                 /*  Matrixfeld der Gewichte          */
float x_test[10];                /*  Aktueller Testeingang            */
float y_test[10];                /*  Aktueller Testausgang            */
int n;                           /*  Anzahl der Eingabe-Neuronen      */
int m;                           /*  Anzahl der Ausgabe-Neuronen      */
int t;                           /*  Anzahl der Assoziationen         */
int s;                           /*  Anzahl der Trainingszyklen       */
int s_max;                       /*  Maximalzahl der Trainingszyklen  */
char com;                        /*  Menuparameter                    */

/*      Funktionen               */

void lese_x_test(void)
    {
    int i;
    printf("\n");
    for (i=1;i<=n;i++)
         {
         printf("x[%1d] = ? ",i);
         scanf("%f",&x_test[i]);
         }
    }

void lese_x(void)
    {
    int i;
    printf("\n");
    for (i=1;i<=n;i++)
         {
         printf("x[%1d][%3d] = ? ",i,s);
         scanf("%f",&x[i][s]);
         }
    }

void lese_y(void)
    {
    int j;
    printf("\n");
    for (j=1;j<=m;j++)
         {
         printf("y[%1d][%3d] = ? ",j,s);
         scanf("%f",&y[j][s]);
         }
    }

float T(float A)
    {
    if (A>-0.00001) return(1.0);
    else return(0.0);
    }

void lernen(void)
    {
    int i,j,st,err,z;
    float A,y_[10];
    for (s=1;s<=t;s++)
        {
        lese_x();
        lese_y();
        }
    s=0;
    do
      {
      err=0; 
      s=s+1;
      for (st=1;st<=t;st++)
          {
          for (j=1;j<=m;j++)
              {
              A=0.0;
              for (i=1;i<=n;i++) {A=A+(w[i][j]*x[i][st]);}
              y_[j]=T(A-theta[j]);
              for (i=1;i<=n;i++)
                  {
                  w[i][j]=w[i][j]+((y[j][st]-y_[j])*x[i][st]);
                  }
              theta[j]=theta[j]-(y[j][st]-y_[j]);
              }
          }
      for (st=1;st<=t;st++)
          {
          for (j=1;j<=m;j++)
              {
              A=0.0;
              for (i=1;i<=n;i++) {A=A+(w[i][j]*x[i][st]);}
              y_[j]=T(A-theta[j]);
              if (fabs(y[j][st]-y_[j])>0.000001) {err=err+1;}
              }
          }
      z=1;
      if ((s_max/100)>=1) {z=s_max/100;}
      if (s%z==0)
         {
         printf("\nEs wurden bereits %8d Lernzyklen durchlaufen! ",s);
         printf("\nDer summierte absolute Fehler lautet: %3d ",err);
         }
      if (err==0)
         {
         printf("\n\nEs wurden genau %8d Lernzyklen durchlaufen! ",s);
         printf("\nDer summierte absolute Fehler lautet: %3d ",err);
         printf("\n\nKonvergenz des Lernalgorithmus !!!\n");
         }
      if (s==s_max)
         {
         printf("\n\nEs wurden genau %8d Lernzyklen durchlaufen! ",s);
         printf("\nDer summierte absolute Fehler lautet immer noch: %3d ",err);
         printf("\n\nAbbruch des Lernalgorithmus !!!\n");
         }
      }
      while ((err!=0)&&(s!=s_max));
    }

void ausfuehren(void)
    {
    int i,j;
    float A;
    lese_x_test();
      for (j=1;j<=m;j++)
          {
          A=0.0;
          for (i=1;i<=n;i++) {A=A+(w[i][j]*x_test[i]);}
          y_test[j]=T(A-theta[j]);
          }
    printf("\n");
    for (j=1;j<=m;j++) {printf("y[%1d] = %8.2f\n",j,y_test[j]);}
    }

void veraendern(void)
    {
    int i,j;
    s=0;
    printf("\n");
    printf("Anzahl n der Neuronen in der Eingabeschicht ? ");
    scanf("%d",&n);
    printf("Anzahl m der Neuronen in der Ausgabeschicht ? ");
    scanf("%d",&m);
    printf("Anzahl t der zu lernenden Assoziationen ? ");
    scanf("%d",&t);
    printf("Anzahl s_max der maximal zu durchlaufenden Lernzyklen ? ");
    scanf("%d",&s_max);
    for (i=1;i<=n;i++) {x[i][0]=0.0;}
    for (j=1;j<=m;j++) {y[j][0]=0.0;}
    for (j=1;j<=m;j++)
        {
        for (i=1;i<=n;i++) {w[i][j]=0.0;}
        theta[j]=0.0;
        }
    }

void zeigen(void)
    {
    int i,j;
    printf("\nDie Gewichte w[i][j] lauten nach %8d Lernzyklen: \n",s);
    for (j=1;j<=m;j++)
        {
        for (i=1;i<=n;i++)
            {
            printf("w[%1d][%1d]=%8.2f   ",i,j,w[i][j]);
            }
        printf("\n");
        }
    printf("\nDie Schwellwerte theta[j] lauten nach %8d Lernzyklen: \n",s);
    for (j=1;j<=m;j++)
        {
        printf("theta[%1d] = %8.2f\n",j,theta[j]);
        }
    printf("\n");
    }

void speichern(void)
    {
    int i,j;
    FILE *f;
    char dat[20];
    printf("\nWie lautet die Datei mit den Gewichten und Schwellwerten ? ");
    scanf("%s",&dat);
    f=fopen(dat,"w");
    fprintf(f,"%d\n",n);
    fprintf(f,"%d\n",m);
    for (j=1;j<=m;j++)
        {
        for (i=1;i<=n;i++) {fprintf(f,"%f\n",w[i][j]);}
        }
    for (j=1;j<=m;j++) {fprintf(f,"%f\n",theta[j]);}
    fclose(f);
    }

void einlesen(void)
    {
    int i,j,r;
    FILE *f;
    char dat[20];
    s=0;
    printf("\nWie lautet die Datei mit den Gewichten und Schwellwerten ? ");
    scanf("%s",&dat);
    f=fopen(dat,"r");
    fscanf(f,"%d",&r);
    if (r==n)
       {
       fscanf(f,"%d",&r);
       if (r==m)
          {
          for (j=1;j<=m;j++)
              {
              for (i=1;i<=n;i++) {fscanf(f,"%f",&w[i][j]);}
              }
          for (j=1;j<=m;j++) {fscanf(f,"%f",&theta[j]);}
          }
       else
          {
          printf("\nFehler! m ist in Datei %2d statt %2d \n",r,m);
          }
       }
    else
       {
       printf("\nFehler! n ist in Datei %2d statt %2d\n",r,n);
       }
    fclose(f);
    }

/*      Hauptprogramm                    */

int main(void)
    {
    veraendern();
    do
      {
      printf("\nlernen ausfuehren zeigen veraendern speichern einlesen beenden:\n");
      fflush(stdin);
      scanf("%c",&com);
      switch(com)
            {
            case 'l': lernen(); break;
            case 'a': ausfuehren(); break;
            case 'z': zeigen(); break;
            case 'v': veraendern(); break;
            case 's': speichern(); break;
            case 'e': einlesen(); break;
            default:  break;
            }
      }
    while (com!='b');
    return(0);
    }






Burkhard Lenze
Im Februar 2009