Visualización de árboles de búsqueda usando LaTeX

En el trabajo práctico número 1 de Inteligencia Artificial, tuvimos que programar un pacman para que actuara en un ambiente donde había enemigos y alimento. Debíamos utilizar alguna estrategia de búsqueda.

En este tipo de estrategias, para encontrar una buena acción a llevar a cabo, el agente genera un árbol. El nodo principal representa el estado inicial del mismo. Por ejemplo, dicho estado indica que está en la posición (X,Y), con una cantidad determinada de energía y el conocimiento de N celdas. El agente aplica las acciones que son posibles en este nodo (estado), y así genera más nodos, que serán los hijos del primero, por cada una de las acciones aplicadas. Esto representa la expansión del nodo principal.

Así el agente va expandiendo nodos. Una vez que lo hace con el nodo principal, tiene que elegir otro. Y aquí es justamente donde difiere cada estrategia. Por lo demás, son idénticas. Algunas de las formas de ir eligiendo los nodos podría ser por profundidad, amplitud, o costo uniforme. En esta última existe un costo por cada acción, y la estrategia elije el siguiente nodo a expandir según cuál tenga el menor costo. Otra estrategia es la avara, la cual en lugar de utilizar un costo para los nodos, usa una heurística, que indica qué tan lejos del objetivo está, entonces toma una decisión según la acción que más lo acerque al mismo.

Volviendo al tema del post, en el trabajo práctico teníamos que mostrarle a los profesores que nuestro código funcionaba correctamente, es decir, si habíamos elegido la estrategia de amplitud, entonces la lista de nodos expandidos tenía que tener un orden de acuerdo a la misma. Una forma de hacerlo era escribir un archivo XML que vaya indicando cómo se forma el árbol y qué nodos se eligen. Pero es un poco tedioso leer un archivo así.

Continuá leyendo Visualización de árboles de búsqueda usando LaTeX

2da Jornada Python en Santa Fe

El 9 de junio se va a realizar la 2da Jornada Python en el Auditorio de la UTN – Facultad Regional Santa Fe, organizado por el LUGli. Las charlas se realizarán desde las 8.30 hasta las 18.30. Las mismas cubren una gran variedad de niveles, desde básicas como “Introducción a Python“, a muy avanzadas como “Usando Python para testeos de seguridad mediante simulación automática de ataques“. La entrada es libre y gratuita.

Python es un lenguaje de programación libre, multiplataforma, poderoso y al mismo tiempo muy fácil de utilizar. Si bien, siendoles sincero, nunca lo he aprendido y utilizado (por falta de tiempo), sí he visto código y experiencias de profesionales que afirman esto. Si estas interesando en aprender un nuevo lenguaje de programación, te recomiendo elegir python, y asistir a estas jornadas, que se realizan por segundo año consecutivo en nuestra ciudad. Es muy recomendable registrarse, y de ser posible, adquirir un certificado del evento, no sólo por las razones obvias, sino también para apoyarnos económicamente.

Patch para inadyn

Tengo un dominio que apunta a mi máquina, y uso inadyn para actualizar la IP. El problema con este software es que no tiene una opción para escribir el PID a un archivo externo, y así poder utilizar start-stop-daemon con algún script para poder detenerlo (stop). Creo que esa es la forma más correcta de detener un daemon desde un script.

Les dejo el patch para el código fuente versión 1.96.2, y un script de inicialización para inadyn.

Nota: No se si se debe a la transferencia FTP o qué, pero no pude hacer que cuando hagan click en los links se puedan bajar los archivos, y no verlos, como actualmente pasa. Si bien no impide bajarlos, sería mejor que sea así. ¿Alguien sabe como solucionarlo?

Java: Wrapper para clases en el default package

Si tu proyecto en Java tiene una clase que no pertenece a ningún paquete (no posee al principio la sentencia “package…”), entonces pertenece al default package. Si intentan utilizar esa clase desde otra clase sin paquete no hay problemas, pero es imposible hacerlo (a partir de java 1.4) desde clases que sí pertenecen a algún paquete. Averiguar esto me llevó gran parte de la tarde. Ya veo que le pifié en algo y la cosa era mucho mas sencilla…

Bueno, ese es el problema con la clase Calculador que proveyó la cátedra de Inteligencia Artificial. No tiene paquete. Si ya se armaron todo su código ordenadito en paquetes no van a poder utilizarla. Sólo se puede desde una clase sin paquete… pero queda muy desordenado poner todas las clases en un mismo paquete, y además no es recomendado.

