示例#1
0
        //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);
        }
示例#2
0
        //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);
            }
        }
示例#3
0
        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();
        }
示例#4
0
 public MotorDifuso(List <FuncionMembresia> _entradasDifusas, FuncionMembresia _salidaDifusa, string _direccionBC)
 {
     entradasDifusas = _entradasDifusas;
     salidaDifusa    = _salidaDifusa;
     direccionBC     = _direccionBC;
 }