¡Buen camino a todos!
Finaliza el descanso del tiempo vacacional. Nota del autor: Incluir Emoji triste o Emoji llorando. 🙂 Comentábamos que estábamos en un tiempo especialmente bueno para pensar y añadiría también para leer -por supuesto-. Es un tiempo ideal para intentar encontrar nuevas ideas o cualquier enfoque distinto que nos saque de la rutina… y para detenerte en aquellos temas que es complicado ver durante el invierno (al menos con las dosis extra de tiempo que ahora tienes).
Como otros años, éste también, he aprovechado para relajarme con una lectura y pensaba que la entrada era ideal para compartirla con vosotros. A menudo me anticipo… No es raro escuchar algún que otro reproche: -¿Vas a pedir otro libro para tu cumpleaños?. Y como éste cae a mediados de julio, a la mínima oportunidad y fecha cercana estoy enfilando las estanterías de alguna centro comercial o tienda de libros especializado. Y paso bastante tiempo ojeando las tapas y sus resúmenes, en una especie de ritual mágico, buscando algo que le haga especialmente interesante a la elección.
No es el caso de muchos libros que compro en invierno: El de Pawel, Expert Delphi. El de John Kouraklis, MVVM in Delphi. Anteriormente Delphi CookBook de D.Teti. Y podría remontarme algunos títulos mas de N.Hodges. Todos ellos tienen en común que abordan temas del entorno de desarrollo y los utilizo para documentarme y ampliar mis conocimientos, toda vez que la búsqueda de algunos temas en la Red, es demasiado amplia y se pierde mucho tiempo extrayendo datos de aquí y de allá. Me ayuda a conocer el trabajo de muchos de los MVPs destacados de la comunidad Global, que se atreven con estas publicaciones.
Pues a lo que íbamos… en este caso me llamó la atención un libro que hablaba de Inteligencia Artificial: Inteligencia Artificial para desarrolladores. Con el subtítulo: Conceptos e implementación en JAVA. Me quede quieto… Pensativo con la vista fija en la portada. Hay quien diría que mentar a JAVA es casi mentar al demonio. Algo así como lo que sucede en Harry Potter cuando nombras al innombrable. 🙂
Es broma… 😉
Pero no se por qué al final lo compré.
Corrían los primeros días del mes de Julio. Y es un libro que me ha acompañado durante el verano, desde la playa hasta los días que he podido estar de viaje, -¡un libro bastante viajero…!- Y puedo anticipar que me ha parecido magnífico, muy bueno. Un libro que me ha gustado porque la autora, aborda estos temas que pueden ser complejos desde la naturalidad y la sencillez que se agradece, con claridad, con términos que el lector entiende, tanto que a mi personalmente, me sorprendió desde las primeras hojas. Creo que resulta muy didáctico, algo que valoro bastante. Hace un par de semanas, le solicite permiso a la autora para citar el libro en el blog y la felicité porque, como digo, me pareció extraordinario.
No todos los libros que leo me sorprenden tan gratamente como este lo hizo. Y ni siquiera todos los leo de cabo a rabo.
El libro y el autor, breve reseña.
Antes de nada, decir que Virginie Mathivet, la autora, obtuvo Ingeniería Informática en el Instituto Nacional de Ciencias Aplicadas de Lyon, especializada en la rama de Inteligencia Artificial con un diploma en Ingeniería y un DEA DISIC(«Document, Image, et Systèmes d’Information Comunicants»), realizó su tesis sobre algoritmos genéticos y redes neuronales en la misma institución.
Tiene publicados varios libros, en la Editorial ENI, dos de ellos como coautor y los otros dos, a los que hace referencia esta entrada, como autora, desplegando ambos el mismo contenido aunque desde la perspectiva de la implementación en dos lenguajes distintos, Java y C#.
Esta es la portada del que yo adquirí impreso. Hice la compra en el área de libros de una gran superficie.
Y estos son los dos enlaces, a la versión en Java y a C#.
- Inteligencia Artificial para desarrolladores
Conceptos e Implementación en Java - Inteligencia Artificial para desarrolladores
Conceptos e Implementación en C#
El libro tiene 478 páginas y se divide en 7 capítulos que abordan los temas que se citan en la lista inferior, cada uno de ellos acompañados de un ejemplo sencillo que da mayor claridad a lo que meramente es el contenido:
- Sistemas expertos
- Lógica difusa
- Búsqueda de rutas
- Algoritmos genéticos
- Metaheurísticos de optimización
- Sistemas multiagentes y
- Redes neuronales
Y ese creo que ha sido uno de sus aciertos. Las técnicas que describe la autora, se acompañan en muchos casos de los fundamentos que las inspiraron, a veces con descripciones biológicas o físicas. ¡Algo que me ha parecido genial! Los ejemplos son bastante claros. Y aunque aparezcan algunos conceptos matemáticos, inherentes a estas técnicas, no afectan a la comprensión.
Os invito a que leáis el detalle del contenido para no extendernos en estos puntos que se encuentran disponibles en el área de publicación del libro. Allí podéis ver ese detalle.
Lo que sí puedo decir es que el libro parece muy recomendable para iniciarte en los temas de Inteligencia Artificial. En mi caso, era un tema que siempre me fascinó, y sobre el que apenas había leído, y vi en el libro la oportunidad de ampliar esos conocimientos vagos que tenía. Y no me defraudó.
¿Y el código estaba en Java…?
Sí, efectivamente. Posteriormente conocí que también estaba disponible en C# pero yo tampoco tenía mas problema en trabajar con el primero, aunque lógicamente no me pueda sentir tan cómodo como cuando lo hago desde Delphi.
Tras esa primera lectura rápida de los dos capítulos iniciales, sobre sistemas expertos y la lógica difusa, descargaba ese código en JAVA, pues necesitaba ver estos ejemplos ejecutandose sobre el entorno, cosa que hice sobre Eclipse, con mas o menos destreza. En la siguiente imagen se puede ver una captura de este punto.
Pero de cara a aprovechar mejor el contenido que me parecía interesante, decidí portar alguno de los capítulos a Delphi, casi como si fuera un ejercicio de entrenamiento «mental». De esa forma, podía trabajar y ampliar algunos de los conceptos que se abordan en el libro y quizás, también aprovechar esas ideas en alguno de los desarrollos. De momento he portado los capítulos que hacen referencia a los sistemas expertos y la lógica difusa para mi uso propio y aprendizaje. Igualmente el que hace referencia a las estrategias de búsqueda de rutas. El resto de capítulos los he leído también y me han gustado especialmente la optimización con o sin restricciones y los sistemas multiagentes. La verdad es que son temas apasionantes.
Así pues, la portabilidad a Delphi en algunos de los capítulos, ha hecho lógicamente que la lectura se haya extendido hasta finalizar el verano, pues he tenido que ir haciendo paradas y corroborar sucesivamente que ese código portado se correspondía con el original y trabajaba correctamente. Aunque algunas estructuras de programación entre Java y ObjectPascal han sido directas (listas genéricas, colas y pilas de objetos genéricas), he tenido que encontrar algunas equivalencias sobre la marcha en los puntos donde existían diferencias de tipos.
La imagen que tenéis a continuación en formato gif, se corresponde con la visualización del motor de inferencia que Virgina Mathivet implementa en el área de sistemas expertos. En este caso, se ejecuta dentro de nuestro entorno de desarrollo, con Delphi 10.2 Tokio, en una aplicación de consola. Gracias a la plataforma, hice estas pruebas tanto en Linux como en Windows.
Esta es la captura:
La imagen muestra como el motor de inferencia establece unas reglas que permiten que la interacción del usuario, identifique unos polígonos. Como veis es un ejemplo sencillo, fácil de entender y extrapolable a otros contextos.
Respecto a la portabilidad del capitulo de rutas, el enfoque que le di fue básicamente gráfico, lo cual me obligó a buscar la forma de llevar en la práctica el código que estaba enfocado para la aplicación de consola.
Esta es una captura de la aplicación, en ejecución, sobre Seattle y win32.
Una de las cosas que me gusto del enfoque de Viriginie Mathivet fue que estos ejemplos que aborda para documentar las distintas prácticas son bastante genéricos de forma que el lector puede con mayor o menor facilidad, extenderlos, implementando nuevas técnicas o acomodando su uso a nuevos contextos y problemas. Este mapa, por ejemplo, sirve para el análisis de 5 algoritmos distintos, estudiados en función de la «inteligencia» aplicada: Búsqueda en profundidad, búsqueda en anchura, Bellman-Ford, Dijkstra y A* (AStar).
Teniendo esa idea en mente, fui ajustando el código portado para que me permitiera por un lado verificar que era correcto y por otro lado, que el mapa de búsqueda, fuera modificable en ejecución. Lo que me llevó a añadir algunos métodos para inicializar un mapa vacío, o la funcionalidad de arrastrar desde el formulario al tablero para modificar la tipología de una casilla, etc.. Yo, en mi caso, he usado hilos para poder ejecutar simultáneamente dos o mas algoritmos, con una implementación que desacopla las clases para poder ser cargadas mediante nombre, seleccionados mediante el menú, y que permite que se contraste gráficamente sus distintos movimientos sobre el tablero.
Os muestro un pequeño video para que os hagáis una idea:
La idea de usar hilado, además de permitir contrastar distintas técnicas, creo que también nos permitiría, si nos trasladamos al área de los algoritmos genéticos, diseñar estrategias de coevolución, de forma que el aprendizaje de uno revierta en el conocimiento del otro.
Sacar algunas conclusiones…
Para los que se inician creo que estas lineas dejan en el aire la idea de que no siempre los conocimientos quedan a la mano. Es una pequeña lección que aprendemos con el tiempo. En ocasiones deberéis salir a buscarlos y unas veces implicarán mayor esfuerzo, otras menor, pero siempre necesitáis esa actitud de la búsqueda del conocimiento, hambre y curiosidad por todo los que podéis aprender, y siempre con humildad.
He pensado que aunque no podamos compartir el código, si que parece aceptable que algunas ideas que aparecen desarrolladas y adaptadas a otros ejemplos se puedan compartir en alguna futura entrada. Se pueden buscar otros problemas que se puedan resolver aplicando ideas parecidas (resolución puzzle-n enésimo, etc…).
A mi el libro me ha parecido brillante y por lo tanto, igual que hago con otros, lo recomiendo. Además, aborda un tema que me apasiona y sobre el que no he tenido oportunidad nunca de profundizar. Tampoco ha sido un tema que tuviera un perfil propio en Delphi.
Sed felices.