ixaidev por Ixai Lanzagorta Ochoa
Categories: Uncategorized, [AI2008]

Las 8 reinas es un problema en el cual se tienen que colocar ocho reinas en un tablero de ajedrez con la condición de que no se ataquen entre sí. Como parte de mi materia de Agentes Inteligentes nos dejaron solucionar este problema utilizando distintos algoritmos de búsqueda en árboles, en este post voy a presentar mis resultados y mi experiencia al momento de estar optimizando el algoritmo, tanto en Java como en Python. El rendimiento se mide en tiempo, no subo el código todavía pero prometo tenerlo pronto.

1.- La primera parte de la entrega consistía en un algoritmo que solucione las ocho reinas sin ninguna consideración especial (o búsqueda a ciegas), lo único “optimizado” es que no genera nodos que sean inválidos (o no pone reinas donde serian atacadas por una que ya estaba antes).

Java

time java ochoreinas.Main

real    0m0.239s
user    0m0.209s
sys    0m0.029s

De acuerdo con el profiler de NetBeans, esta ejecución genera 26093 nodos.

Python

time python _Main.py

real    0m7.666s
user    0m7.616s
sys     0m0.014s

time python Main.py

real    0m1.218s
user    0m1.154s
sys    0m0.009s

De acuerdo con el profiler de python, esta ejecución también genera 26093 nodos (confirmando que el algoritmo esta funcionando igual). La (drástica) diferencia entre _Main.py y Main.py es que uno genera nodos _Nodo, que en su constructor reciben un _Nodo padre y copian las matrices de reinas y posiciones inválidas haciendo uso del modulo copy de python; mientras que el otro genera nodos Nodo, que en su constructor reciben un Nodo padre y copian las matrices “a mano”, esta fue mi primera optimización, o corrección de errores propios (porque tengo mas interés en aprender python que java).

Método __init__ de _Nodo:

def __init__(self, padre=None):if type(padre) == type(self):
self.padre = padre
self.tablero = copy.deepcopy(padre.tablero)
self.invalidos = copy.deepcopy(padre.invalidos)
self.reinas = padre.reinas

Método __init__ de Nodo:

def __init__(self, padre=None):
try:
self.padre = padre
self.tablero = [[j for j in i] for i in padre.tablero]
self.invalidos = [[j for j in i] for i in padre.invalidos]
self.reinas = padre.reinas
except AttributeError:
pass

Conclusiones: algo exagerada la diferencia entre python y java, de hecho cuando vi que python tardaba 7 (casi ocho) segundos en hacer lo que java hace en 0.2 segundos, me decepcione bastante y fue por eso que empesé a buscar alternativas y surgió la idea de esta comparativa.

2.- La segunda parte es lo que el profesor llamo el “algoritmo a*”, básicamente consiste en que al ir generando los nodos y metiéndolos a la cola de nodos por visitar, se van ordenando para que siempre visitemos los nodos con menos espacios restantes para poner las reinas primero, en los dos casos utilicé métodos de ordenamiento que vienen incluidos por default en el lenguaje.

Java

time java ochoreinas.Main

real    0m0.122s
user    0m0.118s
sys    0m0.027s

Python

time python Main.py

real    0m0.069s
user    0m0.061s
sys    0m0.008s

Los dos lenguajes generan 1044 nodos (25 veces menos que en el algoritmo anterior). Para sorpresa mía java tomo casi el doble que python en este caso, la diferencia, supongo, radica en la manera de organizar los nodos creados. En los dos casos se genera una cola temporal a partir de los hijos de un nodo; esta cola es ordenada y después agregada a la cola original que contiene todos los nodos a revisar “a mano”, por lo que no tengo otra conclusión más que “python tiene una mejor implementación de un algoritmo de sort“.

De hecho el método encargado de regresar la comparativa entre dos nodos se ejecuta 1220 veces en python y únicamente 1134 en java; y el método encargado de regresar la cantidad de nodos inválidos (Nodo.cuentaInvalidos()) es llamado 2268 veces en java (el doble que sort) y 2440 en python (nuevamente el doble que sort), algo raro porque generalmente más operaciones implican más tiempo.

