#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
Publicar un comentario