Está en la página 1de 2

/* Perceptron */

#include<iostream.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>
#define LIMITE 100
/* Maximo numero de patrones de entrada */
#define NUM 100
/* Maximo numero de variables de entrada */
#define SESIONES 3000 /* Maximo numero de iteraciones de aprendizaje */
#define ERROR 0.001 /* Maximo error permitido en el aprendizaje */
typedef float vector[NUM];
typedef float matriz[LIMITE][NUM];
float A,B, alfa = 0.5;
// producto escalar
float prodscalar(vector xx, vector ww, int NE)
{
int i;
float s = 0.0;
for ( i = 0 ; i <= NE ; i++ ) s += ( xx[i] * ww[i] );
return s;
}
// Entrena la red con todos los patrones de entrada
int entrena(vector d,matriz x, vector w, int NE, int NP)
{ float Net;
int y, i,t=1,f;
for ( f = 1 ; f <=NP ; f++ )
{ Net=prodscalar(x[f],w,NE);
if(Net>=0) y=A; else y=B;
if(abs(d[f] - y)>ERROR){ t=-1;
for(i=0;i<=NE;i++)
w[i]=w[i]+alfa*(d[f]-y)*x[f][i];
}
}
return t;
}
// introduccion de datos
void leedatos(vector d,matriz x, int *ne,int *np)
{
int i,j;
cout<<" Total numero de variables de entrada= "; cin>>*ne;
cout<<" Total numero de patrones de entrada= "; cin>>*np;
/* valores 1 en la entrada a la neurona ficticia */
for (i=1; i<=*np;i++)x[i][0]=1;
/* introducir datos de entrada*/
for (i=1; i<=*np;i++){
cout<<"introducir patron de entrada numero "<<i<<endl;
for (j=1; j<=*ne;j++){
cout<<"variable entrada x["<<j<<"]= "; cin>>x[i][j];
}
cout<<"salida deseada para patron de entrada numero "<<i<<" d=
";cin>>d[i];
}
}
// Muestra resultados
void
imprime(vector d,matriz x,vector w,int NE,int NP)
{
float Net; vector y;
int i,j,f;
for ( f = 1 ; f <=NP ; f++ )
{ Net=prodscalar(x[f],w,NE);
if(Net>=0) y[f]=A; else y[f]=B;
}
cout<<"valores obtenidos"<<endl;

cout<<"patrones-entrada
salidas"<<endl;
for(j=1;j<=NE;j++) printf(" x[%d] ",j);
printf("obtenida deseada\n");
for(i=1;i<=NP;++i){
for(j=1;j<=NE;j++) printf("%4.1f ",x[i][j]);
printf(" %4.1f
%4.1f\n",y[i],d[i]);
}
}
//------main
void main()
{
int i,ne,np,test;
vector d,w; matriz x;
clrscr();
cout<<"introducir los posibles valores de salida"<<endl;
cout<<"A= "; cin>>A;
cout<<"B= "; cin>>B;
cout<<"Introducir valores para entrenamiento de la red"<<endl;
leedatos(d,x,&ne,&np);
/* asignacion de valores iniciales para los pesos*/
for (i=0;i<=ne;i++) w[i] = 0.0;
/* entrena la red */
test=-1;
while ( (test== -1 ) && ( i++ < SESIONES ) ){
test=entrena(d,x,w,ne,np);
}
imprime(d,x,w,ne,np);
/* test de la red */
cout<<"introducir valores para test de la red"<<endl;
leedatos(d,x,&ne,&np);
imprime(d,x,w,ne,np);
getch();
}

También podría gustarte