Otro punto a considerar es que en Java es necesario generar un objeto comparador cada que se ordena la cola, mientras que en python las listas tienen un muy util metodo sort ya integrado, al cual le pasas la función que reciba dos objetos a comparar y regrese un resultado de -1, 0 o 1 (menor, igual o mayor que).

Categories: [AI2008]

[AI2008] será el identificador que reciban las entradas de mi curso de Agentes Inteligentes, por petición del maestro tenemos que mantener un blog con ciertas publicaciones relacionadas con la materia y trabajos que nos dejará, pero como ya tengo uno me pareció mejor integrarlo aquí, a final de cuentas no se sale tanto del tema. Uso una convención de nombre en vez de una categoría de WordPress porque no se si me quedo con WordPress, y no he visto categorías en los otros sistemas que estoy probando.

La primera dinámica sobre la cual tengo que opinar es una titulada “La Mesa del Café”. Básicamente es una manera rápida de comentar sobre algún tema (en este caso responder dos preguntas) y moderar las participaciones de cada quien para conocer distintos puntos de vista. Las preguntas eran las siguientes:

  1. ¿Qué opinas sobre la Inteligencia Artificial?
  2. ¿Qué relación tiene tu carrera con la Inteligencia Artificial? (uso en la vida laboral)

La primera parte del trabajo es mi respuesta a las preguntas…

  1. No tengo mucho conocimiento sobre el tema y por lo mismo creo que es demasiado pronto para dar una opinión concreta e informada. Con eso en mente, siento que la inteligencia artificial hasta ahora está muy limitada, los programas no hacen más que lo que les decimos que hagan por más complejos que sean solo “aprenden” lo que están diseñados para “aprender”. Aún así son una herramienta extremadamente útil.
  2. Mi carrera se relaciona con la inteligencia artificial en la implementación, la tendencia de los sistemas computacionales hoy en día es ayudar en el manejo de la información, facilitar la toma de decisiones y en algunos casos incluso tomar las decisiones por nosotros. Los agentes inteligentes es la manera en que mi carrera responde a esas necesidades.

Seguidas por unas reflexiones de la dinámica…

Preguntas:

  1. ¿Qué me pareció?
  2. ¿Qué consecuencias tuvo el cambio de integrantes de la mesa?
  3. ¿Tuve la misma opinión desde el principio hasta el final? ¿Aprendí algo?

Respuestas:

  1. Fue interesante, principalmente por el tema. Yo en cierto modo esperaba que los demás pudieran darme más cosas sobre el tema de las que yo sabía. También sirvió para conocer a los compañeros por el hecho de estar cambiando de mesas.
  2. El cambio de los integrantes sirvió para poder hacer una mezcla de las opiniones de todos los del salón pero en grupos pequeños. Si hubiéramos intentado intercambiar opiniones entre todo el salón no todos hubieran participado y probablemente no todos hubieran escuchado.
  3. Creo que mi opinión se mantuvo durante toda la dinámica, no hubo nadie que tuviera una opinión que la contradijera de ninguna manera y por lo tanto no se dio ningún debate.

En la dinámica yo participé como “host” en mi mesa, o secretario. Como tal me tocó hacer un concentrado de todos los comentarios de los equipos, copio los puntos que resaltaron más.

1- ¿Qué opinas de la Inteligencia Artificial?

No existen verdaderamente porque se tiene que diseñar cada sistema para que aprenda algo en específico. Programación compleja, pero no “inteligencia”.
Todavía estamos “en pañales”, no se puede saber el camino que tomará la I.A. en el futuro.
Depende de la definición de “Inteligencia”.

2- ¿Qué relacion tiene tu carrera con la Inteligencia Artificial?

La tendencia es crear sistemas complejos que automatizen los procesos y la inteligencia artificial es la reacción de los ing. en sistemas. Procesos más autonomos.
Facilitar la interacción y la manipulación con los datos.
Sustitución de personal.

Tags: