viernes, marzo 28, 2008

Novena competencia: Demonios

(Update: consideré preferible usar el modo entrada/salida para la interacción entre los programas, al menos en este juego. Leer más abajo los detalles al respecto)

Luego de considerar varias opciones, hemos elegido al fin un juego para la novena competencia (que en realidad serán varias; ya quedará claro más abajo).

El juego elegido, Demonios, es una versión unidimensional, imparcial y simultánea del juego que da origen al Problema del Ángel de John H. Conway.


Reglas del juego

  • El tablero es una tira de N casillas de largo.
  • Cada jugador tiene un demonio; ambos comienzan en extremos opuestos de la tira.
  • Las casillas que hayan sido ocupadas en algún momento de la partida por algún demonio se denominarán quemadas. Las demás casillas se denominarán limpias.
  • Los movimientos son simultáneos.
  • En cada turno, ambos jugadores deberán mover su demonio a una casilla limpia que esté a lo sumo a K casillas de distancia (por ejemplo, si K = 1, podrá moverlo sólo a las casillas contiguas).
  • Ambos demonios pueden ocupar una misma casilla.
  • Si un jugador no tiene movidas válidas, pierde la partida y su oponente es declarado ganador. Si esto le ocurre a ambos jugadores simultáneamente, se declara empate.

Reglas de la competencia

  • Como habrán notado, no hemos especificado los valores de N y de K. Esto es porque habrá varias categorías, con distintos valores (fijos dentro de cada categoría), y en cada una habrá un ganador.
  • Cada par de algoritmos jugará de 20 a 2000 partidas en cada categoría (dependiendo del tiempo y/o paciencia disponibles).
  • Cada partida ganada valdrá 10 puntos, y cada partida empatada valdrá 1 punto.
  • Los algoritmos deberán decidir a qué casilla mueven su demonio, dados los valores de N y K, y las movidas anteriores de ambos jugadores. Podrán almacenar información entre turnos consecutivos de una misma partida, pero no entre distintas partidas.
  • Cada jugador podrá enviar un solo algoritmo. Habrá tiempo hasta el sábado 10 de mayo inclusive.

Aclaraciones para los que envíen código

Las acciones de cada programa durante la partida serán las siguientes:
  1. Leer una línea completa, que contendrá dos números naturales en base decimal, separados por un espacio. Dichos números serán los valores de N y K para la partida, en ese orden. Las casillas estarán numeradas de 1 a N, siendo 1 la posición inicial del demonio propio y N la posición del demonio oponente.
  2. Escribir una línea completa que contenga un número en base decimal, indicando la casilla a la que se desea mover el demonio propio.
  3. Leer una línea completa desde la entrada estándar, que contendrá un número en base decimal, indicando la casilla a la que se movió el demonio oponente.
  4. Volver al paso 2.
Los jugadores podrán dar por sentado que las movidas del oponente enviadas por el juez a su programa son válidas.
Si uno de los programas envía una movida inválida al juez, será descalificado. Por supuesto, antes de correr la competencia real se hará una serie de pruebas para corregir cualquier error en los programas jugadores o el programa juez.

Monedero II: las vueltas de la vida

Sabíamos que la vida da sorpresas, pero esto es muy gracioso.

Dani Rodrigo nos ha señalado otro error en el código. Esto de por sí no es sorprendente (errar es humano); lo que es curioso es que corregir este error no afectó demasiado los resultados del Monedero I, pero sí los del Monedero II.

Y como en una especie de justicia poética, ¡esta segunda corrección ha restaurado a Dani Rodrigo como ganador del Monedero II!

De todas maneras reconozcamos que los puntajes obtenidos por los algoritmos punteros son sumamente parecidos. Como comenta Juan Zubieta, habría que efectuar quizá muchísimas más partidas para que los porcentajes fueran menos ambiguos. Pero atengámonos a las 100 partidas que especificamos en las reglas.