Pero hay una solución. Podemos seguir teniendo nuestro proyecto ordenado y utilizar esta bendita clase.

Continuá leyendo Java: Wrapper para clases en el default package

Copyleft: Idealismo pragmático

Terminamos la pasantía en Software Santa Fe. Hemos aprendido mucho con César. Trabajamos con .NET en un proyecto de la empresa. Lamentablemente la mayor parte del tiempo estuvimos con Visual Basic… Seguramente escucharon mucho sobre él: sépanlo, es un lenguaje horrible.

También entregamos el TP final de Diseño e Implementación de Estructuras de Datos, el cual ya comenté algo en un post anterior. Una consecuencia del mismo fue un evaluador de expresiones matemáticas. Si escribíamos “5+x*8/(1+x!)” con algún valor para x nos devolvía el resultado. Todo el código lo liberamos (los autores son Sebastián Galiano, César Sandrigo y yo) bajo la GNU LGPL. Es decir que, sino me equivoco, el código puede ser linkeado por un programa libre o no-libre, y en caso de ser una librería puede ser “usado por” un programa propietario. Las restricciones copyleft son aplicadas a la librería misma, y no se “contagian” (como pasa con la GPL) a los programas que enlazan a ella.

El repositorio que posee el código fuente del trabajo práctico (Java), que tiene un graficador y aproximador, es http://opensvn.csie.org/tp_died.

La gente de SSF (Software Santa Fe), en uno de sus proyectos, necesitaba un software parecido a éste. Le propusimos utilizar el nuestro, haciéndoles saber que éste era libre, y los cambios hechos debían ser publicados también bajo la misma licencia. Después de consultarlo con la gente que toma estas decisiones, aceptaron y comenzamos a trabajar. El trabajo consistió en pasar casi la totalidad del código Java (del TP) a C#, y adaptarlo a las necesidades del proyecto de SSF. Pronto voy a subir los cambios de las últimas revisiones del evaluador escrito en C#, que si bien es un poco específico para el proyecto en el que trabajamos, no deja de ser una pieza de software útil.

Continuá leyendo Copyleft: Idealismo pragmático

Extendiendo el polimorfismo…

… o “Diciendo estupideces sobre orientación a objetos”. Sigan leyendo el post y después se darán cuenta de cuál es el título que tiene que ir.

Aproximando una función

La semana que viene entregamos el TP final de DIED. Se trata de una especie de calculadora avanzada. Comenzó como un evaluador de expresiones. Luego se extendió para soportar funciones de usuario personalizadas, como “sumar(a,b) = a + b”, y finalmente el software tiene que graficar funciones, y también aproximar con la técnica de diferencias divididas (disculpen el habérselo recordado). Con respecto a esto último, uno va agregando puntos en un eje cartesiano, los mueve, lo borra, y el polinomio se va generando/graficando en vivo y en directo.

Continuá leyendo Extendiendo el polimorfismo…

The Joel test: ¿Qué tan bueno es su equipo de desarrollo?

¿Utilizan software de control de versiones?
¿Pueden generar el producto en un solo paso?
¿Compilan el producto diariamente?
¿Tienen una base de datos para los bugs?
¿Corrigen los bugs antes de añadir más código?
¿Poseen una planificación actualizada?
¿Tienen un documento de especificaciones?
¿Los programadores están en un lugar tranquilo?
¿Utilizan las mejores herramientas que puedan comprar?
¿Tienen gente para probar los productos (testers)?
¿Hacen escribir código a los nuevos candidatos en las entrevistas?
¿Hacen pruebas de usabilidad “de vestíbulo”?

Dando un punto por cada “si”, podemos evaluar rápidamente y de forma sencilla a nuestro equipo de desarrollo, según Joel on Software, en éste artículo, el cual también está traducido al español.

Utilidades para desarrollar en Minix

Quiero compartir con ustedes unas herramientas muy simples que usamos para hacer los trabajos prácticos de DISO.

Son, como dije, muy sencillas: dos sirven para ayudar a armar la documentación (LaTeX), y la otra es para chequear si los archivos que tenemos en nuestra máquina son iguales a los que están en Minix (es decir, con los que estuvimos probando realmente).

Seguramente este post no es de mucho interés para todos, pero quizá les sirva si alguna vez realizan un TP con LaTeX, en el cual deban incluir código fuente de algún programa, o publicar sólo las modificaciones de algún archivo existente (diff).

Continuá leyendo Utilidades para desarrollar en Minix