Pista de velocidad
Cluedo / Clue es un clásico juego de mesa con un atractivo componente de deducción. Speed Clue es una variante de 3-6 jugadores que enfatiza este componente al usar solo las cartas. El resultado es que la única diferencia entre Cluedo estándar y Speed Clue es que cada jugador que todavía está en el juego puede hacer cualquier sugerencia que le plazca en su turno en lugar de esperar para llegar a una habitación específica a merced de los dados y las sugerencias de otros jugadores. Si nunca antes has jugado a Cluedo, o quieres estar seguro de las diferencias explícitas entre las dos versiones, puedes encontrar una regla completa de Speed Clue aquí .
Gol
Escriba y envíe un programa de IA para jugar Speed Clue antes del 15 de mayo de 2014 a las 00:00 GMT. Después de ese tiempo, organizaré un torneo con todas las entradas legales. El participante cuya IA gana más juegos en el torneo gana el desafío.
Especificaciones AI
Puedes escribir tu IA en casi cualquier idioma que elijas, usando las técnicas que uses, siempre que use estrictamente el protocolo de aplicación a través de una conexión TCP / IP para jugar con el servidor. Puede encontrar una explicación detallada de todas las restricciones aquí .
Cómo jugar
Comience por bifurcar el repositorio del concurso GitHub . Agregue un directorio debajo del
entries
directorio nombrado usando su nombre de usuario StackExchange y desarrolle su código en esa carpeta. Cuando esté listo para enviar su entrada, haga una solicitud de extracción con sus revisiones, luego siga estas instrucciones para anunciar su entrada en este sitio.
He proporcionado algunos códigos y JAR en el core
directorio para que pueda comenzar; visite mi sitio para obtener una guía aproximada de los materiales. Además, otros jugadores envían códigos de ayuda además de sus entradas para ayudarlo a ponerse en marcha. ¡Tómese un tiempo para explorar las entradas y no olvide probar su entrada con las entradas de otros antes de enviarla!
Resultados
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: ""
Los resultados anteriores muestran el porcentaje de victorias que tuvo cada IA calificada de los 25.200 partidos válidos en los que participó. Hubo 30,000 coincidencias en total que contaron para los resultados, y 6,100 más o menos que se descontaron cuando 01
fue descalificado.
Una mención de honor debe ir a la 01
IA de Ray . Mi prueba inicial mostró que era la más fuerte y esperaba que ganara la competencia. Sin embargo, parece tener un error muy intermitente que, hasta donde puedo adivinar, lo lleva a eliminar todas las soluciones posibles. El torneo había terminado todos los partidos de tres jugadores y había comenzado los partidos de cuatro jugadores (¡12,000 juegos en!) Cuando 01
se reveló el error. Si solo considero la clasificación de partidos de 3 jugadores, los resultados se verán así:
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%
Había planeado hacer una extracción de datos sobre los resultados, pero estoy agotado. Tuve dificultades técnicas para lograr que la competencia se desarrollara por completo (fallas de energía, reinicios del sistema) que requirieron reescribir completamente el servidor del concurso para guardar su progreso a medida que avanzaba. Comentaré y comprometeré todos los cambios en el código con todos los archivos de resultados que se generaron en caso de que alguien todavía esté interesado. Si decido hacer la minería de datos también, mis resultados también se agregarán al repositorio.
¡Gracias por jugar!
fuente
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.
¿Por qué dos puertos?Respuestas:
AI01 - Python 3
No puedo encontrar un mejor nombre para él todavía :-P.
Identificador : ray-ai01
Tecnología : Python 3
Seleccionado : si
Argumentos :
ai01.py identifier port
Descripción : Trabajo por inferencia. Cuando el número de tarjetas que el propietario desconoce es inferior a un umbral, esta IA comienza a eliminar todas las soluciones imposibles por inferencia global recursiva. De lo contrario, utiliza inferencia local.
El código AI se puede encontrar aquí .
fuente
SpockAI
. Se desempeña bastante bien en contra01
. No sé si ganará la competencia, pero me alegra ver reducido su recuento de victorias; )SimpleCluedoPlayer.java
Esta clase usa
AbstractCluedoPlayer
, que maneja todas las E / S y permite que la lógica funcione con una interfaz simple escrita. Todo está en github .Esto supera al jugador aleatorio con alta probabilidad (en el peor de los casos, toma 15 sugerencias, mientras que el jugador aleatorio toma un promedio de 162), pero será fácilmente derrotado. Lo ofrezco para que la pelota ruede.
fuente
SpockAI
Identificador:
gamecoder-SpockAI
Repo Entry: haga clic aquí
Seleccionado: Sí
Tecnología: Java 7 basado en
com.sadakatsu.clue.jar
Argumentos:
{identifier} portNumber [logOutput: true|false]
Descripción:
SpockAI
es un jugador Speed Clue construido sobre una clase llamadaKnowledge
que escribí. LaKnowledge
clase representa todos los estados posibles que el juego podría haber dado lo que ha sucedido hasta ahora. Representa las soluciones del juego y las posibles manos de los jugadores como conjuntos, y utiliza deducciones iterativas para reducir estos conjuntos lo más posible cada vez que se aprende algo.SpockAI
usa esta clase para determinar qué sugerencias se aseguran de tener los peores resultados más útiles y selecciona aleatoriamente una de esas sugerencias en sus turnos. Cuando necesita refutar una sugerencia, intenta mostrar una carta que ya ha mostrado la IA sugerida o mostrar una carta de la categoría para la cual ha reducido las posibilidades lo más mínimo posible. Solo hace una acusación cuando conoce la solución.La heurística que utilicé para determinar la mejor sugerencia es la siguiente. Después de que toda la información se haya aprendido de una sugerencia, la posible solución y los posibles conjuntos de manos del jugador se habrán reducido (a menos que la sugerencia no revele nueva información). Teóricamente, la mejor sugerencia es la que más reduce el número de posibles soluciones. En el caso de un empate, supongo que es mejor una sugerencia que reduzca más el número de manos posibles para los jugadores. Entonces, para cada sugerencia, intento todos los resultados posibles que no conduzcan a una contradicción en el conocimiento. Se supone que el resultado que tenga la menor mejora en el recuento de soluciones / manos es el resultado que tendrá la sugerencia. Luego comparo todos los resultados de las sugerencias y elijo cuál tiene el mejor resultado. De esta manera, garantizo una ganancia óptima de información en el peor de los casos.
Estoy considerando agregar un análisis de combinación de fuerza bruta de posibles soluciones y posibles manos de jugadores para hacer
SpockAI
aún más fuerte, pero como yaSpockAI
es la entrada más lenta y que requiere más recursos, probablemente me saltearé eso.Renuncia:
Tenía la intención de lanzar una IA para este concurso hace semanas. Tal como están las cosas, no pude comenzar a escribir mi IA hasta el viernes de la semana pasada, y seguí encontrando errores ridículos en mi código. Debido a esto, la única forma en que pude llegar
SpockAI
al trabajo antes de la fecha límite fue usando un gran grupo de subprocesos. El resultado final es que (actualmente) SpockAI puede alcanzar un uso de CPU de + 90% y un uso de memoria de 2GB + (aunque culpo al recolector de basura por esto). Tengo la intención de participarSpockAI
en el concurso, pero si otros creen que es una violación de las reglas , otorgaré el título de "ganador" al segundo lugar en caso deSpockAI
ganar. Si te sientes así, deja un comentario al respecto en esta respuesta.fuente
InferencePlayer.java
Código completo en Github (nota: esto usa lo mismo
AbstractCluedoPlayer
que el anteriorSimpleCluedoPlayer
).El verdadero núcleo de este jugador es su
PlayerInformation
clase (aquí ligeramente recortada):Unifica la información sobre las sugerencias que el jugador no refutó (lo que indica que no tienen ninguna de esas cartas), las sugerencias que sí refutaron (lo que indica que tienen al menos una de esas cartas) y las cartas cuya ubicación es segura. Luego, aplica iterativamente algunas reglas básicas para compactar esa información en su esencia.
No creo que se pueda obtener más información determinista (excepto a través de acusaciones falsas, que supongo que es demasiado raro para molestar), aunque es posible que haya pasado por alto algo. No es posible para un jugador más sofisticado para estimar las probabilidades de que el jugador X tiene tarjeta de Y ...
La otra área que probablemente admite una mejora significativa es decidir qué sugerencia hacer. Intento maximizar la ganancia de información usando un enfoque de fuerza pesada bastante torpe, pero hay una gran cantidad de heurística mal justificada en la evaluación de los méritos relativos del conocimiento obtenido de diferentes pruebas hipotéticas. Sin embargo, no voy a intentar ajustar la heurística hasta que alguien más publique un oponente digno.
fuente
/tmp
. Debería ser un parche simple; Lo investigaré en breve.CluePaddle (ClueStick / ClueBat / ClueByFour) - C #
He escrito ClueBot, un cliente de C # para el que es sencillo implementar IA y varias IA, incluido el intento más serio llamado CluePaddle. El código se encuentra en https://github.com/jwg4/SpeedClueContest/tree/clue_paddle con una solicitud de extracción que comenzó a fusionarse en sentido ascendente.
ClueStick es una prueba de concepto que básicamente solo adivina e ignora la mayoría de lo que sucede. ClueBat es otra estúpida IA, excepto que intenta explotar una falla en ClueStick para obligarlo a hacer falsas acusaciones. ClueByFour es una IA razonable ya que hace sugerencias razonables y recuerda las tarjetas que otros muestran.
CluePaddle es el más inteligente. Trata de averiguar quién tiene qué basado no solo en las pruebas que se han ofrecido, sino también en qué jugadores no ofrecieron una prueba de una sugerencia dada. No tiene en cuenta cuántas cartas tiene cada jugador atm pero esto debe ser arreglado. Incluye un par de clases bastante largas, por lo que no publicaré todo el código aquí, pero el siguiente método le da un sabor.
Si los 4 juegan uno contra el otro, CluePaddle gana con mucho la mayoría de los juegos, con ClueByFour segundo y los otros dos en ninguna parte.
Solo CluePaddle es una entrada competitiva (hasta ahora). Uso:
Si alguien más quiere hacer un C # AI, simplemente cree un proyecto de ConsoleApplication en la solución, implemente la
IClueAI
interfaz en una clase y luego haga suProgram
derivaciónProgramTemplate
y copie lo que hacen los otros proyectosMain()
. La única dependencia es NUnit para las pruebas unitarias y puede eliminar fácilmente todas las pruebas del código (pero no lo haga, simplemente instale NUnit).fuente
CluePaddle
proyecto no se compila, alegando queNUnit
no está instalado a pesar de que los otros proyectos sí lo hacen. Los que compilan terminan deteniéndose durante las pruebas, y Java informa un error de restablecimiento de la conexión. ¿Podría ayudarme a determinar si he hecho algo mal?ClueStick
es la única IA que se detiene cuando intento iniciarla. Los otros dos compiten en el torneo de prueba y eventualmente son descalificados por las mismas violaciones.ClueByFour
queda descalificado por no repetir una sugerencia no refutada que hace como acusación cuando no tiene ninguna de las cartas.ClueBat
queda descalificado por hacer acusaciones de que tiene cartas que se le han mostrado o que tiene en la mano. Consulte las restricciones revisadas de IA para garantizar el cumplimiento.CluePaddle
. Haré una solicitud de extracción para estos más tarde.