Speed Clue
Cluedo / Clue é um jogo de tabuleiro clássico com um componente de jogabilidade de dedução atraente. Speed Clue é uma variante de 3-6 jogadores que enfatiza esse componente usando apenas os cartões. O resultado é que a única diferença entre Cluedo padrão e Speed Clue é que cada jogador ainda no jogo pode fazer qualquer sugestão que desejar no seu turno, em vez de esperar para chegar a uma sala específica à mercê dos lançamentos de dados e das sugestões de outros jogadores. Se você nunca jogou Cluedo antes ou deseja ter certeza das diferenças explícitas entre as duas versões, você pode encontrar uma regra completa do Speed Clue definida aqui .
Objetivo
Escreva e envie um programa de IA para jogar o Speed Clue antes de 15 de maio de 2014 às 00:00 GMT. Após esse período, irei realizar um torneio usando todas as entradas legais. O participante cuja IA vencer mais jogos no torneio vence o desafio.
AI Especificações
Você pode escrever sua IA em praticamente qualquer idioma que você escolher, usando as técnicas que você usar, desde que use estritamente o protocolo do aplicativo através de uma conexão TCP / IP para jogar com o servidor. Uma explicação detalhada de todas as restrições pode ser encontrada aqui .
Como jogar
Comece bifurcando o repositório do GitHub do concurso . Adicione um diretório ao
entries
diretório nomeado usando seu nome de usuário StackExchange e desenvolva seu código nessa pasta. Quando estiver pronto para enviar sua inscrição, faça uma solicitação de recebimento com suas revisões e siga estas instruções para anunciar sua entrada neste site.
Eu forneci algum código e JARs no core
diretório para você começar; consulte o meu site para obter um guia aproximado dos materiais. Além disso, outros jogadores estão enviando o código auxiliar, além de suas entradas, para ajudá-lo a começar a trabalhar. Reserve um tempo para explorar as entradas e não se esqueça de testar sua entrada com as de outras pessoas antes de enviar!
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: ""
Os resultados acima mostram a porcentagem de vitórias que cada IA qualificada teve das 25.200 partidas válidas em que participou. No total, foram 30.000 correspondências que foram contabilizadas para os resultados e 6.100 foram descontadas quando 01
desqualificadas.
Uma menção honrosa precisa ir para a 01
IA da ray . Meu teste inicial mostrou que era o mais forte, e eu esperava que vencesse a competição. No entanto, parece ter um bug muito intermitente que, até onde posso imaginar, leva a eliminar todas as soluções possíveis. O torneio terminou todas as partidas de três jogadores e começou as partidas de quatro jogadores (12.000 jogos em!) Quando 01
o bug foi revelado. Se eu considerar apenas a classificação de 3 jogadores, os resultados serão assim:
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%
Eu tinha planejado fazer uma mineração de dados sobre os resultados, mas estou exausto. Tive dificuldades técnicas para fazer com que a competição continuasse (falhas de energia, reinicializações do sistema), o que exigia reescrever completamente o servidor do concurso para salvar seu progresso à medida que prosseguia. Vou comentar e confirmar todas as alterações no código com todos os arquivos de resultados que foram gerados, caso alguém ainda esteja interessado. Se eu decidir fazer a mineração de dados também, meus resultados também serão adicionados ao repositório.
Obrigado por jogar!
fonte
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 que duas portas?Respostas:
AI01 - Python 3
Ainda não consigo encontrar um nome melhor para ele :-P.
Identificador : ray-ai01
Tecnologia : Python 3
Selecionado : sim
Argumentos :
ai01.py identifier port
Descrição : Trabalho por inferência. Quando o número de cartões que o proprietário não é conhecido é menor que um limite, essa IA começa a eliminar todas as soluções impossíveis por inferência global recursiva. Caso contrário, ele usa inferência local.
O código AI pode ser encontrado aqui .
fonte
SpockAI
. Ele funciona muito bem contra01
. Não sei se vencerá a competição, mas fico feliz em ver sua contagem de vitórias reduzida; )SimpleCluedoPlayer.java
Essa classe usa
AbstractCluedoPlayer
, que lida com todas as E / S e permite que a lógica funcione com uma interface digitada simples. A coisa toda está no github .Isso supera o jogador aleatório com alta probabilidade (no pior caso, são necessárias 15 sugestões, enquanto o jogador aleatório leva uma média de 162), mas será facilmente vencido. Eu ofereço para fazer a bola rolar.
fonte
SpockAI
Identificador:
gamecoder-SpockAI
Repo Entry: clique aqui
Selecionado: Sim
Tecnologia: Java 7 baseado em
com.sadakatsu.clue.jar
Argumentos:
{identifier} portNumber [logOutput: true|false]
Descrição:
SpockAI
é um jogador do Speed Clue, construído sobre uma classe chamadaKnowledge
que eu escrevi. AKnowledge
classe representa todos os estados possíveis que o jogo poderia ter dado o que aconteceu até agora. Ele representa as soluções do jogo e as possíveis mãos dos jogadores como sets e usa deduções iterativas para reduzir esses sets o máximo possível sempre que algo é aprendido.SpockAI
usa essa classe para determinar quais sugestões têm os melhores resultados de pior caso e seleciona aleatoriamente uma dessas sugestões. Quando ele precisa refutar uma sugestão, ele tenta mostrar um cartão que já mostrou a IA sugerida ou mostrar um cartão da categoria para a qual reduziu ao mínimo as possibilidades. Só faz uma acusação quando conhece a solução.A heurística que usei para determinar a melhor sugestão é a seguinte. Após todas as informações terem sido aprendidas com uma sugestão, a solução possível e os conjuntos de mãos possíveis serão reduzidos (a menos que a sugestão não revele informações novas). Teoricamente, a melhor sugestão é a que mais reduz o número de soluções possíveis. No caso de empate, presumo que seja melhor uma sugestão que reduza o número de mãos possíveis para os jogadores. Portanto, para cada sugestão, tento todos os resultados possíveis que não levem a uma contradição no conhecimento. Qualquer resultado que tenha menos melhorias nas contagens de solução / mão é considerado o resultado que a sugestão terá. Depois, comparo os resultados de todas as sugestões e escolho qual delas tem o melhor resultado. Dessa forma, garanto o ganho ideal de informações no pior caso.
Estou pensando em adicionar uma análise de combinação de força bruta de possíveis soluções e possíveis jogadores para tornar
SpockAI
ainda mais forte, mas comoSpockAI
já é a entrada mais lenta e com mais recursos, provavelmente ignorarei isso.Aviso Legal:
Eu pretendia lançar uma IA para este concurso semanas atrás. Tal como está, não pude começar a escrever minha IA até sexta-feira da semana passada e continuei encontrando bugs ridículos no meu código. Por esse motivo, a única maneira
SpockAI
de trabalhar antes do prazo final era usar um grande pool de threads. O resultado final é que (atualmente) o SpockAI pode atingir + 90% de utilização da CPU e 2 GB + de memória (embora eu culpe o coletor de lixo por isso). Pretendo participarSpockAI
do concurso, mas se outros acharem que isso é uma violação das regras , atribuirei o título de "vencedor" ao segundo lugar que deveSpockAI
ganhar. Se você se sente assim, por favor, deixe um comentário para esse efeito nesta resposta.fonte
InferencePlayer.java
Código completo no Github (nota: isso usa o mesmo
AbstractCluedoPlayer
que o anteriorSimpleCluedoPlayer
).O verdadeiro núcleo deste player é sua
PlayerInformation
classe (aqui um pouco aparada):Ele unifica informações sobre sugestões que o jogador não refutou (indicando que não possuem nenhuma dessas cartas), sugestões que refutaram (indicando que detêm pelo menos uma dessas cartas) e cartões cuja localização é certa. Em seguida, aplica iterativamente algumas regras básicas para compactar essas informações em sua essência.
Acho que não há mais informações determinísticas a serem obtidas (exceto por meio de falsas acusações, que suponho que sejam muito raras de se preocupar), embora eu possa ter esquecido alguma coisa. Lá é possível para um jogador mais sofisticado para probabilidades de estimativa de que o jogador X tem o cartão de Y ...
A outra área que provavelmente admite melhorias significativas é decidir qual sugestão fazer. Tento maximizar o ganho de informações usando uma abordagem de força pesada bastante desajeitada, mas há muita heurística pouco justificada na avaliação dos méritos relativos do conhecimento adquirido com diferentes refutações hipotéticas. No entanto, não vou tentar ajustar as heurísticas até que alguém poste um oponente digno.
fonte
/tmp
. Deve ser um patch simples; Vou dar uma olhada em breve.CluePaddle (ClueStick / ClueBat / ClueByFour) - C #
Eu escrevi o ClueBot, um cliente C # para o qual é fácil implementar AIs e várias AIs, incluindo a tentativa mais séria chamada CluePaddle. O código está em https://github.com/jwg4/SpeedClueContest/tree/clue_paddle com uma solicitação pull iniciada para mesclá-lo no upstream.
ClueStick é uma prova de conceito que basicamente apenas adivinha e ignora a maior parte do que acontece. O ClueBat é outra IA estúpida, exceto que ele tenta explorar uma falha no ClueStick para forçá-lo a fazer acusações falsas. O ClueByFour é uma IA razoável, na medida em que faz sugestões razoáveis e lembra os cartões que são mostrados por outros.
CluePaddle é o mais inteligente. Ele tenta descobrir quem tem o quê, com base não apenas nas reprovações que foram oferecidas, mas também nos jogadores que não ofereceram uma reprovação a uma sugestão. Não leva em consideração quantas cartas cada jogador tem, mas isso deve ser corrigido. Ele inclui algumas classes bastante longas, portanto não postarei o código inteiro aqui, mas o método a seguir fornece uma amostra.
Se os quatro jogarem um contra o outro, o CluePaddle vence de longe a maioria dos jogos, com o ClueByFour em segundo e os outros dois em lugar nenhum.
Somente CluePaddle é uma entrada competitiva (até agora). Uso:
Se alguém mais quiser criar uma IA em C #, basta criar um projeto ConsoleApplication na solução, implementar a
IClueAI
interface em uma classe e, então,Program
derivarProgramTemplate
e copiar o que os outros projetos fazemMain()
. A única dependência é o NUnit para teste de unidade e você pode facilmente remover todos os testes do código (mas não basta, basta instalar o NUnit).fonte
CluePaddle
projeto não é compilado, alegando queNUnit
não está instalado, mesmo que os outros projetos sejam compilados. Aqueles que são compilados acabam parando durante o teste e o Java relata um erro de redefinição de conexão. Você poderia me ajudar a determinar se posso ter feito algo errado?ClueStick
é a única IA que fica paralisada quando tento iniciar. Os outros dois competem no torneio de julgamento e acabam sendo desqualificados pelas mesmas violações.ClueByFour
é desqualificado por não repetir uma sugestão não comprovada que faz como acusação quando não segura nenhuma das cartas.ClueBat
é desqualificado por fazer acusações de que tem cartões que foram mostrados ou que tem na mão. Verifique as restrições de IA revisadas para garantir a conformidade.CluePaddle
. Farei uma solicitação de recebimento posteriormente.