Perceptron Multicapa con Backpropagation en c++

#include <iostream>
#include <cstdlib>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;

double x[6],w[6],alpha,umbral,posi,
esperado[6][7]={
1,1,1,1,1,1,1,//Algunos ejemplos de frutas
0,0,0,0,0,0,0,//Fruta dulce
1,1,1,1,1,0,0,
1,0,1,1,1,1,0,
0,0,0,1,1,1,1,
1,1,0,1,1,0,1},f;
double getY1() {
    double wx, y1;
    wx=0;
    for(int i=0;i<6;i++){
  wx = (x[i] * w[i]) + wx;//Función propagación
 }
    y1 = tanh(wx); //Salida
    return y1;
}
void reevaluarW(){//Cuando hay error
    for(int i=0;i<6;i++){
  f = (double)rand()/ RAND_MAX;
  w[i] = w[i] + alpha * (esperado[i][0] - getY1()) * x[i];  
 }
}
int main(){
 srand(time(NULL));
 int ex;
 while(true){ 
 int fac; 
 for(int i=0;i<6;i++){
  //Inicializa Valores Pesos (aleatorios)[-1,1]
  f = (double)rand()/ RAND_MAX;
  w[i] = -1 + f * (1+1);  
 }
 //Inicializa Alfa
 alpha = f;
 umbral = -1 + f * (1+1);
  
 //Inicializa Umbral
 cout<<"Ingrese entradas: "<<endl;
 cout<<"Entrada 1: Cascara comestible (si:1) (no:0)"<<endl;
 cout<<"Entrada 2: Semillas comestibles (si:1) (no:0)"<<endl;
 cout<<"Entrada 3: Sabor dulce (si:1) (no:0)"<<endl;
 cout<<"Entrada 4: Color cascara rojo o amarillo (si:1) (no:0)"<<endl;
 cout<<"Entrada 5: Color interior blanco o translucido (si:1) (no:0)"<<endl;
 cout<<"Entrada 6: Consistencia Dura (si:1) (no:0)"<<endl;
 cout<<endl;
 for(int i=0;i<6;i++){ 
  cout<<"Entrada #"<<i+1<<": ";cin>>x[i];cout<<endl;  
  if(x[i]>1 || x[i]<0){
   i--;
   cout<<"Entrada erronea, vuelvala a ingresar correctamente"<<endl;
  }
 }
 cout<<"Que funcion de activacion desea usar (Hardlim (1), Hardlims (2)): ";cin>>fac;cout<<endl;
 cout<<"Las entradas y pesos fueron: "<<endl;
 for(int i=0;i<6;i++){
  cout<<"Entrada #"<<i+1<<": "<<x[i]<<endl;
  //Valores Pesos (aleatorios)
  cout<<"Peso #"<<i+1<<": "<<w[i]<<endl;  
 }   
    
    int aux_sal;
    if(getY1()>0)
 {
  aux_sal=1;
 }
 if(getY1()<=0 && fac==1){
  aux_sal=0;
 }else if(getY1()<=0 && fac==2){
  aux_sal=-1;
 }
    int cont=0,fallos,cont2=0;bool final;
    final=false;fallos=0;
    while (final==false && fallos<=50){
     cont=0;    
  for(int i=0;i<6;i++){
         for(int j=1;j<7;j++ ){
    if(esperado[i][j]!=x[j-1]){
     if(aux_sal != esperado[i][0]){
      cont2++; 
     }     
    }else if(esperado[i][j]==x[j-1]){     
     if(aux_sal == esperado[i][0]){
      final=true;      
     }else{
      cont++;
     }     
    }
   }
  }
  if (cont>=1 && final==false){   
   //cout<<"Error fatal, se procede a ajustar pesos"<<endl;
   reevaluarW();
   if(getY1()>0){
    aux_sal=1;
   }
   if(getY1()<=0 && fac==1){
    aux_sal=0;
   }else if(getY1()<=0 && fac==2){
    aux_sal=-1;
   }
   fallos++;
  }else{
   final=true;
  }
    }
    if(fallos>=50){
        cout<<"El sistema llego a su limite de fallos"<<endl;
    }     
    cout<<"La salida es = "<<aux_sal<<endl;
 if(aux_sal==1)
 {
  cout<<"Es comestible"<<endl;
 }else{
  cout<<"No es comestible"<<endl;
 }
 cout<<"Desea salir? (si:1) (no:0)"<<endl;cin>>ex;
 if(ex==1){
  exit(0);
 }
 }
    system("PAUSE");
 return 0;
}

Comentarios