Geschwindigkeits-Hinweis
Cluedo / Clue ist ein klassisches Brettspiel mit einer überzeugenden Deduktions-Gameplay-Komponente. Speed Clue ist eine 3-6-Spieler-Variante, die diese Komponente hervorhebt, indem sie nur die Karten verwendet. Das Ergebnis ist, dass der einzige Unterschied zwischen Standard Cluedo und Speed Clue darin besteht, dass jeder Spieler, der noch im Spiel ist, einen beliebigen Vorschlag machen kann, anstatt darauf zu warten, einen bestimmten Raum zu erreichen, der Würfeln und den Vorschlägen anderer Spieler ausgeliefert ist. Wenn Sie Cluedo noch nie gespielt haben oder sich der expliziten Unterschiede zwischen den beiden Versionen sicher sein möchten, finden Sie hier möglicherweise einen vollständigen Regelsatz für Geschwindigkeitsinformationen .
Tor
Schreiben und senden Sie ein AI-Programm, um Speed Clue vor dem 15. Mai 2014 um 00:00 Uhr GMT zu spielen. Nach dieser Zeit werde ich ein Turnier mit allen zulässigen Einträgen durchführen. Der Teilnehmer, dessen KI die meisten Spiele des Turniers gewinnt, gewinnt die Herausforderung.
AI-Spezifikationen
Sie können Ihre KI in so gut wie jeder Sprache schreiben, unabhängig von den verwendeten Techniken, sofern das Anwendungsprotokoll für das Spielen mit dem Server über eine TCP / IP-Verbindung verwendet wird. Eine ausführliche Erläuterung aller Einschränkungen finden Sie hier .
Spielanleitung
Beginnen Sie, indem Sie das GitHub-Repository des Wettbewerbs teilen . Fügen Sie unter dem entries
Verzeichnis mit Ihrem StackExchange-Benutzernamen ein Verzeichnis hinzu
, und entwickeln Sie den Code in diesem Ordner. Wenn Sie bereit sind, Ihren Eintrag einzureichen, stellen Sie eine Pull-Anfrage mit Ihren Überarbeitungen und befolgen Sie diese Anweisungen, um Ihren Eintrag auf dieser Site bekannt zu geben.
Ich habe Code und JARs im core
Verzeichnis bereitgestellt , um Ihnen den Einstieg zu erleichtern . Eine grobe Anleitung für die Materialien finden Sie auf meiner Website . Darüber hinaus übermitteln andere Spieler zusätzlich zu ihren Einträgen einen Hilfecode, um Ihnen den Einstieg zu erleichtern. Nehmen Sie sich etwas Zeit, um die Einträge zu untersuchen, und vergessen Sie nicht, Ihren Eintrag mit den Einträgen anderer zu vergleichen, bevor Sie ihn einreichen!
Ergebnisse
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: ""
Die obigen Ergebnisse zeigen den Gewinnanteil jeder qualifizierten KI an den 25.200 gültigen Spielen, an denen sie teilgenommen hat. Es gab insgesamt 30.000 Spiele, die für die Ergebnisse angerechnet wurden, und 6.100 wurden abgezinst, als 01
die Qualifikation disqualifiziert wurde.
Eine lobende Erwähnung muss an Rays 01
KI gehen. Meine ersten Tests zeigten, dass es das stärkste war und ich erwartete, dass es die Konkurrenz gewinnen würde. Es scheint jedoch einen sehr sporadischen Fehler zu geben, der meines Erachtens dazu führt, dass alle möglichen Lösungen beseitigt werden. Das Turnier hatte alle 3-Spieler-Matches beendet und die 4-Spieler-Matches (12.000 Partien!) Gestartet, als 01
der Bug aufgedeckt wurde. Wenn ich nur die 3-Spieler-Rangliste betrachte, sehen die Ergebnisse so aus:
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%
Ich hatte vor, Data Mining für die Ergebnisse durchzuführen, bin aber erschöpft. Ich hatte technische Probleme damit, die Konkurrenz vollständig zum Laufen zu bringen (Stromausfälle, Systemneustarts), was es erforderlich machte, den Contest-Server komplett neu zu schreiben, um seinen Fortschritt zu speichern. Ich werde alle Änderungen am Code mit allen Ergebnisdateien kommentieren und festschreiben, die generiert wurden, falls noch jemand daran interessiert ist. Wenn ich mich auch für das Data Mining entscheide, werden meine Ergebnisse auch zum Repository hinzugefügt.
Danke fürs Spielen!
quelle
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.
Warum zwei Ports?Antworten:
AI01 - Python 3
Ich kann noch keinen besseren Namen dafür finden :-P.
Kennung : ray-ai01
Technologie : Python 3
Ausgewählt : ja
Argumente :
ai01.py identifier port
Beschreibung : Arbeiten durch Inferenz. Wenn die Anzahl der Karten, deren Besitzer nicht bekannt ist, einen bestimmten Schwellenwert unterschreitet, beseitigt diese KI alle unmöglichen Lösungen durch rekursive globale Inferenz. Andernfalls wird die lokale Inferenz verwendet.
Den AI-Code finden Sie hier .
quelle
SpockAI
. Es funktioniert ziemlich gut gegen01
. Ich weiß nicht, ob es den Wettbewerb gewinnen wird, aber ich bin froh, dass Sie weniger gewinnen. )SimpleCluedoPlayer.java
Diese Klasse verwendet
AbstractCluedoPlayer
, die alle E / A behandelt und die Logik mit einer einfachen typisierten Schnittstelle arbeiten lässt. Das Ganze ist auf Github .Dies schlägt den zufälligen Spieler mit hoher Wahrscheinlichkeit (im schlimmsten Fall sind es 15 Vorschläge, während der zufällige Spieler durchschnittlich 162 nimmt), aber es wird leicht geschlagen. Ich biete es an, um den Ball ins Rollen zu bringen.
quelle
SpockAI
Kennung:
gamecoder-SpockAI
Repo-Eintrag: hier klicken
Ausgewählt: Ja
Technologie: Java 7 basiert auf
com.sadakatsu.clue.jar
Argumente:
{identifier} portNumber [logOutput: true|false]
Beschreibung:
SpockAI
ist ein Speed Clue-Spieler, der auf einer Klasse basiertKnowledge
, die ich geschrieben habe. DieKnowledge
Klasse repräsentiert alle möglichen Zustände, die das Spiel bisher hätte liefern können. Es stellt die Lösungen des Spiels und die möglichen Hände der Spieler als Sätze dar und verwendet iterative Abzüge, um diese Sätze jedes Mal, wenn etwas gelernt wird, so weit wie möglich zu reduzieren.SpockAI
Verwendet diese Klasse, um zu bestimmen, welche Vorschläge die hilfreichsten Worst-Case-Ergebnisse liefern, und wählt zufällig einen dieser Vorschläge aus. Wenn ein Vorschlag widerlegt werden muss, wird versucht, entweder eine Karte zu zeigen, die die vorschlagende KI bereits gezeigt hat, oder eine Karte aus der Kategorie, für die die Möglichkeiten am wenigsten reduziert wurden. Es macht nur dann einen Vorwurf, wenn es die Lösung kennt.Die Heuristik, mit der ich den besten Vorschlag ermittelt habe, lautet wie folgt. Nachdem alle Informationen aus einem Vorschlag gelernt wurden, wurden die mögliche Lösung und die möglichen Spielerhandsätze reduziert (es sei denn, der Vorschlag enthüllt keine neuen Informationen). Theoretisch ist der beste Vorschlag derjenige, der die Anzahl der möglichen Lösungen am meisten reduziert. Bei einem Unentschieden gehe ich davon aus, dass ein Vorschlag, der die Anzahl der möglichen Hände für die Spieler am meisten verringert, besser ist. Deshalb versuche ich für jeden Vorschlag jedes mögliche Ergebnis, das nicht zu einem Widerspruch im Wissen führt. Es wird davon ausgegangen, dass das Ergebnis des Vorschlags das Ergebnis ist, das die geringste Verbesserung der Lösungs- / Handzählung aufweist. Dann vergleiche ich alle Ergebnisse der Vorschläge und wähle aus, welches das beste Ergebnis erzielt. Auf diese Weise garantiere ich einen optimalen Informationsgewinn im ungünstigsten Fall.
Ich denke darüber nach, eine Brute-Force-Kombinationsanalyse möglicher Lösungen und möglicher Spielerhände hinzuzufügen, um
SpockAI
noch stärker zu werden, aber da diesSpockAI
bereits der langsamste und ressourcenintensivste Eintrag ist, werde ich das wahrscheinlich überspringen.Haftungsausschluss:
Ich hatte vor Wochen vor, eine KI für diesen Wettbewerb zu veröffentlichen. So wie es aussieht, konnte ich erst am Freitag der letzten Woche mit dem Schreiben meiner KI beginnen und fand immer wieder lächerliche Fehler in meinem Code. Aus diesem Grund war die einzige Möglichkeit
SpockAI
, vor Ablauf der Frist zur Arbeit zu kommen , die Verwendung eines großen Thread-Pools. Das Endergebnis ist, dass (derzeit) SpockAI + 90% CPU-Auslastung und 2 GB + Speicherauslastung erreichen kann (obwohl ich den Garbage Collector dafür verantwortlich mache). Ich habe vor,SpockAI
am Wettbewerb teilzunehmen, aber wenn andere meinen, dies verstoße gegen die Regeln , werde ich den Titel "Gewinner" vergeben, um den zweiten Platz zuSpockAI
gewinnen. Wenn Sie so denken, hinterlassen Sie bitte einen Kommentar zu dieser Antwort.quelle
InferencePlayer.java
Vollständiger Code auf Github (Hinweis: Dies verwendet den gleichen Code
AbstractCluedoPlayer
wie zuvorSimpleCluedoPlayer
).Der wahre Kern dieses Spielers ist seine
PlayerInformation
Klasse (hier leicht beschnitten):Es vereint Informationen zu Vorschlägen, die der Spieler nicht widerlegt hat (was darauf hinweist, dass er keine dieser Karten besitzt), Vorschläge, die er widerlegt hat (was darauf hinweist, dass er mindestens eine dieser Karten besitzt) und Karten, deren Position sicher ist. Anschließend werden iterativ einige Grundregeln angewendet, um diese Informationen zu ihrer Essenz zu verdichten.
Ich glaube nicht, dass es mehr deterministische Informationen gibt (außer durch falsche Anschuldigungen, die ich für zu selten halte), obwohl ich vielleicht etwas übersehen habe. Es besteht die Möglichkeit, dass ein fortgeschrittener Spieler die Wahrscheinlichkeiten abschätzt, mit denen Spieler X Karte Y hat.
Der andere Bereich, der wahrscheinlich eine signifikante Verbesserung zulässt, ist die Entscheidung, welcher Vorschlag gemacht werden soll. Ich versuche, den Informationsgewinn mit einem ziemlich klobigen Ansatz zu maximieren, aber es gibt eine Menge schlecht begründeter Heuristiken bei der Bewertung der relativen Vorzüge des Wissens, das aus verschiedenen hypothetischen Widerlegungen gewonnen wurde. Ich werde jedoch nicht versuchen, die Heuristik zu optimieren, bis jemand anderes einen würdigen Gegner postet.
quelle
/tmp
. Es sollte ein einfacher Patch sein; Ich werde es gleich untersuchen.CluePaddle (ClueStick / ClueBat / ClueByFour) - C #
Ich habe ClueBot geschrieben, einen C # -Client, für den es einfach ist, AIs zu implementieren, und verschiedene AIs, einschließlich des schwerwiegendsten Versuchs namens CluePaddle. Der Code befindet sich unter https://github.com/jwg4/SpeedClueContest/tree/clue_paddle. Eine Pull-Anforderung wurde gestartet, um den Code in den Upstream zusammenzuführen.
ClueStick ist ein Proof-of-Concept, bei dem die meisten Vorgänge nur erraten und ignoriert werden. ClueBat ist eine andere blöde KI, außer dass sie versucht, einen Fehler in ClueStick auszunutzen, um ihn zu falschen Anschuldigungen zu zwingen. ClueByFour ist insofern eine vernünftige KI, als sie vernünftige Vorschläge macht und sich an die Karten erinnert, die von anderen gezeigt werden.
CluePaddle ist das intelligenteste. Es wird versucht herauszufinden, wer was hat, und zwar nicht nur basierend auf den angebotenen Disproofs, sondern auch basierend darauf, welche Spieler keinen Disproof für einen bestimmten Vorschlag angeboten haben. Es wird nicht berücksichtigt, wie viele Karten jeder Spieler hat, dies muss jedoch behoben werden. Es enthält ein paar ziemlich lange Klassen, so dass ich hier nicht den gesamten Code posten werde, aber die folgende Methode gibt einen Vorgeschmack.
Wenn die 4 gegeneinander spielen, gewinnt CluePaddle mit Abstand die meisten Spiele, wobei ClueByFour an zweiter Stelle und die beiden anderen nirgendwo stehen.
Nur CluePaddle ist (bisher) ein Wettbewerbsbeitrag. Verwendung:
Wenn jemand anderes eine C # AI erstellen möchte, erstellen Sie einfach ein ConsoleApplication-Projekt in der Lösung, implementieren Sie die
IClueAI
Schnittstelle in einer Klasse undProgram
leiten Sie dann die AufgabenProgramTemplate
der anderen Projekte ab und kopieren Sie sieMain()
. Die einzige Abhängigkeit ist NUnit für Komponententests, und Sie können problemlos alle Tests aus dem Code entfernen (installieren Sie NUnit jedoch nicht).quelle
CluePaddle
Projekt wird nicht kompiliert und behauptet, dassNUnit
es nicht installiert ist, obwohl die anderen Projekte kompiliert werden. Diejenigen, die kompilieren, kommen während des Tests zum Stillstand und Java meldet einen Fehler beim Zurücksetzen der Verbindung. Können Sie mir helfen, festzustellen, ob ich etwas falsch gemacht habe?ClueStick
die einzige KI, die zum Stillstand kommt, wenn ich versuche, sie zu starten. Die anderen beiden nehmen am Probeturnier teil und werden schließlich wegen derselben Verstöße disqualifiziert.ClueByFour
wird disqualifiziert, weil er einen unbestrittenen Vorschlag nicht wiederholt, den er als Vorwurf erhebt, wenn er keine der Karten enthält.ClueBat
wird wegen Vorwürfen disqualifiziert, die Karten enthalten, die entweder aufgedeckt wurden oder auf der Hand liegen. Bitte überprüfen Sie die überarbeiteten AI-Einschränkungen , um die Konformität sicherzustellen.CluePaddle
. Ich werde später eine Pull-Anfrage für diese machen.