Hola, en este video hacemos una somera explicación de la implementación que se utilizó en los ejemplos de uso de algoritmos genéticos, para el diseño de sistemas basados en reglas. La tares era implementar, el ciclo completo de la eolística y esa tarea la subdividimos en dos partes para aprovechar dos librerías distintas que teníamos a nuestra disposición. Una parte de concentra en el diseño del sistema basados en reglas y para hacerlo nos basamos en UNFuzzy. La otra parte que es el ciclo completa de iteración, la implementamos utilizando la librería UNGenético, también desarrollo de la Universidad Nacional de Colombia. ¿Cómo lo hicimos? Realmente de buena y facil, aprovechamos el código fuente generado por el programa, lo que hicimos realmente es utilizar las definiciones de las clases que están en los archivos que acompañan al programa, el fuzzy.cpp y el fuzzy.h y de allí utilizamos muchas funcionalidades que estaban you disponibles como la de entrenamientos de universos fijos, la creación de universos de entrada y de salida y la diseño de la máquina de inferencia. Y de un eje genético T, entonces veamos de manera muy breve lo que son los algoritmos genéticos y qué nos puede entregar UNGenético, cómo lo podemos implementar. Los algoritmos evolutivos en general, algoritmo genético en particular, son algoritmos que utilizan ciclos de iteración. Parten de una población inicial que uno como usuario define. Las P en este algoritmo significan esas poblaciones, las poblaciones son colecciones de individuos y esas poblaciones van cambiando en iteración tras iteración en el ciclo de mejoramiento. Bueno puede un individuo realmente, es una posible solución al problema que estamos buscando. Por ejemplo si estamos diseñando un sistema basado en reglas, hay muchísimos sistemas basados en reglas y cada individuo es uno de esos sistemas basado en reglas. Internamente dentro del algoritmo genético, debemos escoger qué cosas son las que estamos buscando, de ese sistema basado en reglas. En el primero de los ejemplos buscamos los modificadores ligústicos, por ejemplo y esos modificadores debemos representarlos internamente en un genoma. Un genoma es una colección de genes, en la jerga de algoritmos genéticos y cada uno de esos genes, tiene algo que ver con lo que estamos buscando. Y por eso es que representa en el genoma. En los ciclos hay que evaluar que tan bueno, que tal malo es ese individuo, de acuerdo a lo que nosotros estamos buscando. Entonces la evaluación se hace en términos de la función objetivo, lo que queremos minimizar. O maximizar si estamos utilizando para maximizar algo. Entonces los procesos de selección, están basados en el desempeño de esa función objetivo y en el proceso la información que están en los genomas se re combina para generar nuevas poblaciones. También se permite digamos dentro del algoritmo, que la información que está en los genes cambian abruptamente, que haya mutación de esa información. Este no es más sino una simplificación muy grande de lo que los biólogos no han explicado es el funcionamiento de selección natural, es un ejemplo de un algoritmo bio inspirado. Bueno, ¿que tiene UNGenético entonces en la aplicación para nuestro problema? Nosotros necesitamos que nuestros individuos sean sistema basados en reglas, que el genoma represente los modificadores lingüísticos, lo cierto que estamos buscando y entonces en cada gen vamos a poner un modificador lingüístico y UNGenético nos va a permitir la implementación de todo el algoritmo. Gracias a UNGenético podemos tener representación de genes de distintos tipos, booleanos, enteros y reales. Por eso decimos que es una librería de algoritmos genéticos con codificación híbrida, porque podemos codificarlo en booleanos, en enteros y en reales o en combinación de esas cosas. La librería también nos entrega una gran colección de operadores. Cada operador está diseñado específicamente para un tipo de gen. Y el algoritmo genético utiliza muchos operadores. Los enumero aquí los de supervivencia, de selección, de cruce, de emparejamiento, reproducción, mutación. Y hay que diseñarlos adecuadamente para cada tipo de gen y en la literatura se encuentran muchas variaciones. Bueno UNGenético es bastante rica en esos operadores. La librería también nos da una clase que es algoritmos genéticos. Que es en la que se implementa todo el ciclo y hace el uso de todos esos operadores, entonces realmente como usuario eso es la clase de necesitamos emplear. Pero para poder funcionar el algoritmos necesita saber qué es lo que tiene que implementar. Para eso la librería tiene una clase abstracta que se denomina individuo y es allí donde nosotros podemos definir cuál es el problema de optimización que tenemos que resolver. Nuestra misión es diseñar una clase heredera de individuo, en donde definimos cinco funciones que son las que está esperando la clase de algoritmo genético, para poder realizar esa optimización. Una vez hemos diseñado esa clase heredera, lo que debemos hacer es utilizar una función que disponible que se llama optimizar. En pocas palabras la tarea del usuario de UNGenético es diseñar esa clase heredera de individuo y lanzar la función de optimización. Vamos entonces a ver cómo construimos esa clase heredera de individuo. Lo que hicimos fue aprovechar herencia múltiple, entonces heredamos por una parte la clase individuo porque la librería de UNGenético y de clase sistema de lógica difusa, de la librería de UNFuzzy y lo combinamos allí todo el el potencial de UNFuzzy y todo el potencial de UNGenético, con herencia múltiple. Luego nuestra tarea pues es simplemente diseñar las cinco funciones específicas que necesitamos, para que el algoritmo sepa qué es lo que tiene que identificar. La función de codificar, es convertir el valor del modificador lingüístico en un gen y ponerlo en el genoma. La clase, la función perdón de codificar es al revés. Tomar el valor del gen desde el genoma y ponerlo en el modificador lingüístico. Es una tarea muy sencilla, casi son pasar los valores de un vector a otro. La clase objetivo lo que debe hacer es calcular la función objetivo. La función objetivo entonces debe leer los patrones de entrenamiento, calcular el valor del sistema basado en reglas y comparar la tabla con lo que está arrojando el sistema. Pero el cálculo es muy fácil porque you nos lo entrega la librería UNFuzzy. Simplemente presentarle los datos de entrada dejar que la librería calcule el resultado, tomar el resultado e ir mitrando el error, el error relativo y calcular el error completo. Luego hay dos funciones utilitarias para crear y copiar los datos de un individuo a otro, en un sistema basado en reglas a otros, entonces debemos allí copiar las variables linguisticas de entrada y salida, copiar los patrones de entrenamiento, las reglas y lanzar las funciones copiar detalles y modificar. Son tareas directas. Bien esta es una presentación muy somera cómo ven ustedes, la librería de UNGenítico también está disponible en mi repositorio de github, con toda la documentación, con el código fuente de este ejemplo y de otros ejemplos y está a su disposición. Muchas gracias.