Listing des Programms KOSKONET.C


/*      Programm koskonet.c                             */        
/*      Bidirektionaler Assoziativspeicher nach         */
/*      Kosko mit Hebb-Lernregel                        */
/*      Burkhard Lenze                                  */
/*      13.02.2009                                      */

/*      header-files                                    */

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

/*      globale Variablen                */

int x[10];                             /*  Eingabevektorfeld           */
int y[10];                             /*  Ausgabevektorfeld           */
int w[10][10];                         /*  Matrixfeld der Gewichte     */
int n;                                 /*  Anzahl der Eingabe-Neuronen */
int m;                                 /*  Anzahl der Ausgabe-Neuronen */
char com;                              /*  Menuparameter               */

/*      Funktionen                     */

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

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

int T(int A)
    {
    if (A>0) return(1);
    if (A<0) return(-1);
    }

void lernen(void)
    {
    int i,j;
    lese_x();
    lese_y();
    for (j=1;j<=m;j++)
         {
         for (i=1;i<=n;i++) {w[i][j]=w[i][j]+(y[j]*x[i]);}
         }
    }

void ausfuehren(void)
    {
    int i,j,u,A,C;
    lese_x();
    u=-1;
    for (j=1;j<=m;j++) y[j]=-1;
    do
      {
      u=u+1;    
      C=0;
      if (u==0) C=1;     
      printf("\n");
      for (i=1;i<=n;i++) {printf("x[%1d] = %4d\n",i,x[i]);}
      for (j=1;j<=m;j++)
          {
          A=0;
          for (i=1;i<=n;i++) {A=A+(w[i][j]*x[i]);}
          if (A!=0)
             {
             if (T(A)!=y[j]) C=1;       
             y[j]=T(A);
             }
          }
      for (i=1;i<=n;i++)
          {
          A=0;
          for (j=1;j<=m;j++) {A=A+(w[i][j]*y[j]);}
          if (A!=0) x[i]=T(A);
          }
      printf("\n");
      for (j=1;j<=m;j++) {printf("y[%1d] = %4d\n",j,y[j]);}
      }
    while (C!=0);
    }
    
void veraendern(void)
    {
    int i,j;
    printf("\n");
    printf("Anzahl n der Neuronen in der Eingabeschicht ? ");
    scanf("%d",&n);
    printf("Anzahl m der Neuronen in der Ausgabeschicht ? ");
    scanf("%d",&m);
    for (i=1;i<=n;i++) {x[i]=-1;}
    for (j=1;j<=m;j++) {y[j]=-1;}
    for (j=1;j<=m;j++)
        {
        for (i=1;i<=n;i++) {w[i][j]=0;}
        }
    }

void zeigen(void)
    {
    int i,j;
    printf("\nDie Gewichte w[i][j] lauten: \n");
    for (j=1;j<=m;j++)
        {
        for (i=1;i<=n;i++)
            {
            printf("w[%1d][%1d]=%3d ",i,j,w[i][j]);
            }
        printf("\n");
        }
    }

void speichern(void)
    {
    int i,j;
    FILE *f;
    char dat[20];
    printf("\nWie lautet die Datei mit den Gewichten ? ");
    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,"%d\n",w[i][j]);}
        }
    fclose(f);
    }

void einlesen(void)
    {
    int i,j,r;
    FILE *f;
    char dat[20];
    printf("\nWie lautet die Datei mit den Gewichten ? ");
    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,"%d",&w[i][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