Hintergrund
Das Spiel Morra ist ein einfaches Spiel. In der "Original" -Version werfen mehrere Spieler gleichzeitig eine Zahl von 0 bis 5 mit ihren Händen aus, während sie die Gesamtsumme aller Hände erraten. Die hier verwendete Version wurde geändert, um das Potenzial für nicht-triviale Strategien zu erhöhen. Sie wird nachfolgend beschrieben:
- Es gibt zwei Spieler.
- Wie bei einer Stein-Papier-Schere bewegen sich die Spieler gleichzeitig.
- In jeder Runde wählt jeder Spieler eine Zahl von 0-5 und errät auch die Wahl seines Gegners von 0-5. Dies bedeutet, dass jede Runde zwei Zahlen ausgegeben werden. Zur Verdeutlichung sollte die Ausgabe beider Zahlen im Bereich von 0 bis einschließlich 5 liegen.
- Wenn Sie die Wahl Ihres Gegners richtig erraten, aber Ihr Gegner nicht richtig geraten hat, gewinnen Sie eine bestimmte Anzahl von Punkten, die der Summe der beiden gespielten Zahlen entspricht. Wenn zum Beispiel die gespielten Zahlen 3 und 5 wären, wäre eine korrekte Schätzung 8 Punkte wert.
- Wenn beide oder keiner der Spieler richtig raten, werden keine Punkte vergeben.
- Die Person mit den meisten Punkten nach 1000 Runden gewinnt das Spiel.
Der Wettbewerb
Das Turnier wird im Round-Robin-Stil ausgetragen und es wird jede mögliche Paarung von Teilnehmern erstellt. Für jeden Sieg erhält der Teilnehmer 2 Siegpunkte. Jedes Unentschieden ergibt 1 Siegpunkt. Für einen Verlust werden keine Siegpunkte gewonnen.
Intuitiv ist der Gewinner des Turniers der Teilnehmer mit den meisten Siegpunkten gegen andere.
Wie betrete ich?
Es gibt zwei Methoden, um Bots zum Wettbewerb einzureichen. Die erste und am meisten bevorzugte Methode besteht darin, eine vom Controller bereitgestellte Java-Schnittstelle zu implementieren. Die zweite Methode besteht darin, ein unabhängiges Programm zu schreiben.
Lassen Sie uns zuerst die Java-Methode behandeln. Die Schnittstelle, die Sie implementieren müssen, ist Player
und definiert zwei Methoden: public String getName()
Identifiziert Ihren Bot und public int[] getMove(String[] args)
nimmt args
als Array von sechs Zeichenfolgen mychoices myguesses myscore opponentchoices opponentguesses opponentscore
. Ein Beispiel ist das folgende:
042 045 0 324 432 6
Dies bedeutet, dass ich in der ersten Runde 0 gewählt und vermutet habe, dass mein Gegner eine 0 werfen würde. Mein Gegner hat eine 3 geworfen und ich habe eine 4 geworfen. In der dritten Runde hat mein Gegner die richtige Vermutung gemacht, dass ich werfen würde eine 2, was bedeutet, dass er 2 + 4 = 6 Punkte gewinnt.
Ihre Methode gibt ein Array mit zwei Ganzzahlen zurück, die Sie auswählen bzw. schätzen. Ein Beispiel ist {4,2}
für eine Auswahl von 4 und eine Vermutung von 2.
Hier ist ein Beispiel für einen vollständigen Java-Bot, der als Methode geschrieben wurde. Wenn Sie möchten, muss Ihre Einreichung nur enthalten, was in der getMove
Methode vor sich geht.
import java.util.Random;
/**
* A simple example Morra bot to get you started.
*/
public class ExampleBot implements Player
{
public String getName()
{
return "ExampleBot";
}
public int[] getMove(String [] args)
{
//easiest way I know to break down to create a move history
//(just contains their throw history)
char[] theirThrowsC = args[3].toCharArray();
int[] theirThrows = new int[theirThrowsC.length];
for(int i = 0; i < theirThrowsC.length; i++)
{
theirThrows[i] = Integer.parseInt(Character.toString(theirThrowsC[i]));
}
//get my score
int myScore = Integer.parseInt(args[2]);
Random r = new Random();
int guess = r.nextInt(6);
if(theirThrows.length > 0)
{
guess = theirThrows[theirThrows.length-1];
}
//throws a random number, guesses what they threw last
return new int[] {r.nextInt(6),guess};
}
public static int otherMethod(int example) //you can write additional static methods
{
return 0;
}
}
Als eigenständiges Programm
Ich kann derzeit nur begrenzt weitere Sprachen unterstützen. Neben Java kann ich auch Programme akzeptieren, die in Python 3.4, Perl 5 oder Ruby 2.1.5 geschrieben wurden. Wenn es eine Sprache gibt, die mehrere Leute zu wollen scheinen, werde ich mein Bestes tun, um sie hinzuzufügen.
Die Eingabe in Ihr Programm erfolgt über Argumente in der Befehlszeile. Es könnte so aussehen:
perl awesomebot.plx 042 045 0 324 432 6
Die Ausgabe Ihres Programms sollte Ihre Wahl sein, gefolgt von Ihrer Vermutung, gefolgt von Leerzeichen.
Bitte geben Sie in Ihrer Antwort den genauen Befehl an, der zum Ausführen erforderlich ist. Denken Sie daran, dass ich Windows 8.1 verwende.
Extra Regeln
Status und Zeitüberschreitungen werden gespeichert
Ihr Programm darf eine Textdatei im lokalen Verzeichnis erstellen, in der Sie Informationen speichern können. Diese Informationen werden während des gesamten Turniers gespeichert, aber anschließend gelöscht. Geben Sie der Datei einen Namen, den ich identifizieren kann.
Es gibt ein Zeitlimit von 500 Millisekunden, bis Ihr Code antwortet. Wenn Sie nicht innerhalb der vorgegebenen Frist antworten (oder einen ungültigen Zug ausführen), verfällt das jeweilige Spiel. Java-Übermittlungen haben derzeit eine passive Zeitüberschreitung (die ich möglicherweise auf aktive aktualisieren möchte), wohingegen Nicht-Java-Übermittlungen eine aktive Zeitüberschreitung aufweisen, bei der ihr Prozess nach 500 Millisekunden beendet wird.
Weitere Einreichungsregeln
- Sie können mehrere Beiträge einreichen, sofern diese den Regeln entsprechen und kein Tag-Team bilden.
- Jeder Eintrag muss eindeutig sein. Sie können keine exakte Kopie der Logik eines anderen Bots in einer anderen Sprache erstellen.
- Die Bots können nicht miteinander interagieren (um ein Team zu bilden).
- Sie können die Logik der anderen Bots in Ihrem Bot nicht verwenden, um beispielsweise Ihren Konkurrenten zu identifizieren und dessen Aktionen vorherzusagen. Sie können natürlich versuchen, die Strategie Ihres Gegners zu bestimmen.
- Versuchen Sie nicht, mit dem Controller, anderen Teilnehmern oder meinem Computer in Konflikt zu geraten. Stellen Sie keine Verbindung zu externen Informationsquellen her.
Der Controller
Die aktuelle Version des Controllers finden Sie hier . Es ist in Java 8 geschrieben. Die "Tournament" -Datei ist der Haupt-Controller, der auch die Liste der Teilnehmer enthält (wenn Sie Ihre eigenen Wettbewerbe veranstalten möchten).
Bestenliste
Ich konnte die Bestenliste nicht sehr oft aktualisieren. Ich bin dieses Wochenende ziemlich beschäftigt. Mit "ziemlich beschäftigt" meine ich, dass von 6.30 bis 21.30 Uhr kein Zugriff auf einen Computer möglich ist. Hier sind die Ergebnisse nach 5 Läufen. Der "Echo" -Bot verfiel aus irgendeinem Grund (könnte meine Schuld sein, die ich noch nicht untersucht habe).
170 - Quinn and Valor
158 - Historian
142 - DeltaMax
140 - MorraCowbell
132 - Extrapolator
115 - Rainbolt
102 - Popularity
100 - Interpolator
83 - CounterBot
80 - Basilisk
76 - Erratica
65 - Trendy
63 - Scholar
62 - RandomGuesser
60 - KingFisher
59 - NullifierBot
55 - EvolvedBot
48 - Confused
Kredit
Vielen Dank an Rainbolt und Peter Taylor für ihre Hilfe beim Controller.
quelle
Antworten:
Morra Cowbell
Für jeden, der nach Bedeutung im Namen dieses Bots sucht, lässt der Name Morra mich an Space Italian denken , also habe ich geglaubt, ich brauche einen Namen, der darauf spielt. Andere Kandidaten, darunter Morra, täuschen dich und Morra für mich .
Dies ist eine vollständige Klasse, die die
Player
Schnittstelle implementiert . Erklärung unten.Erläuterung
Ich begann damit, Spiele mit weniger Fingern zu analysieren. Das einfachste nicht-triviale erlaubt Anrufe von
0
oder1
und hat die folgende Auszahlungstabelle (Werte sind Auszahlungen für den Reihenspieler):Die
(0,0)
Strategie wird von dominiert(0,1)
, sodass wir den Tisch auf reduzieren könnenJetzt wird die
(1,0)
Strategie von dominiert(0,1)
, so dass wir den Tisch weiter reduzieren könnenUnd jetzt
(1,1)
wird dominiert(0,1)
, also landen wir beiDeshalb ist das Spielen
(0,1)
immer ein Nash-Gleichgewicht. Aber das Merkwürdige ist, dass es nicht der einzige ist. Dies ist ein symmetrisches Nullsummenspiel, so dass die erwartete Auszahlung 0 ist, und jede gemischte Strategie kombinieren(0,1)
und in(1,0)
der(0,1)
mindestens 50% der Zeit , die Auszahlung gepflückt erreicht. Wir haben also einen eindimensionalen Raum von Nash-Gleichgewichten.Es scheint der Fall zu sein, obwohl ich es nicht bewiesen habe, dass
n
-Finger-Morra einn
eindimensionales Polytop von Nash-Gleichgewichten hat, die gemischte Strategien zwischen denn+1
(pick, guess)
Paaren sind, für diepick + guess = n
.Die magischen Zahlen im obigen Code codieren die 32 Eckpunkte des 5-dimensionalen Polytops des Nash-Gleichgewichts. Ich fand sie, indem ich eine lineare Programmierinstanz aufbaute, die das Polytop darstellte, und dann zufällige Zielfunktionen verwendete. Der Grund, alle 32 zu codieren, anstatt einen auszuwählen, ist einfach: Die erwartete Auszahlung ist 0, also muss ich es besser machen als erwartet, um einen Gewinn zu erzielen. Ich gehe im Wesentlichen davon aus, dass der andere Spieler eine gemischte Strategie verwendet, und schätze die Verteilung basierend auf seiner Auswahlhistorie. Dann wähle ich den Polytop-Vertex aus, der meinen erwarteten Gewinn gegenüber dieser geschätzten Verteilung maximiert.
QuinnAndValor demonstriert die Verwundbarkeit der Annahme, dass der andere Spieler eine gemischte Strategie verwendet. Durch das Erkennen eines Spielers, der die Strategien aus den Nash-Gleichgewichten verwendet, kann er in einen Zufallsmodus wechseln, in dem er bei einer Nicht-Gleichgewichtsstrategie im Durchschnitt verlieren kann, aber nur einmal einen Vorsprung aufbauen muss es kann auf das Spielen von Paaren zurückgreifen, für die
pick + guess = n
. Die Nash-Gleichgewichte für ein einzelnes Spiel lassen sich daher nicht einfach auf die Nash-Gleichgewichte für das wiederholte Spiel übertragen, was komplexere Strategien ermöglicht.quelle
Quinn and Valor (aktualisiert)
Quinn und Valor sind ein Elite-Rangerteam. Mit Armbrust und Klaue zerreißen sie jeden Gegner, der es wagt, sie herauszufordern.
Sie gewinnen fast immer gegen alle Java-Lösungen auf meinem Computer.
Bearbeiten:
Ich gebe zu, dass Quinn und Valor es nicht geschafft haben, sich mit Historian zu duellieren, aber ich habe immer noch guten Glauben daran, dass sie das Turnier gewinnen werden.
Mein Prinzip ist, für jede Lösung mit
choice + guess == 5
, auch mitchoice + guess == 5
Stipendiaten zu spielen, um Ihren Vorteil zu bewahren.Aktualisieren:
Nun ... alles ist gerade kompliziert geworden.
quelle
Gelehrte
Der Gelehrte versucht, aus den Bewegungen seines Gegners zu lernen, indem er diejenige auswählt, die sein Gegner weniger vermutet und diejenige, die sein Gegner am häufigsten benutzt. Aber Theorie ist nicht alles, deshalb macht der Gelehrte es nicht besonders gut ...
quelle
DeltaMax
(Aktualisiert, um keine Dateien zu verwenden, und neuer Abschnitt hinzugefügt. Auch geändert, um im ersten Abschnitt nicht mehr hängen zu bleiben.)
Besteht aus einigen Strategien, die einfach beginnen und dann komplexer werden. Wenn Sie eine Strategie löschen, gelangen Sie zum nächsten Abschnitt.
{0, 5}
Beständig raten(choice, guess)
Paar aus, das die beste Erwartung hat, gewichtet, damit die letzten Runden wichtiger sindUm herauszufinden, welche Schicht am Ende verwendet wurde, entfernen Sie das Kommentarzeichen
Linie.
Entschuldigung für das schreckliche Java, ich habe meinen Nachmittag damit verbracht, Teile zusammenzusetzen und die Sprache neu zu lernen :)
quelle
private int strat;
ist gut genug.Historiker
(Aktualisiert: gleiche Logik, kürzerer Code und 100-mal schneller, aber Sie können nur einen Historian-Bot bei einem Turnier verwenden.)
Verwendet den gewichteten Zufall, um ein Wurfschätzungspaar zu wählen, basierend auf der Effektivität, dass nur dieses Paar gegen den vorherigen Verlauf des Gegners verwendet wird. Die Gewichte sind die Quadrate der erreichbaren Punkte.
Schlägt
Quinn and Valor
(nicht mehr) und verliert gegenMorra Cowbell
. Im Turnier mit den meisten BotsHistorian
steht der zweite Platz anQuinn and Valor
.quelle
Morra Cowbell
. Hat den Beitrag bearbeitet. Sie können Kommentare jedoch löschen, wenn sie veraltet sind.Extrapolator (v1.1)
Extreme Extrapolation aus einem der Nash-Gleichgewichte eines einfacheren Spiels.
Ich unterstütze das knappe Antwortformat! (Im Python-Stil.)
Scheint mit der Magic Cow (Morra Cowbell) zu binden und schlägt andere Einträge, die ich überprüft habe.
quelle
Modisch
Trendy wirft einen Blick auf die vergangenen Züge des Gegners und gewichtet sie nach Aktualität. Vermutet den schwersten und nimmt einen davon leicht ab. Hier ist es in seiner ganzen Pracht:
Das einzige, womit ich es jetzt vergleichen kann, ist Cowbell. Es verliert die meiste Zeit mit einem kleinen Vorsprung, liegt aber für meinen Geschmack oft genug vorne. Wir werden sehen, wie es mit mehr Wettbewerbern aussieht.
quelle
Zufälliger Guesser
Das ist wirklich unkompliziert. Es würfelt effektiv einen W6 und fügt dem vorherigen Wurf einen weiteren Wurf hinzu. Es wird nicht gewinnen, aber es wird ein guter Maßstab sein.
quelle
Verwirrt, Python 3
Ein unnötig komplizierter Eintrag. Auch ich weiß nicht, was es tut.
Obwohl dieser fortschrittliche Algorithmus in diesem Turnier schlechter als zufällig zu sein scheint und viel Speicher und Laufzeit benötigt, liefert er für bestimmte Werte von 5 erstaunliche Ergebnisse ;-)
quelle
Regenblitz
Nimmt den Unterschied zwischen den letzten beiden Zahlen, die unser Gegner erraten hat, addiert dies zu den neuesten Schätzungen unseres Gegners, findet den Modul und vermeidet es, diese Zahl um jeden Preis zu wählen. Wenn Sie beispielsweise {5,4,3} schätzen (absteigend um eins), vermeiden wir unter allen Umständen die Auswahl von 2.
Nimmt den Unterschied zwischen den letzten beiden Zahlen, die unser Gegner gewählt hat, addiert dies zu der letzten Wahl unseres Gegners und schätzt diese Zahl. Wenn Sie beispielsweise {1,4,5,2} schätzen (um drei erhöhen), würden wir 5 schätzen.
Vermeidet sinnlose oder sehr nahe an sinnlosen Rollen.
quelle
getMove()
Methode nicht statisch. Sie können eine solche nicht statische Methode nicht implementieren (zumindest nicht in Java 8).Entwickelter Bot
Ich habe diesen Bot zum besten zufallsbasierten Bot entwickelt.
quelle
Popularität, Python 3
Berechnen Sie die Schätzung anhand der in der Vergangenheit vom Gegner verwendeten populären Zahlen. Die zuletzt verwendeten Zahlen haben mehr Gewicht. Die Wahl der Zahl ist oft die gleiche wie die Vermutung.
quelle
Interpolator
(Wurde auf Java umgestellt, da Python Probleme verursachte.)
Verwendet die Polynominterpolation für die letzten 10 Gegnerwahlen, um die nächste Zahl des Gegners zu ermitteln, und tut dann dasselbe mit seinen eigenen Wahlen und vermeidet es , diese Zahl zu wählen. Interpolator hat auch eine leichte Abneigung gegen die Wahl von 0 oder 5, und seine Wahl wird manchmal durch seine Vermutung beeinflusst:
quelle
CounterBot
Nicht Zähler jemand , sondern zählt durch 0-5 in einem Kreis (
0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4 ...
)quelle
Basilisk, Python
Der Legende nach ist der Basilisk der König der Schlangen. ( Quelle ) Ich dachte, das ist ein passender Name für einen Bot, der "The Noble Game Of Kings" spielt und in Python geschrieben ist. = D Dieser Bot schlägt Furcht in das Herz der anderen Bots und verursacht den Tod mit einem einzigen Blick.
Dies läuft auf einer ziemlich einfachen Strategie. Ich erwarte nicht, dass es gewinnt, aber es hat Spaß gemacht zu schreiben. Dies ist auch meine erste KoTH-Herausforderung. Ich bin gespannt, wie gut sie abschneidet.
Wie es seinen nächsten Schritt auswählt.
Der Basilisk macht immer den Zug, den sein Gegner am wenigsten erraten hat. Im Falle eines Unentschieden wählt er die kleinere Zahl. (um die Anzahl der Punkte des Gegners zu minimieren.)
Wie es seine nächste Vermutung trifft.
Der Basilisk wird die wahrscheinlichste Antwort auf seine vorherige Vermutung auswählen. Wenn es zum Beispiel das letzte Mal eine 3 erraten hat, wird es alle vorherigen Male durchlaufen, bei denen es eine 3 erraten hat, und dann den häufigsten gegnerischen Zug zurückgeben, der nach einer Vermutung von 3 eintritt , wählt es die größere Zahl (um die Anzahl der Punkte zu maximieren, die es machen könnte.)
Läuft dies technisch gesehen korrekt? Ist print () ausreichend, oder sollte ich so etwas wie sys.stdout.write () verwenden, wie es die anderen Pythonisten getan haben?
quelle
Dito
Dies verwandelt sich in den Gegner, aber hinterher durch eine Vermutung / Wahl.
quelle
NullifierBot, Java
Wirft immer 0, um die Gewinne des Gegners zu minimieren. Wenn der Gegner jemals meine Nummer errät, verdient er nur das, was er geworfen hat.
Errate immer 5, um meine Gewinne zu maximieren. Da ich mit meinem Wurf keine Punkte erzielen kann, möchte ich möglichst viele vom Gegner erhalten. Ich könnte zufällig raten, aber wo ist der Spaß dabei?
quelle
Erratica, Java
Nicht großartig, aber es war ursprünglich so konzipiert, dass es größtenteils zufällig war, bis der Wert des Kompromisses bei mir herausfiel. Schafft es, konstant gegen Counter Bot> _ <zu verlieren
quelle
Echo, Rubin
Spielt das letzte Spiel des Gegners nach der Theorie, dass jeder einen Bot machen kann, den er nicht vorhersagen kann. Vermutungen basieren auf dem Erwartungswert anhand einer Stichprobe von 100 Zügen.
quelle
echo.rb:3:in
<main> ': undefinierte Methodesize' for nil:NilClass (NoMethodError)
. Es scheint nur in der ersten Runde aufzutreten, wenn es keinen Zugverlauf gibt.if (mychoices.size > 990 && myscore == '0') nextchoice = rand(1..5)
Teils?KÖNIG FISCHER
Dieser Typ besteht aus falschen Alghorithmen, die hauptsächlich gewichtete Arrays verwenden.
quelle
Äh äh Ich weiß was du denkst. "Wird er fünf auswählen oder etwas anderes?" Um ehrlich zu sein, bei all dieser Aufregung bin ich mir selbst nicht sicher, aber da dies eine .44-Methode ist, die leistungsstärkste Methode der Welt und Ihren Stack sofort überlasten würde, müssen Sie sich eine Frage stellen : "Fühle ich mich glücklich?"
Na ja, Punk?
quelle