domingo, febrero 17, 2008

Resultados del torneo de Doble y Nada

¡Tenemos ganador! Aquí está la tabla final de posiciones:

96.8% PE (Pablo Coll)
1.5% J (Jorge Alvaro)
1.5% DoublesMedia (Cynthia Disenfeld)
0.0% Doblerone (Bernard Romera)
0.0% Trentenna (Jean Morales)
0.0% Pequeritmo01 (Markelo)
0.0% Pequeritmo02 (Markelo)
0.0% Pite (Alejandro Donnantuoni)
Cada link lleva al código fuente del algoritmo respectivo.

Aquí pueden ver el código fuente del sistema y de algunas funciones auxiliares.
La partida completa puede verse aquí.

¡Felicitaciones Pablo Coll, y a todos muchas gracias por participar! Ya andamos buscando un juego adecuado para la próxima competencia. No duden en enviar sus ideas.

5 comentarios:

bernard dijo...

Felicidades a Pablo Coll. Pablo, ¿nos podrías explicar en qué te has basado para hacer ese algoritmo?

Markelo dijo...

Felicitaciones a pablo. También me gustaría una explicación del algoritmo.

No creo que cambie nada, pero si no entendí mal, debe haber un error con pequeritmo2 que quedó varias rondas clavado en 2838.

Marcos dijo...

Markelo: efectivamente, hay algo mal: el código ordena los ganadores por frecuencia primero, pero no ordena por tamaño después. Evidentemente se me pasó.

En cuanto pueda corrijo el código y calculo nuevamente los resultados; pero no será hasta dentro de una semana, cuando vuelva de un viaje y tenga acceso a mi computadora.

¡Perdón por el error!

Pablo E. Coll dijo...

Hola Gentes, disculpen que me demoré en responder sobre mi función. Tuve una semana muy atareada.

Se me ocurrió usar el siguiente esquema para pensar la función.
Una función que en base a los resultados previos estimará cual va a ser el valor de la próxima ganadora y luego generar una constante, que llamaré alfa, que aumente dicha estimación.

Para la estimación pensé en tomar el promedio o el máximo de los resultados ganadores previos.
Puestos estos algoritmos a competir con algunos que generaban resultados al azar a partir de estimaciones, en seguida observé que jugando juegos sucesivos los resultados de las jugadas iba creciendo aceleradamente.
¿Sería un crecimiento polinomial o exponencial?
Algunos experimentos me convencieron de que el crecimiento era exponencial.
Después me di cuenta que eso era natural. Por que si las estimaciones son correctas y se juega a duplicar en cada jugada lo estimado, estamos creciendo como 2^n.

Pensé entonces en estimar con una cuadrática definida por los últimos tres resultados ganadores
entonces generé esta función de pronóstico cuadrático

funcion PC : enteroArbitrario; begin
return( 2 * abs( 3 * G[R-1] - 3 * G[R-2] + G[R-3] ) );
end;

Hice varias.

Supone que los puntos anteriores tienen coordenadas (-1,G[R-3]); (0,G[R-2]) y (1,G[R-1])
donde G[R-1] es la ganadora de la ronda anterior, y G[R-2] y G[R-3] las de las rondas anteanterior y anteanteanterior.
Genera una parábola por esos tres puntos y despues predice la próxima jugada por evaluando en x=2 y obtenindo G[R].

Estuve comparando evaluar en 2 y luego multiplicar por 2 el resultado o directamente multiplicar por 3
La de arriba es una variante de una de estas.

Finalmente me decidí por una interpolación exponencial.
Tomo los últimos tres puntos en este caso (0,G[R-3]); (1,G[R-2]) y (2,G[R-1]) y supongo que pasan por
una curva de la forma f(x) = A + B C^x

f(0) = A + B = G[R-3]
f(1) = A + B C = G[R-2]
f(2) = A + B C^2 = G[R-1]

Haciendo operaciones con estas ecuaciones llegué a calcular cuánto valdrían A, B y C.

La función de abajo es f(3) * 1.3

La constante 1.3 la halle experimentalmente

funcion PE : enteroArbitrario; begin
aPE := G[R-3]*G[R-1]-G[R-2]*G[R-2];
aPE := aPE + (G[R-1]-G[R-2])*(G[R-1]-G[R-2])*(G[R-1]-G[R-2])/(G[R-2]-G[R-3]);
aPE := aPE / (G[R-1]-2*G[R-2]+G[R-3]);
return( abs( trunc( aPE * 1.3 ) ) );
end;

Cualquier duda pregunten.
Si tienen paciencia no tengo problemas en responder.
Saludos, ++Pablo;

Marcos dijo...

Markelo: corregí el error del código de tu algoritmo, pero lamentablemente no cambia la tabla de posiciones...