Dans ce défi, vous recevez une quantité limitée d'informations sur un jeu d'échecs particulier et vous devez prédire qui a gagné le jeu .
Vous disposez de deux ensembles de données:
- Nombre de pièces (quelles pièces sont encore en vie)
- Couleurs du plateau (La couleur des pièces sur le plateau)
Plus important encore, vous ne savez pas où se trouvent les pièces . Vous devez déterminer qui, selon vous, va gagner.
Les jeux sont sélectionnés parmi tous les événements répertoriés sur PGNMentor de 2010 à maintenant. J'ai sélectionné 10% de toutes les positions du plateau de chaque jeu qui se termine par une victoire ou une perte. Les positions du conseil seront toujours au moins 30 coups dans le jeu. Les cas de test peuvent être trouvés ici . (Les victoires blanches sont répertoriées en premier, suivies des victoires noires)
Contribution
Le nombre de pièces sera une chaîne composée d'un caractère pour chaque pièce: k
ing, q
ueen, r
ook, k n
ight, b
ishop ou p
awn. Les minuscules signifient noir, les majuscules sont blanches. Le tableau sera une chaîne de 64 caractères (8 lignes par 8 colonnes). B
représente une pièce noire, W
représente une pièce blanche et .
représente un endroit vide. Échantillon:
W..WB......W.BB....W..B..W.WWBBB..W...B....W..BBWWW...BB.W....B.,BBKPPPPPPPQRRbbkpppppppqrr
représenterait le conseil suivant
...B.BB.
.BBBBBBB
.B.B....
B..W....
WWWW.W..
....W.W.
...W..WW
W.....W.
et où les deux couleurs ont 2 évêques, 1 roi, 7 pions, 1 reine, 2 tours
Production
Vous devez renvoyer un nombre à virgule flottante compris entre 0 et 1 (inclus) pour déterminer la probabilité de victoire des blancs. Échantillon:
0.3 (30% chance that white wins)
Plus de détails:
- Chaque cas de test vaut 1 point. Votre score sera
1 - (1-Output)^2
si les blancs gagnent ou1 - (Output)^2
si les noirs gagnent. - Votre score final sera la somme de tous les cas de test.
- Si je pense que les soumissions codent en dur l'entrée, je me réserve le droit de modifier les cas de test. (Si je les change, ils auront le hachage SHA-256
893be4425529f40bb9a0a7632f7a268a087ea00b0eb68293d6c599c6c671cdee
) - Votre programme doit exécuter des cas de test de manière indépendante. Aucune sauvegarde des informations d'un scénario de test au suivant.
- Si vous utilisez l'apprentissage automatique, je recommande fortement de vous entraîner sur les 80% des premières données et de tester en utilisant les 20% restants . (Ou quels que soient les pourcentages que vous utilisez). J'utilise les jeux plusieurs fois dans les données, mais je rassemble les mêmes jeux de manière séquentielle.
- MISE À JOUR: J'ai ajouté plus d'un million de cas de test à des fins de test et d'apprentissage. Ils sont divisés en parties noires et blanches en raison des limites de taille du repo Github.
Bonne chance et amusez-vous bien!
la source
Réponses:
Java 8 + Weka, 6413 points, 94,5%
Cette réponse utilise une approche d'apprentissage automatique. Vous devez récupérer la bibliothèque Weka , notamment
weka.jar
etPackageManager.jar
.Ici, j'utilise un perceptron multicouche comme classificateur; vous pouvez remplacer
mlp
par n'importe quelleClassifier
classe de Weka pour comparer les résultats.Je n'ai pas beaucoup bricolé les paramètres du MLP, et je les ai simplement observés (une couche cachée de 50 neurones, 100 époques, 0,2 taux d'apprentissage, 0,1 momentum).
Je seuil la valeur de sortie du MLP, donc la sortie est vraiment 1 ou 0 comme défini dans le défi. De cette façon, le nombre d'instances correctement classées tel qu'imprimé par Weka est directement notre score.
Construction de vecteur de fonction
Je transforme chaque instance d'une chaîne en un vecteur de 76 éléments, où:
1
trouve une pièce blanche,-1
une pièce noire et0
une cellule vide.0
étant "aucune pièce de ce type"). On pourrait appliquer la normalisation pour réajuster ces valeurs entre -1 et 1 mais ce n'est probablement pas très utile ici.Nombre d'instances de formation
Si j'utilise tous les cas de test donnés pour former mon classificateur, j'ai réussi à obtenir 6694 (soit 98,6588%) des instances correctement classées . Ce n'est évidemment pas surprenant, car tester un modèle sur les mêmes données que celles utilisées pour le former est beaucoup trop facile (car dans ce cas, il est en fait bon que le modèle soit trop adapté).
En utilisant un sous-ensemble aléatoire de 80% des instances comme données de formation, nous obtenons le chiffre des instances correctement classées 6413 (soit 94,5173%) rapporté dans l'en-tête (bien sûr, puisque le sous-ensemble est aléatoire, vous pouvez obtenir des résultats légèrement différents). Je suis convaincu que le modèle fonctionnerait correctement sur les nouvelles données, car les tests sur les 20% restants des instances (qui n'ont pas été utilisés pour la formation) donnent une classification correcte de 77,0818% , ce qui montre que les modèles se généralisent assez bien (en supposant que les exemples qui nous sont donnés ici sont représentatifs des nouveaux cas de test qui nous seraient donnés).
En utilisant la moitié des instances pour la formation et l'autre moitié pour les tests, nous obtenons 86,7502% sur les données de formation et de test, et 74,4988% sur les données de test uniquement.
la mise en oeuvre
Comme je l'ai dit, ce code nécessite
weka.jar
etPackageManager.jar
de Weka.On peut contrôler le pourcentage de données utilisées dans l'ensemble de formation avec
TRAIN_PERCENTAGE
.Les paramètres du MLP peuvent être modifiés juste en dessous
TRAIN_PERCENTAGE
. On peut essayer d'autres classificateurs de Weka (par exempleSMO
pour les SVM) en remplaçant simplementmlp
par un autre classificateur.Ce programme imprime sur des ensembles de résultats, le premier étant sur l'ensemble complet (y compris les données utilisées pour la formation) qui est le score tel que défini dans ce défi, et le second étant uniquement sur les données qui n'ont pas été utilisées pour la formation.
On entre les données en passant le chemin du fichier le contenant comme argument au programme.
la source
GNU sed + bc,
43365074,5 points,6475%Mise à jour: l'OP a donné une nouvelle façon de calculer le score de la prédiction pour un cas de test individuel. En utilisant Wolfram Alpha , j'ai tracé les deux ensembles de formules pour voir les différences.
La méthode actuelle incite fortement à produire des probabilités réelles, et pas seulement les extrêmes, 0 et 1, pour lesquels les nouvelles formules donnent le même score maximum qu'auparavant. C'est pourquoi l'algorithme inchangé ci-dessous, a maintenant un meilleur taux de prédiction, en fait un grand taux étant donné sa simplicité.
Cependant, il y a aussi un inconvénient associé aux nouvelles formules, comme expliqué dans 'Edit 1'.
Il s'agit d'une estimation simple basée uniquement sur l'avantage / l'inconvénient matériel, en ignorant le placement réel des pièces. J'étais curieux de savoir comment cela fonctionnera. La raison pour laquelle j'utilise sed, et non une langue qui peut le faire en une seule ligne, c'est parce que c'est ma langue ésotérique préférée.
Valeurs standard des pièces utilisées:
Je calcule la matière des deux côtés et soustrais la matière du noir à celle du blanc. La sortie de chaque scénario de test est basée sur cette différence comme suit:
C'est ma seule sortie fractionnaire, d'où la raison de l'amélioration comme expliqué ci-dessus.
Le taux de prédiction pour cette méthode était de 64%. Maintenant, c'est 75% avec les nouvelles formules.
Modifier 1: l'inconvénient
La solution triviale est de produire 0,5 pour chaque test, car de cette façon, vous avez marqué un demi-point, peu importe qui a gagné. Pour nos cas de test, cela signifiait un score total de 3392,5 points (50%).
Mais avec les nouvelles formules, 0,5 (qui est une sortie que vous donneriez si vous êtes indécis qui gagne) est converti en 0,75 points. N'oubliez pas que le score maximum que vous pouvez recevoir pour un scénario de test est de 1, pour une confiance de 100% dans le gagnant. En tant que tel, le nouveau score total pour une sortie constante de 0,5 est de 5088,75 points, soit 75%! À mon avis, l'incitation est trop forte pour ce cas.
Ce score est meilleur, bien que marginalement, que mon algorithme basé sur les avantages matériels. La raison en est que l'algorithme donne une probabilité de 1 ou 0 (aucune incitation), des gains ou des pertes présumés, plus de fois (3831) qu'il n'en donne 0,5 (incitation), des tirages présumés (2954). La méthode est simple à la fin, et en tant que telle, elle n'a pas un pourcentage élevé de réponses correctes. Le coup de pouce de la nouvelle formule à la constante 0,5, parvient à atteindre ce pourcentage, artificiellement.
Modifier 2:
C'est un fait connu, mentionné dans les livres d'échecs, qu'il est généralement préférable d'avoir une paire d'évêque qu'une paire de chevalier. Cela est particulièrement vrai dans la phase intermédiaire à la fin du jeu, où se trouvent les cas de test, car il est plus susceptible d'avoir une position ouverte où la portée d'un évêque est augmentée.
J'ai donc fait un deuxième test, mais cette fois j'ai remplacé la valeur des évêques de 3 à 3,5. La valeur du chevalier est restée 3. C'est une préférence personnelle, donc je n'en ai pas fait ma soumission par défaut. Le score total dans ce cas était de 4411 points (65%). Une augmentation d'un point de pourcentage seulement a été observée.
Avec les nouvelles formules, le score total est de 4835 points (71%). Maintenant, l'évêque pondéré est sous-performant. Mais, l'effet est expliqué parce que la méthode pondérée donne maintenant encore plus de fois les gains ou les pertes présumés (5089) que les tirages présumés (1696).
la source
Python 3 - 84,6%, 5275 points sur un ensemble de validation
Si nous trichons et utilisons toutes les données, nous pouvons atteindre une précision de 99,3% et un score de 6408
Juste un grand MLP simple avec abandon en utilisant Keras
la source
Python 3 - 94,3% de précision, 6447 points sur un ensemble de validation de 20% des données
Utilise 3 réseaux de neurones, un régresseur des voisins les plus proches, une forêt aléatoire et un boost de gradient. Ces prédictions sont combinées avec une forêt aléatoire qui a également accès aux données.
la source
Python 3 - 4353,25 / 6785 points - 64%
J'ai donc travaillé là-dessus surtout hier. Mon premier article sur le golf, et je n'utilise le python que depuis une semaine environ, alors pardonnez-moi si tout n'est pas optimisé.
J'ai fini par suivre le même chemin que la réponse de Seshoumara pour commencer. Mais le grand nombre de cas de test qui comptaient même des comptages de pièces me laissait insatisfait.
J'ai donc googlé les traits qui dictent qui gagne aux échecs (je ne joue pas le jeu moi-même) et j'ai remarqué que la position du plateau, en particulier le contrôle central, est grande. C'est là que ce bit entre en jeu.
Ces deux moitiés combinées sont utilisées pour trouver le score (0,0, 0,25, 0,50, 0,75, 1,0)
Très intéressant que cette position supplémentaire ne semble pas augmenter les chances de deviner le gagnant.
Si vous déposez les cas de test dans certains fichiers, voici le test.
Je sais que ce n'est pas un défi de golf, mais tous les trucs ou conseils à cet égard sont appréciés!
la source