Aquí están el código fuente corregido y los puntajes finales (esperemos que no surjan más sorpresas):


Puntaje         Algoritmo               Autor

3855 (14.61%) Panzeta Dani Rodrigo
3716 (14.08%) Programación_Dinámica Javier Gómez
3541 (13.42%) PotenciaDos Juan Zubieta
3426 (12.98%) Jean_3 Jean Morales
3184 (12.06%) Jesanz_3 Jesús Sanz
3179 (12.05%) Pequeritmo_03 Markelo
2865 (10.86%) Arroyito Bernardino Romera
2626 (9.95%) Colorado_el_9_revisado Pablo Coll


Y como siempre, gracias a todos por participar y por estar tan atentos...

miércoles, marzo 26, 2008

Monedero I y II: resultados corregidos

Luego de corregir la implementación de la mecánica del juego, he aquí los resultados corregidos.

Felicitaciones a Markelo y a Javier Gómez, que resultaron ser los ganadores de cada versión. Y gracias a todos nuevamente por participar, y en particular a Javier por señalar el error que habíamos cometido.


Para el Monedero I (puntajes acumulados):

Puntaje         Algoritmo         Autor/a

11086 (8.48%) Pequeritmo_02 Markelo
10856 (8.31%) Pequeritmo_01 Markelo
10744 (8.22%) Colorado_el_9 Pablo Coll
10032 (7.68%) Arroyito Bernardino Romera
9993 (7.65%) Jesanz_2 Jesús Sanz
9928 (7.60%) Jean_1 Jean Morales
9559 (7.32%) Pozuelon Bernardino Romera
9444 (7.23%) Jean_2 Jean Morales
9228 (7.06%) Ten Cynthia Disenfeld
8904 (6.81%) Jesanz_1 Jesús Sanz
8746 (6.69%) Negro_el_10 Pablo Coll
7957 (6.09%) Eleven Cynthia Disenfeld
6968 (5.33%) A Alejandro Donnantuoni
5110 (3.91%) B Alejandro Donnantuoni
2111 (1.62%) Optimista Sistema



Para el Monedero II (puntajes tabicados):

Puntaje         Algoritmo                Autor/a

3721 (14.04%) Programación_Dinámica Javier Gómez
3508 (13.24%) PotenciaDos Juan Zubieta
3475 (13.12%) Panzeta Dani Rodrigo
3407 (12.86%) Pequeritmo_03 Markelo
3215 (12.13%) Jesanz_3 Jesús Sanz
3167 (11.95%) Jean_3 Jean Morales
3095 (11.68%) Arroyito Bernardino Romera
2908 (10.98%) Colorado_el_9_revisado Pablo Coll

Erratas

Javier Gómez señala, con razón, que la implementación del Monedero (en ambas versiones) adolece de un error conceptual: ambos jugadores arrojan la misma secuencia de caras y cruces.

Fue una decisión equivocada de nuestra parte, por querer hacer más "justo" el juego. Las reglas especifican claramente que en su turno, cada jugador lanza una moneda, de manera que hemos modificado el código y en breve publicaremos los resultados corregidos.

¡Gracias Javier por el aviso!

Midiendo la elegancia

Una de las cosas más estimulantes y sorprendentes de este proyecto es la comparación de la complejidad y eficiencia de los distintos algoritmos que se presentan. Algunos son simples y directos, pero logran un desempeño pobre. Otros son complicados o lentos, pero su complejidad se ve premiada por la victoria.

Pero cada tanto hay alguno de sencillez prístina que además gana limpiamente la competencia; y aunque eso puede indicar una pobreza de estructura del juego en cuestión, también indica estilo y elegancia.

Esto hace pensar que quizá sería interesante definir, para futuras competencias, categorías basadas en la complejidad intrínseca de los distintos algoritmos.

No es atractiva la idea de poner límites al tiempo de ejecución o uso de memoria, como hacen en otras competencias de este tipo; más bien sería deseable dividir los algoritmos según su uso de los recursos y luego, dentro de cada categoría, declarar un vencedor.

