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