Indice de vitesse
Cluedo / Clue est un jeu de société classique avec un composant de gameplay de déduction convaincant. Indice de vitesse est une variante pour 3-6 joueurs qui met l'accent sur ce composant en utilisant uniquement les cartes. Le résultat est que la seule différence entre le Cluedo standard et le Speed Clue est que chaque joueur encore dans le jeu peut faire toute suggestion qu'il souhaite à son tour au lieu d'attendre d'atteindre une salle spécifique à la merci des jets de dés et des suggestions des autres joueurs. Si vous n'avez jamais joué à Cluedo auparavant, ou si vous voulez être certain des différences explicites entre les deux versions, vous pouvez trouver un ensemble complet de règles de Speed Clue ici .
Objectif
Écrivez et soumettez un programme d'IA pour jouer à Speed Clue avant le 15 mai 2014 à 00h00 GMT. Après ce temps, je dirigerai un tournoi en utilisant toutes les entrées légales. Le participant dont l'IA remporte le plus de matchs du tournoi remporte le défi.
Spécifications AI
Vous pouvez écrire votre IA dans à peu près n'importe quelle langue que vous choisissez, en utilisant toutes les techniques que vous utilisez, tant qu'il utilise strictement le protocole d'application sur une connexion TCP / IP pour jouer à des jeux avec le serveur. Une explication détaillée de toutes les restrictions peut être trouvée ici .
Comment jouer
Commencez par bifurquer le référentiel du concours GitHub . Ajoutez un répertoire sous le
entries
répertoire nommé à l'aide de votre nom d'utilisateur StackExchange et développez votre code dans ce dossier. Lorsque vous êtes prêt à soumettre votre candidature, faites une demande de tirage avec vos révisions, puis suivez ces instructions pour annoncer votre candidature sur ce site.
J'ai fourni du code et des fichiers JAR dans le core
répertoire pour vous aider à démarrer; voir mon site pour un guide approximatif pour les matériaux. De plus, d'autres joueurs soumettent un code d'assistance en plus de leurs entrées pour vous aider à être opérationnel. Prenez le temps d'explorer les entrées et n'oubliez pas de tester votre entrée par rapport aux entrées des autres avant de soumettre!
Résultats
Place | User | AI | Result
------+--------------+--------------------+-------------------------------------------------------
1 | gamecoder | SpockAI | 55.75%
2 | Peter Taylor | InferencePlayer | 33.06%
3 | jwg | CluePaddle | 20.19%
4 | Peter Taylor | SimpleCluedoPlayer | 8.34%
5 | gamecoder | RandomPlayer | 1.71%
---- | ray | 01 | Player "ray-01" [3] sent an invalid accuse message: ""
Les résultats ci-dessus montrent le pourcentage de victoires de chaque IA qualifiée sur les 25 200 matchs valides auxquels elle a participé. Il y a eu 30 000 matchs au total qui ont compté dans les résultats, et 6 100 environ ont été réduits lors de la 01
disqualification.
Une mention honorable doit être attribuée à l' 01
IA de ray . Mes premiers tests ont montré que c'était le plus fort, et je m'attendais à ce qu'il gagne la compétition. Cependant, il semble avoir un bug très intermittent qui, pour autant que je puisse deviner, le conduit à éliminer toutes les solutions possibles. Le tournoi avait terminé tous les matchs à trois joueurs et avait commencé les matchs à quatre joueurs (12 000 matchs en!) Lorsque 01
le bug a été révélé. Si je considère simplement le classement des matchs à 3 joueurs, les résultats ressemblent à ceci:
Place | User | AI | Result
------+--------------+--------------------+--------
1 | ray | 01 | 72.10%
2 | gamecoder | SpockAI | 51.28%
3 | Peter Taylor | InferencePlayer | 39.97%
4 | Peter Taylor | SimpleCluedoPlayer | 17.65%
5 | jwg | CluePaddle | 16.92%
6 | gamecoder | RandomPlayer | 2.08%
J'avais prévu de faire de l'exploration de données sur les résultats, mais je suis épuisé. J'ai eu des difficultés techniques à faire en sorte que la compétition se poursuive (pannes de courant, redémarrages du système), ce qui a nécessité une réécriture complète du serveur du concours pour sauvegarder sa progression au fur et à mesure. Je vais commenter et valider toutes les modifications du code avec tous les fichiers de résultats qui ont été générés au cas où quelqu'un serait toujours intéressé. Si je décide de faire également l'exploration de données, mes résultats seront également ajoutés au référentiel.
Merci d'avoir joué!
la source
you must accept two port numbers: the first will be the port to which your program will listen, and the second will be the port to which your program will send.
, Pourquoi deux ports?Réponses:
AI01 - Python 3
Je ne peux pas encore trouver un meilleur nom pour cela :-P.
Identifiant : ray-ai01
Technologie : Python 3
Sélectionné : oui
Arguments :
ai01.py identifier port
Description : Travail par inférence. Lorsque le nombre de cartes dont le propriétaire n'est pas connu est inférieur à un seuil, cette IA commence à éliminer toutes les solutions impossibles par inférence globale récursive. Sinon, il utilise l'inférence locale.
Le code AI peut être trouvé ici .
la source
SpockAI
. Il fonctionne plutôt bien contre01
. Je ne sais pas s'il gagnera la compétition, mais je suis heureux de voir votre nombre de victoires réduit; )SimpleCluedoPlayer.java
Cette classe utilise
AbstractCluedoPlayer
, qui gère toutes les E / S et permet à la logique de fonctionner avec une interface typée simple. Le tout est sur github .Cela bat le joueur aléatoire avec une forte probabilité (dans le pire des cas, il faut 15 suggestions, alors que le joueur aléatoire en prend 162 en moyenne), mais il sera facilement battu. Je lui offre de faire bouger les choses.
la source
SpockAI
Identifiant:
gamecoder-SpockAI
Entrée en pension: cliquez ici
Sélectionné: Oui
Technologie: Java 7 basé sur
com.sadakatsu.clue.jar
Arguments:
{identifier} portNumber [logOutput: true|false]
La description:
SpockAI
est un joueur Speed Clue construit sur une classe appeléeKnowledge
que j'ai écrite. LaKnowledge
classe représente tous les états possibles que le jeu aurait pu donner à ce qui s'est passé jusqu'à présent. Il représente les solutions du jeu et les mains possibles des joueurs sous forme d'ensembles, et utilise des déductions itératives pour réduire ces ensembles autant que possible chaque fois que quelque chose est appris.SpockAI
utilise cette classe pour déterminer quelles suggestions sont assurées d'avoir les résultats les plus défavorables les plus utiles et sélectionne au hasard l'une de ces suggestions à son tour. Lorsqu'il doit réfuter une suggestion, il essaie soit de montrer une carte dont il a déjà montré l'IA suggérée, soit de lui montrer une carte de la catégorie pour laquelle il a le moins réduit les possibilités. Il ne fait une accusation que lorsqu'il connaît la solution.L'heuristique que j'ai utilisée pour déterminer la meilleure suggestion est la suivante. Une fois que toutes les informations ont été tirées d'une suggestion, la solution possible et les ensembles de mains de joueurs possibles ont été réduits (à moins que la suggestion ne révèle aucune nouvelle information). Théoriquement, la meilleure suggestion est celle qui réduit le plus le nombre de solutions possibles. Dans le cas d'une égalité, je suppose qu'une suggestion qui réduit le plus le nombre de mains possibles pour les joueurs est meilleure. Donc, pour chaque suggestion, j'essaie tous les résultats possibles qui ne conduisent pas à une contradiction dans la connaissance. Quel que soit le résultat qui présente le moins d'amélioration du nombre de solutions / mains, on suppose que c'est le résultat de la suggestion. Ensuite, je compare tous les résultats des suggestions et je choisis celui qui a le meilleur résultat. De cette façon, je garantis un gain d'informations optimal dans le pire des cas.
J'envisage d'ajouter une analyse de combinaison par force brute des solutions possibles et des mains possibles des joueurs pour les rendre
SpockAI
encore plus forts, mais commeSpockAI
c'est déjà l'entrée la plus lente et la plus gourmande en ressources, je vais probablement sauter cela.Avertissement:
J'avais l'intention de publier une IA pour ce concours il y a des semaines. Dans l'état actuel des choses, je n'ai pas pu commencer à écrire mon IA avant vendredi la semaine dernière, et j'ai continué à trouver des bugs ridicules dans mon code. Pour cette raison, la seule façon de me rendre
SpockAI
au travail avant la date limite était d'utiliser un grand pool de threads. Le résultat final est que (actuellement) SpockAI peut atteindre + 90% d'utilisation du processeur et 2 Go + d'utilisation de mémoire (bien que je blâme le garbage collector pour cela). J'ai l'intention de participerSpockAI
au concours, mais si d'autres estiment que cela constitue une violation des règles , je décernerai le titre de "gagnant" à la deuxième place qui devrait l'SpockAI
emporter. Si vous vous sentez de cette façon, veuillez laisser un commentaire à cet effet sur cette réponse.la source
InferencePlayer.java
Code complet sur Github (note: cela utilise le même
AbstractCluedoPlayer
que mon précédentSimpleCluedoPlayer
).Le véritable noyau de ce joueur est sa
PlayerInformation
classe (ici légèrement taillée):Il unifie les informations sur les suggestions que le joueur n'a pas réfutées (indiquant qu'il ne détient aucune de ces cartes), les suggestions qu'il a réfutées (indiquant qu'il détient au moins une de ces cartes) et les cartes dont l'emplacement est certain. Ensuite, il applique de manière itérative quelques règles de base pour compacter ces informations dans leur essence.
Je ne pense pas qu'il y ait plus d'informations déterministes à obtenir (sauf via de fausses accusations, que je suppose trop rares pour être gênantes), même si j'ai peut-être oublié quelque chose. Il est possible pour un joueur plus sophistiqué d'estimer les probabilités que le joueur X ait la carte Y ...
L'autre domaine qui admet probablement une amélioration significative est de décider quelle suggestion faire. J'essaie de maximiser le gain d'informations en utilisant une approche de force lourde assez maladroite, mais il y a beaucoup d'heuristique mal justifiée dans l'évaluation des mérites relatifs des connaissances acquises à partir de différentes réfutations hypothétiques. Cependant, je ne vais pas essayer de régler l'heuristique jusqu'à ce que quelqu'un d'autre poste un adversaire digne.
la source
/tmp
. Ce devrait être un simple patch; Je vais l'examiner sous peu.CluePaddle (ClueStick / ClueBat / ClueByFour) - C #
J'ai écrit ClueBot, un client C # pour lequel il est simple d'implémenter des IA et diverses IA, y compris la tentative la plus sérieuse appelée CluePaddle. Le code est à https://github.com/jwg4/SpeedClueContest/tree/clue_paddle avec une demande de pull a commencé à le fusionner en amont.
ClueStick est une preuve de concept qui ne fait que deviner et ignorer la plupart des événements. ClueBat est une autre IA stupide, sauf qu'elle essaie d'exploiter une faille dans ClueStick pour l'obliger à faire de fausses accusations. ClueByFour est une IA raisonnable en ce sens qu'elle fait des suggestions raisonnables et se souvient des cartes qu'elle est montrée par les autres.
CluePaddle est le plus intelligent. Il essaie de déterminer qui a quoi, non seulement en fonction des aveux proposés, mais également en fonction des joueurs qui n'ont pas proposé de rejeter une suggestion donnée. Il ne prend pas en compte le nombre de cartes que chaque joueur possède, mais cela doit être corrigé. Il comprend quelques classes assez longues, donc je ne publierai pas tout le code ici, mais la méthode suivante donne une saveur.
Si les 4 jouent les uns contre les autres, CluePaddle remporte de loin le plus de matchs, avec ClueByFour deuxième et les deux autres nulle part.
Seul CluePaddle est une entrée compétitive (jusqu'à présent). Usage:
Si quelqu'un d'autre veut créer une IA C #, créez simplement un projet ConsoleApplication dans la solution, implémentez le
IClueAI
interface dans une classe, puis de faireProgram
dériverProgramTemplate
et copier ce que font les autres projetsMain()
. La seule dépendance est NUnit pour les tests unitaires et vous pouvez facilement supprimer tous les tests du code (mais ne l'installez pas, installez simplement NUnit).la source
CluePaddle
projet ne compile pas, affirmant qu'ilNUnit
n'est pas installé même si les autres projets compilent. Ceux qui compilent finissent par se bloquer pendant les tests et Java signale une erreur de réinitialisation de connexion. Pourriez-vous m'aider à déterminer si j'ai peut-être fait quelque chose de mal?ClueStick
est la seule IA qui cale lorsque j'essaye de la démarrer. Les deux autres participent au tournoi d'essai et finissent par être disqualifiés pour les mêmes infractions.ClueByFour
est disqualifié pour avoir omis de répéter une suggestion non confirmée qu'il fait comme une accusation lorsqu'il ne détient aucune des cartes.ClueBat
est disqualifié pour avoir porté des accusations dont les cartes lui ont été montrées ou qu'il a en main. Veuillez consulter les restrictions d'IA révisées pour garantir la conformité.CluePaddle
. Je ferai une demande de tirage pour ces derniers plus tard.