Listing des Programms PERCEPT1.C
/* Programm percept1.c */
/* Perceptron mit Rosenblatts Perceptron-Lernregel */
/* --- Nichtiterierte Variante --- */
/* Burkhard Lenze */
/* 13.02.2009 */
/* header-files */
#include <stdio.h>
#include <math.h>
#include "percept1.h"
/* globale Variablen */
float x[10]; /* Eingabevektorfeld */
float y[10]; /* Ausgabevektorfeld */
float theta[10]; /* Schwellwertvektorfeld */
float 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("%f",&x[i]);
}
}
void lese_y(void)
{
int j;
printf("\n");
for (j=1;j<=m;j++)
{
printf("y[%1d] = ? ",j);
scanf("%f",&y[j]);
}
}
float T(float A)
{
if (A>-0.00001) return(1.0);
else return(0.0);
}
void lernen(void)
{
int i,j;
float A,y_[10];
lese_x();
lese_y();
for (j=1;j<=m;j++)
{
A=0.0;
for (i=1;i<=n;i++) {A=A+(w[i][j]*x[i]);}
y_[j]=T(A-theta[j]);
for (i=1;i<=n;i++) {w[i][j]=w[i][j]+((y[j]-y_[j])*x[i]);}
theta[j]=theta[j]-(y[j]-y_[j]);
}
}
void ausfuehren(void)
{
int i,j;
float A;
lese_x();
for (j=1;j<=m;j++)
{
A=0.0;
for (i=1;i<=n;i++) {A=A+(w[i][j]*x[i]);}
y[j]=T(A-theta[j]);
}
printf("\n");
for (j=1;j<=m;j++) {printf("y[%1d] = %8.2f\n",j,y[j]);}
}
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]=0.0;}
for (j=1;j<=m;j++) {y[j]=0.0;}
for (j=1;j<=m;j++)
{
theta[j]=0.0;
for (i=1;i<=n;i++) {w[i][j]=0.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]=%8.2f ",i,j,w[i][j]);
}
printf("\n");
}
printf("\nDie Schwellwerte theta[j] lauten: \n");
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];
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