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.

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

Frases de Stuart J. Russell y Peter Norvig

Antes hice lo mismo con Andrew S. Tanenbaum. Estos dos son los autores del libro Inteligencia Artificial, un enfoque moderno, Segunda Edición. Parece que estos tipos tienen un humor similar al del autor de Minix, por lo que la lectura, en mi caso, se hace mucho más placentera.

Primero aclaro qué es un “agente”:

Agente: Un agente es cualquier cosa capaz de percibir su medioambiente y actuar en ese medio.

Ahí van algunas de sus frases:

Página 40: Sobre el concepto de racionalidad y las medidas de rendimiento.

Las medidas de rendimiento incluyen los criterios que determinan el éxito en el comportamiento del agente… Obviametne, no hay una única medida adecuada para todos los agentes. Se puede preguntar al agente por su opinión subjetiva acerca de su propia actuación, pero muchos agentes serían incapaces de contestar, y otros podrían engañarse a sí mismo.
Nota al pie: Los agentes humanos son conocidos en particular por su acidez, hacen creer que no quieren algo después de no haberlo podido conseguir, por ejemplo: “Ah bueno, de todas formas no quería ese estúpido Premio Nobel”.

Continuá leyendo Frases de Stuart J. Russell y Peter Norvig

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…

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

Planificación por prioridades en Minix

De eso se trató el TP2 de DISO (Diseño e implementación de Sistemas Operativos). Al terminar de implementar una idea de cómo hacerlo, debíamos correr un programa dos veces, cambiarle la prioridad a uno de los dos, y verificar que uno imprimía más veces su pid que el otro.

El enunciado era claro, y guiaba bastante en cómo hacerlo. Además ya habíamos asistido a una clase de práctica, por lo que no deberían haber aparecido complicaciones mayores. Aunque en realidad no terminó siendo así.

Estaría muy bueno saber cómo hace la gente del kernel Linux para debuggearlo. Pablo Pessolani, el profesor de teoría y titular de DISO, nos explicaba que la técnica consiste en usar la muy conocida función printf, así de simple. Luego de reflexionarlo un poco, la verdad es que no parece haber otra alternativa. Siguiendo la misma estrategia, así fue como testeamos el código modificado de Minix 2.0.2 para completar el trabajo práctico 2.

Sin embargo me quedó la pica de cómo hacen los hackers de Linux para testear sus modificaciones. Pensaba que quizá tengan alguna forma más cómoda y adecuada. Entonces averigué qué técnicas utilizan, por simple curiosidad, y me sorprendió un poco el descubrimiento.

Continuá leyendo Planificación por prioridades en Minix

Una estrategia para desarrollar en Minix

En Diseño e implementación de Sistemas Operativos (diso, de a aquí en mas) tenemos que tocar el código fuente del kernel Minix. El primer trabajo práctico se trata de la implementación de una llamada al sistema.

Por supuesto que utilizamos algún emulador para correr este mini Unix. Pero ¿cómo trabajar? ¿cómo modificar el kernel y testearlo? ¿Desde Minix con vi y la shell que no recuerda los comandos que ejecutamos?. Estaría bueno trabajar en GNU/Linux (o el sistema que utilicemos), mover los cambios de alguna forma a la partición de Minix, compilar allí y verificar que todo funcione correctamente.

Continuá leyendo Una estrategia para desarrollar en Minix