No queda claro cómo sería la mejor manera de hacerlo; si alguno se imagina un método elegante, que lo indique aquí y lo discutiremos.

Monedero II: Resultados

Como recordaremos, las reglas del Monedero II eran las del Monedero, pero con el sistema de puntajes "tabicado": las partidas ganadas valen 10 puntos, las empatadas 1 punto y las perdidas 0 puntos.

Se efectuaron 100 partidas entre cada par de algoritmos, y cada partida duró 1000 turnos.

Aquí están los resultados:


Puntaje         Algoritmo               Autor

4405 (18.21%) Panzeta Dani Rodrigo
4148 (17.15%) Programación_Dinámica Javier Gómez
3523 (14.56%) PotenciaDos Juan Zubieta
3266 (13.50%) Jesanz_3 Jesús Sanz
2744 (11.34%) Jean_3 Jean Morales
2311 (9.55%) Pequeritmo_03 Markelo
2087 (8.63%) Colorado_el_9_revisado Pablo Coll
1708 (7.06%) Arroyito Bernardino Romera


¡Felicitaciones a Dani Rodrigo! Y como siempre, gracias a todos por participar con su ingenio.

El código fuente completo de la competencia se puede ver aquí. Cualquier duda y/o corrección serán bienvenidas.

martes, marzo 11, 2008

Nueva competencia: Monedero II

Como anuncié en el post anterior, en esta competencia jugaremos otra versión del Monedero.

Las reglas serán las mismas que las originales, salvo que esta vez, los puntajes globales se irán acumulando de esta manera:
  • Diez puntos por cada partida ganada
  • Un punto por cada partida empatada
  • Cero puntos por cada partida perdida
Habrá tiempo de enviar algoritmos hasta el 25 de marzo.

Esta vez aceptaré solamente un algoritmo por jugador, por sencillez.

¡Espero sus participaciones!

Monedero: Resultados

Bien, el Monedero demostró ser un juego interesante: surgieron estrategias bastante diferentes, y una inquietud.

Los Resultados

Luego de 100 febriles partidas entre cada par de algoritmos enviados (aumenté la cantidad de partidas porque algunos son bastante parejos), aquí están finalmente los puntajes finales:

puntaje algoritmo autor/a

11192 (8.25%) Arroyito Bernardino Romera
11064 (8.16%) Pozuelon Bernardino Romera
10992 (8.11%) Pequeritmo_02 Markelo
10930 (8.06%) Pequeritmo_01 Markelo
10692 (7.88%) Colorado_el_9 Pablo Coll
10676 (7.87%) Jean_1 Jean Morales
10420 (7.68%) Jean_2 Jean Morales
9649 (7.11%) Jesanz_2 Jesús Sanz
9552 (7.04%) Ten Cynthia Disenfeld
8927 (6.58%) Negro_el_10 Pablo Coll
8588 (6.33%) Jesanz_1 Jesús Sanz
8419 (6.21%) Eleven Cynthia Disenfeld)
7000 (5.16%) A Alejandro Donnantuoni
5310 (3.92%) B Alejandro Donnantuoni
2208 (1.63%) Optimista Sistema

¡Felicitaciones a Bernardino Romera, el ganador!

Y como siempre, gracias a todos por participar.


La Inquietud

Señala Markelo, y con razón, que la estrategia del juego debería variar notablemente con otra modalidad de puntaje:
Si mi contrincante se planta en un determinado valor, solo necesito superarlo por uno para ganarle en caso de que valiese cada triunfo. Pero si lo que busco es puntos, entonces debería idear una forma de seguir sumando.
Por lo tanto, no publicaré el código de los algoritmos actuales, sino que armaré una nueva versión del torneo para ver cómo varían las estrategias cuando sólo se busca ganar las partidas.

En el próximo post especificaré la modalidad de puntaje usada.