En este desafío, se le da una cantidad limitada de información sobre un juego de ajedrez en particular, y debe predecir quién ganó el juego .
Te dan dos conjuntos de datos:
- La pieza cuenta (qué piezas siguen vivas)
- Colores del tablero (el color de las piezas en el tablero)
Más importante aún, que no sabe dónde están ubicadas las piezas . Debes determinar quién crees que ganará.
Los juegos se seleccionan de todos los eventos enumerados en PGNMentor desde 2010 hasta ahora. He seleccionado el 10% de todas las posiciones del tablero de cada juego que termina en una victoria o una pérdida. Las posiciones del tablero siempre serán al menos 30 movimientos en el juego. Los casos de prueba se pueden encontrar aquí . (Las ganancias blancas se enumeran primero, seguidas de las ganancias negras)
Entrada
El recuento de piezas será una cadena que consta de un personaje para cada pieza: k
ing, q
ueen, r
ook, k n
ight, b
ishop o p
awn. Minúsculas significa negro, mayúsculas es blanco. El tablero será una cadena de 64 caracteres (8 filas por 8 columnas). B
representa una pieza negra, W
representa una pieza blanca y .
representa un lugar vacío. Muestra:
W..WB......W.BB....W..B..W.WWBBB..W...B....W..BBWWW...BB.W....B.,BBKPPPPPPPQRRbbkpppppppqrr
representaría el siguiente tablero
...B.BB.
.BBBBBBB
.B.B....
B..W....
WWWW.W..
....W.W.
...W..WW
W.....W.
y donde ambos colores tienen 2 obispos, 1 rey, 7 peones, 1 reina, 2 torres
Salida
Debe devolver un número de coma flotante entre 0 y 1 (inclusive) para determinar qué tan probable es que gane el blanco. Muestra:
0.3 (30% chance that white wins)
Más detalles:
- Cada caso de prueba vale 1 punto. Su puntaje será
1 - (1-Output)^2
si el blanco gana, o1 - (Output)^2
si el negro gana. - Su puntaje final será la suma en todos los casos de prueba.
- Si siento que los envíos están codificando la entrada, me reservo el derecho de cambiar los casos de prueba. (Si los cambio, tendrán el hash SHA-256
893be4425529f40bb9a0a7632f7a268a087ea00b0eb68293d6c599c6c671cdee
) - Su programa debe ejecutar casos de prueba de forma independiente. No guardar información de un caso de prueba al siguiente.
- Si está utilizando el aprendizaje automático, le recomiendo encarecidamente entrenar el primer 80% de los datos y realizar pruebas con el 20% restante . (O cualquier porcentaje que use). Utilizo los juegos varias veces en los datos, pero organizo los mismos juegos de forma secuencial.
- ACTUALIZACIÓN: he agregado más de un millón de casos de prueba con fines de prueba y aprendizaje. Se dividen en partes en blanco y negro debido a los límites de tamaño de repositorio de github.
¡Buena suerte y diviertete!
fuente
Respuestas:
Java 8 + Weka, 6413 puntos, 94.5%
Esta respuesta utiliza un enfoque de aprendizaje automático. Necesita recuperar la biblioteca Weka , notablemente
weka.jar
yPackageManager.jar
.Aquí, uso un perceptrón multicapa como clasificador; puede reemplazar
mlp
con cualquierClassifier
clase de Weka para comparar resultados.No he jugado mucho con los parámetros del MLP, y simplemente los analicé (una capa oculta de 50 neuronas, 100 épocas, 0.2 tasa de aprendizaje, 0.1 ímpetu).
Umbralizo el valor de salida del MLP, por lo que la salida realmente es 1 o 0 como se define en el desafío. De esa forma, el número de instancias clasificadas correctamente, según lo impreso por Weka, es directamente nuestro puntaje.
Construcción de vectores de características
Convierto cada instancia de una cadena a un vector de 76 elementos, donde:
1
es una pieza blanca,-1
es una pieza negra y0
es una celda vacía.0
siendo "ninguna pieza de ese tipo"). Uno podría aplicar la normalización para reajustar esos valores entre -1 y 1, pero esto probablemente no sea muy útil aquí.Número de instancias de entrenamiento
Si uso todos los casos de prueba para entrenar mi clasificador, he logrado obtener 6694 (es decir, 98.6588%) instancias correctamente clasificadas . Obviamente, esto no es sorprendente porque probar un modelo con los mismos datos que usó para entrenarlo es demasiado fácil (porque en ese caso es realmente bueno que el modelo se sobreajuste).
Usando un subconjunto aleatorio del 80% de las instancias como datos de entrenamiento, obtenemos la cifra de instancias clasificadas correctamente de 6413 (es decir, 94.5173%) informadas en el encabezado (por supuesto, dado que el subconjunto es aleatorio, puede obtener resultados ligeramente diferentes). Estoy seguro de que el modelo funcionaría decentemente bien en nuevos datos, porque las pruebas en el 20% restante de las instancias (que no se utilizaron para la capacitación) dan una clasificación correcta del 77.0818% , lo que demuestra que los modelos se generalizan decentemente bien (suponiendo que los casos que se nos dan aquí son representativos de los nuevos casos de prueba que se nos darían).
Usando la mitad de las instancias para el entrenamiento y la otra mitad para las pruebas, obtenemos el 86.7502% en los datos de entrenamiento y prueba, y el 74.4988% solo en los datos de la prueba.
Implementación
Como he dicho, este código requiere
weka.jar
yPackageManager.jar
de Weka.Se puede controlar el porcentaje de datos utilizados en el conjunto de entrenamiento con
TRAIN_PERCENTAGE
.Los parámetros de MLP se pueden cambiar justo debajo
TRAIN_PERCENTAGE
. Uno puede probar otros clasificadores de Weka (por ejemplo,SMO
para SVM) simplemente reemplazandomlp
con otro clasificador.Este programa imprime en conjuntos de resultados, el primero en todo el conjunto (incluidos los datos utilizados para el entrenamiento), que es el puntaje definido en este desafío, y el segundo en solo los datos que no se utilizaron para el entrenamiento.
Uno ingresa los datos pasando la ruta del archivo que los contiene como argumento al programa.
fuente
GNU sed + bc,
43365074.5 puntos,6475%Actualización: el OP dio una nueva forma de calcular el puntaje de la predicción para un caso de prueba individual. Usando Wolfram Alpha , tracé ambos conjuntos de fórmulas para ver las diferencias.
La forma actual ofrece un fuerte incentivo para generar probabilidades reales, y no solo los extremos, 0 y 1, para los cuales las nuevas fórmulas dan el mismo puntaje máximo que antes. Es por eso que el algoritmo sin cambios a continuación, ahora tiene una mejor tasa de predicción, de hecho, una gran tasa dada su simplicidad.
Sin embargo, también hay un inconveniente asociado con las nuevas fórmulas, como se explica en 'Editar 1'.
Esta es una estimación simple basada solo en la ventaja / desventaja del material, ignorando la ubicación real de las piezas. Tenía curiosidad por cómo funcionará esto. La razón por la que uso sed, y no un lenguaje que pueda hacer esto en una línea, es porque es mi lenguaje esotérico favorito.
Valores de pieza estándar utilizados:
Calculo el material para ambos lados y resta el material negro del blanco. La salida para cada caso de prueba se basa en esa diferencia de la siguiente manera:
Este es mi único resultado fraccional, de ahí la razón de la mejora como se explicó anteriormente.
La tasa de predicción para este método fue del 64%. Ahora es el 75% con las nuevas fórmulas.
Edición 1: el inconveniente
La solución trivial es generar 0.5 para cada caso de prueba, porque de esta manera usted obtuvo medio punto independientemente de quién ganó. Para nuestros casos de prueba, esto significó un puntaje total de 3392.5 puntos (50%).
Pero con las nuevas fórmulas, 0.5 (que es una salida que daría si no está decidido quién gana) se convierte en 0.75 puntos. Recuerde que el puntaje máximo que puede recibir para un caso de prueba es 1, para una confianza del 100% en el ganador. Como tal, el nuevo puntaje total para una salida constante de 0.5 es 5088.75 puntos, ¡o 75%! En mi opinión, el incentivo es demasiado fuerte para este caso.
Esa puntuación es mejor, aunque marginalmente, que mi algoritmo basado en la ventaja material. La razón de esto es porque el algoritmo da una probabilidad de 1 o 0 (sin incentivo), ganancias o pérdidas supuestas, más veces (3831) de lo que da 0.5 (incentivo), sorteos asumidos (2954). El método es simple al final y, como tal, no tiene un alto porcentaje de respuestas correctas. El impulso de la nueva fórmula a 0.5 constante, logra alcanzar ese porcentaje, artificialmente.
Edición 2:
Es un hecho conocido, mencionado en los libros de ajedrez, que generalmente es mejor tener una pareja de obispos que una pareja de caballeros. Esto es especialmente cierto en la etapa media a final del juego, donde se encuentran los casos de prueba, ya que es más probable que tenga una posición abierta donde se aumenta el rango de un obispo.
Por lo tanto, hice una segunda prueba, pero esta vez reemplacé el valor de los obispos de 3 a 3.5. El valor del caballero se mantuvo 3. Esta es una preferencia personal, por lo que no lo hice mi envío predeterminado. La puntuación total en este caso fue de 4411 puntos (65%). Solo se observó un aumento de 1 punto porcentual.
Con las nuevas fórmulas, el puntaje total es de 4835 puntos (71%). Ahora el obispo ponderado tiene un rendimiento inferior. Pero el efecto se explica porque el método ponderado ahora da incluso más victorias o pérdidas supuestas (5089) que los sorteos supuestos (1696).
fuente
Python 3 - 84.6%, 5275 puntos en un conjunto de validación
Si hacemos trampa y usamos todos los datos, podemos lograr una precisión del 99,3% y una puntuación de 6408
Solo un MLP grande y simple con deserción usando Keras
fuente
Python 3: 94,3% de precisión, 6447 puntos en un conjunto de validación del 20% de los datos
Utiliza 3 redes neuronales, un regresor de vecinos más cercano, un bosque aleatorio y un aumento de gradiente. Estas predicciones se combinan con un bosque aleatorio que también tiene acceso a los datos.
fuente
Python 3 - 4353.25 / 6785 puntos - 64%
Así que trabajé en esto principalmente ayer. Mi primera publicación de golf, y solo he estado usando Python aproximadamente una semana, así que perdóname si no todo está optimizado.
Terminé por el mismo camino que la respuesta de seshoumara para empezar. Pero la gran cantidad de casos de prueba que incluso contaban piezas me dejó insatisfecho.
Así que busqué en Google los rasgos que dictan quién está ganando en el ajedrez (no juego el juego yo mismo) y noté que la posición del tablero, específicamente el control central, es grande. Ahí es donde entra esta parte.
Ambas mitades combinadas se usan para encontrar el puntaje (0.0, 0.25, 0.50, 0.75, 1.0)
Muy interesante que esta posición extra en el tablero no parece aumentar la posibilidad de adivinar el ganador.
Si coloca los casos de prueba en algunos archivos, aquí está la prueba.
Sé que esto no es un desafío de golf, ¡pero cualquier consejo o consejo al respecto es apreciado!
fuente