//Evalua las reglas private FuncionMembresia evaluarRegla(List <string> reglaString) { FuncionMembresia salida = null; for (int j = 0; j < reglaString.Count; j++) { if (reglaString[j] == "AND") { salida = buscarMin(reglaString[j - 3], reglaString[j - 1], reglaString[j + 1], reglaString[j + 3]); j -= 3; reglaString.RemoveRange((j), 7); reglaString.Insert(j, salida.Nombre); reglaString.Insert(j + 1, "es"); reglaString.Insert((j + 2), salida.Conjunto.Nombre); j = 0; } else if (reglaString[j] == "THEN") { FuncionMembresia salidaConsecuente = new FuncionMembresia(salida.Nombre, salida.Conjunto); return(salidaConsecuente); } } return(salida); }
//Calcula la regla min private FuncionMembresia buscarMin(string varLing1, string valLing1, string varLing2, string valLing2) { FuncionMembresia funcMem1 = null; FuncionMembresia funcMem2 = null; ConjuntoDifuso conjunto1; ConjuntoDifuso conjunto2; //Asigno las variables a comparar for (int i = 0; i < entradasDifusas.Count; i++) { if (entradasDifusas[i].Nombre == varLing1) { for (int j = 0; j < entradasDifusas[i].ConjuntosDifusos.Count; j++) { if (entradasDifusas[i].ConjuntosDifusos[j].Nombre == valLing1) { conjunto1 = entradasDifusas[i].ConjuntosDifusos[j]; funcMem1 = new FuncionMembresia(entradasDifusas[i].Nombre, conjunto1); } } } else if (entradasDifusas[i].Nombre == varLing2) { for (int j = 0; j < entradasDifusas[i].ConjuntosDifusos.Count; j++) { if (entradasDifusas[i].ConjuntosDifusos[j].Nombre == valLing2) { conjunto2 = entradasDifusas[i].ConjuntosDifusos[j]; funcMem2 = new FuncionMembresia(entradasDifusas[i].Nombre, conjunto2); } } } } //Evaluo a partir del metodoMax de mandani if ((funcMem1 != null) && (funcMem2 != null)) { if (funcMem1.Conjunto.GradoPertenencia < funcMem2.Conjunto.GradoPertenencia) { return(funcMem1); } else { return(funcMem2); } } else { return(null); } }
public static void Main(string[] args) { Console.WriteLine("-------------LOGICA DIFUSA-------"); //Se definen los conjuntos difusos de entrada ConjuntoDifuso otro = new ConjuntoDifuso("Otro", new FuncionPertenencia("Funcion L", 0.3, 0.4)); otro.agregarLimitesConjunto(0.0, 0.4, 0.1); ConjuntoDifuso humano = new ConjuntoDifuso("Humano", new FuncionPertenencia("Funcion Trapezoidal", 0.3, 0.4, 0.6, 0.8)); humano.agregarLimitesConjunto(0.3, 0.8, 0.1); ConjuntoDifuso bebe = new ConjuntoDifuso("Bebe", new FuncionPertenencia("Funcion Gamma", 0.6, 0.8)); bebe.agregarLimitesConjunto(0.6, 1.0, 0.1); List <ConjuntoDifuso> conjuntosTipoSonido = new List <ConjuntoDifuso>() { otro, humano, bebe }; ConjuntoDifuso debil = new ConjuntoDifuso("Debil", new FuncionPertenencia("Funcion L", 0.3, 0.6)); debil.agregarLimitesConjunto(0.0, 0.6, 0.1); ConjuntoDifuso fuerte = new ConjuntoDifuso("Fuerte", new FuncionPertenencia("Funcion Gamma", 0.4, 0.6)); fuerte.agregarLimitesConjunto(0.4, 1.0, 0.1); List <ConjuntoDifuso> conjuntosIntensidad = new List <ConjuntoDifuso>() { debil, fuerte }; ConjuntoDifuso puntual = new ConjuntoDifuso("Puntual", new FuncionPertenencia("Funcion L", 0.1, 0.2)); ConjuntoDifuso normal = new ConjuntoDifuso("Normal", new FuncionPertenencia("Funcion Trapezoidal", 0.1, 0.2, 0.5, 0.7)); ConjuntoDifuso continuo = new ConjuntoDifuso("Continuo", new FuncionPertenencia("Funcion Gamma", 0.5, 0.7)); List <ConjuntoDifuso> conjuntosDuracion = new List <ConjuntoDifuso>() { puntual, normal, continuo }; List <FuncionMembresia> entradasDifusas = new List <FuncionMembresia>() { new FuncionMembresia("TipoSonido", conjuntosTipoSonido), new FuncionMembresia("Intensidad", conjuntosIntensidad), new FuncionMembresia("Duracion", conjuntosDuracion) }; //Se definen los conjuntos difusos de salida List <ConjuntoDifuso> conjuntosModo = new List <ConjuntoDifuso>() { new ConjuntoDifuso("Espera", new FuncionPertenencia("Funcion L", 0.3, 0.7)), new ConjuntoDifuso("Normal", new FuncionPertenencia("Funcion Gamma", 0.3, 0.7)) }; FuncionMembresia modo = new FuncionMembresia("Modo", conjuntosModo); //Proceso de fusificacion Fusificacion.Fusificacion fusificador = new Fusificacion.Fusificacion(entradasDifusas); fusificador.agregarEntrada("TipoSonido", 0.75); fusificador.agregarEntrada("Intensidad", 0.57); fusificador.agregarEntrada("Duracion", 0.54); fusificador.fusificar(); List <FuncionMembresia> entradasFusificadas = fusificador.EntradasFusificadas; MotorDifuso inferencia = new MotorDifuso(entradasDifusas, modo, "BaseDeConocimiento"); inferencia.inferir(); Console.ReadLine(); }
public MotorDifuso(List <FuncionMembresia> _entradasDifusas, FuncionMembresia _salidaDifusa, string _direccionBC) { entradasDifusas = _entradasDifusas; salidaDifusa = _salidaDifusa; direccionBC = _direccionBC; }