Ergebnisse (22. Mai 2017 21:40:37 UTC)
Master
18 Runden gewonnen, 2 Runden verloren und 0 Runden
Save One
unentschieden 15 Runden gewonnen, 3 Runden verloren und 2 Runden
Machine Gun
unentschieden 14 Runden gewonnen, 3 Runden verloren und 3 Runden
Monte Bot
unentschieden 14 Runden gewonnen, 3 Runden verloren und 3 Runden
Amb Bot
unentschieden 12 Runden gewonnen Runden, 8 Runden verloren und 0 Runden unentschieden
Coward
gewonnen 11 Runden, 3 Runden verloren und 6 Runden unentschieden
Pain in the Nash
gewonnen 11 Runden, 9 Runden verloren und 0 Runden unentschieden
Nece Bot
gewonnen 10 Runden, 7 Runden verloren und 3 Runden unentschieden
Naming Things is Hard
gewonnen 10 Runden, 7 Runden verloren und 3 Runden
The Procrastinator
unentschieden 10 Runden gewonnen, 8 Runden verloren und 2 Runden
Yggdrasil
unentschieden 10 Runden gewonnen, 10 Runden verloren und 0 Runden
Simple Bot
unentschieden 9 Runden gewonnen, 4 Runden verloren und 7 Runden
Table Bot
unentschieden 9 Runden verloren, 6 Runden verloren Runden und Unentschieden 5 Runden haben
Prioritized Random Bot
8 Runden gewonnen, 7 Runden verloren und 5 Runden unentschieden
Upper Hand Bot
7 Runden gewonnen, 13 Runden verloren und 0 Runden
Aggressor
unentschieden 6 Runden gewonnen, 10 Runden verloren und 4 Runden
Insane
unentschieden 5 Runden gewonnen, 15 Runden verloren und 0 Runden
The Ugly Duckling
unentschieden 4 Runden gewonnen, 16 Runden verloren und 0 Runden
Know Bot
unentschieden 3 Runden gewonnen Runden, 14 Runden verloren und 3 Runden unentschieden
Paranoid Bot
gewonnen 0 Runden, 19 Runden verloren und 1 Runde unentschieden
Panic Bot
gewonnen 0 Runden, 19 Runden verloren und 1 Runde unentschieden
Leider konnte ich The Crazy X-Code Randomess nicht testen, da ich es nicht von Bash auf Linux ausführen kann. Ich werde es hinzufügen, wenn ich es zum Laufen bringen kann.
Das Spiel
Dies ist ein sehr einfaches KoTH-Spiel. Es ist eine Eins-zu-Eins-Schneeballschlacht. Sie haben einen anfänglich leeren Behälter, der k
Schneebällen standhalten kann. Sie können sich bis zu j
Zeiten ducken . In jeder Runde werden beide Spieler gebeten, gleichzeitig eine Wahl für ihren Zug zu treffen. Es gibt drei Züge:
- reload: gibt dir noch einen schneeball (bis zu
k
) - werfen: Wirft einen Schneeball, der den anderen Spieler tötet, wenn er sich zum Nachladen entscheidet. Wenn beide Spieler einen Schneeball werfen, stirbt niemand (sie haben ein so gutes Ziel, dass sie sich gegenseitig auf die Schneebälle schlagen)
- duck: tut nichts und vermeidet es, getroffen zu werden, wenn der andere Spieler einen Schneeball wirft. Wenn du keine Enten mehr hast, passiert nichts und wenn der andere Spieler einen Schneeball wirft, stirbst du.
Zielsetzung
Stirb nicht
Herausforderungsspezifikationen
Ihr Programm kann in jeder Sprache geschrieben werden. Sie müssen jede dieser Variablen als Argument für jede Ausführung verwenden:
[turn, snowballs, opponent_snowballs, ducks, opponent_ducks, max_snowballs]
turn
- wie viele Runden sind vergangen ( 0
bei der ersten Iteration)
snowballs
- wie viele Schneebälle hast du
opponent_snowballs
- wie viele Schneebälle hat der Gegner
ducks
- wie oft du ducken kannst
opponent_ducks
- wie oft der Gegner ducken kann - wie viele
max_snowballs
Schneebälle kannst du maximal store ( k
)
Die Ausgabe der Tastenfunktion sollte 0
für das Nachladen, 1
für das Werfen und 2
für die Ente sein. Sie müssen Ihren Umzug ausgeben, Newline beendet. Bitte gib keine ungültigen Züge aus, aber der Controller ist sehr belastbar und bricht nicht ab, wenn du ungültige Züge ausgibst (auch wenn dein Zug keine ganze Zahl ist). Es muss jedoch mit einem Zeilenvorschub abgeschlossen werden. Wenn der Umzug nicht erfolgt [0, 1, 2]
, wird standardmäßig der Umzug nach ausgeführt 0
. Der Gewinner wird als der Spieler mit den meisten Gewinnen aus einem Full-Round-Robin-Turnier ermittelt.
Regeln
Sie können von / zu einer Datei lesen / schreiben, um zwischen den Iterationen Speicherplatz zu schaffen. Ihr Bot wird in einem eigenen Verzeichnis abgelegt, damit es nicht zu Dateikonflikten kommt. Sie können keine eingebauten Funktionen (wie den Zufallsgenerator) ändern. Es war ziemlich lustig, als es das erste Mal gemacht wurde , aber es wird nicht mehr sein. Ihr Programm ist nicht berechtigt, Dinge zu tun, die nur ein offenes Anhalten der Ausführung bedeuten. Es gelten Standardlücken .
Testen
Den Quellcode für den Controller finden Sie hier . Beispiel für das Laufen: java Controller "python program1/test1.py" "python program2/test2.py" 10 5
für 10 Schneebälle und 5 Enten.
Beurteilen
Der Gewinner wird durch Auswahl der Person mit den meisten Gewinnen nach einem vollständigen Round-Robin ermittelt. Entfernen Sie alle Personen, die nicht die meisten Siege haben, während dies ein Unentschieden ist. Dann wiederholen, bis eine Person gewinnt. Der Richtstandard wird 50 Schneebälle und 25 Enten sein.
Alles Gute!
BEARBEITEN : Das Spiel wird für unentschieden erklärt, wenn 1000 Runden verstrichen sind. Ihr Bot könnte das annehmen turn < 1000
.
quelle
Antworten:
Meister, C #
Ich habe ein kleines neuronales Netzwerk trainiert (mit Sharpneat ). Es scheint, als würde man gerne Schneebälle einsammeln und sich ducken ...
In einer früheren Version des Controllers wurde sogar ein Fehler gefunden. Es ging von 0% Gewinn zu 100%, als es entdeckte, wie man durch Schummeln gewinnt.
Bearbeiten: Ich habe vergessen, den Netzwerk-Interal-Status zurückzusetzen und das Netzwerk falsch trainiert. Das neu geschulte Netzwerk ist viel kleiner.
quelle
Speichern Sie eine, Python
Wirft die meisten seiner Schneebälle sofort ab, speichert jedoch immer einen, falls der Gegner auf Munitionsmangel achtet. Dann duckt es sich so lange wie möglich (erneut mit 1), bevor es erneut geladen wird, es sei denn, es gibt ein garantiertes sicheres Nachladen oder einen garantierten Kill.
quelle
PrioritizedRandomBot, Java
Dieser Bot wählt eine zufällige Ganzzahl im Bereich
0
bis ausos + od
und wählt dann entweder werfen, ducken oder nachladen, wobei die Schwellenwerte durch die aktuelle Anzahl von Schneebällen und Enten bestimmt werden.Eine wichtige Erkenntnis ist, dass Sie einen Sieg erzwingen können, wenn ein Bot mehr Schneebälle als der andere Bot Schneebälle + Enten hat. Daraus können wir das Konzept der "Punkte" entwickeln:
Wenn eine dieser Zahlen positiv wird, kann dieser Spieler einen Gewinn erzwingen.
Die Tabelle "Punktedifferenz" bildet die Grundlage der Spieltheorie für diesen Wettbewerb. Es erfasst nicht alle Informationen, zeigt jedoch, wie wertvoll Schneebälle grundsätzlich sind als Enten (da Schneebälle sowohl Angriff als auch Verteidigung sind). Wenn der Gegner einen Schneeball wirft und du dich erfolgreich duckst, bist du einem gewaltsamen Sieg einen Schritt näher, da dein Gegner eine wertvollere Ressource verbraucht hat. In dieser Tabelle wird auch beschrieben, was Sie in vielen Sonderfällen tun sollten, z. B. wenn bestimmte Verschiebungsoptionen nicht verfügbar sind.
Die "Summe der Punkte" -Tabelle zeigt, wie sich die Summe der Punkte im Laufe der Zeit Null nähert (da beiden Spielern die Enten ausgehen). Zu diesem Zeitpunkt hat der erste Spieler einen Fehler begangen (neu geladen, wenn er es nicht musste) verliert.
Versuchen wir nun, diese Forcierungsstrategie auf Fälle auszudehnen, in denen sie nicht wirklich erzwungen werden kann (wie in, wir gewinnen mit großem Vorsprung, aber das Gedankenlesen des Gegners wird uns schlagen). Grundsätzlich haben wir
s
Schneebälle, aber wir müssen unseren Gegners+1
(oders+2
usw.) die Zeit nacheinander beschneiden, um zu gewinnen. In diesem Fall möchten wir entweder ein paar Enten oder ein paar Nachladungen durchführen, um uns etwas Zeit zu verschaffen.Im Moment versucht dieser Bot immer, sich in ein paar Enten zu schleichen, nur weil er dann keinen unmittelbaren Verlust riskiert: Wir gehen davon aus, dass der Gegner eine ähnliche Strategie verfolgt und versucht, so viele Schneebälle wie möglich nachzuladen gefährlich. Um Vorhersagbarkeit zu vermeiden, möchten wir diese auch nach einer gleichmäßig zufälligen Verteilung einschleichen: Die Entenwahrscheinlichkeit hängt davon ab, wie viele Enten wir im Verhältnis zur Anzahl der zu schleudernden Schneebälle ausführen müssen.
Wenn wir stark verlieren,
s + d < os + od
müssen wir in diesem Fall einige Nachladevorgänge einleiten und zusätzlich alle unsere Enten einsetzen. In diesem Fall möchten wir nach dem Zufallsprinzip nachladen, jedoch nur so oft, wie wir es benötigen.Dies ist der Grund, warum unsere Bots Prioritäten in der Reihenfolge werfen, ducken und nachladen setzen und
os + od
die Zufallszahl generieren, da dies der Schwellenwert für die Anzahl der Züge ist, die wir ausführen müssen.Es gibt einen Randfall und zwei weitere Sonderfälle, die der Bot derzeit behandelt. Der Edge-Fall ist, wenn der Gegner weder Schneebälle noch Enten hat und die Zufallsgenerierung daher nicht funktioniert. Wenn möglich, werfen wir also, andernfalls laden wir nach. Ein anderer Sonderfall ist, wenn der Gegner nicht nachladen kann und das Werfen keinen Vorteil hat (da der Gegner entweder duckt oder wirft), also ducken wir uns immer (da das Speichern unserer Schneebälle wertvoller ist als das Speichern unserer Enten). Der letzte Sonderfall ist, wenn der Gegner keine Schneebälle hat. In diesem Fall gehen wir auf Nummer sicher und laden nach Möglichkeit nach.
quelle
NeceBot - Python
Hier ist die Spieltheorie-Tabelle für das Spiel:
Wo
~
bedeutet, dass kein VorteilW
ist, gewinnenL
ist, verlieren ist,+-S
bedeutet , dass ein Schneeball gegenüber dem Gegner gewonnen / verloren ist, und+-D
bedeutet, dass eine Ente gegenüber dem Gegner gewonnen / verloren ist. Dies ist ein völlig symmetrisches Spiel.Beachten Sie, dass meine Lösung diese Tabelle nicht berücksichtigt. Weil ich schlecht in Mathe bin.
Es heißt NeceBot, weil es zuerst versucht, das Notwendige zu reduzieren. Danach gibt es einige willkürliche Strategien, von denen ich hoffe, dass sie funktionieren.
quelle
<3
s lol. +1 für ein Spieltisch und dann nicht verwenden: P Aber schöne Lösung :)3 + opponent_snowballs <3
Das könnte ein Fehler sein?<3
s den Code ziemlich schwer zu verstehen :(Feigling - Scala
Wirft, wenn der Gegner keine Munition hat, ansonsten (in der Reihenfolge der Priorität) duckt, wirft oder lädt nach.
quelle
TheUglyDuckling - Python
Duckt sich immer, bis er nicht mehr werfen kann, wenn der Gegner leer ist, oder lädt nach, wenn beide leer sind. Wird reload als letzten Ausweg verwenden.
quelle
SimpleBot - Python 2
Einfaches Zeug.
quelle
Der Naming-things-is-hard-Bot - VB.NET
Dinge zu benennen ist schwer, und ich bin nicht sicher, ob ich eine zusammenhängende Strategie habe, um sie zu benennen.
Versucht in den ersten Runden zu spielen, um einen frühen Sieg zu erringen. Danach spielt der Rest der Zeit sicherer und versucht, durch Abrieb zu gewinnen.
quelle
MachineGun, Python 3
Versucht, Schneebälle aufzubewahren, bis der Gegner garantiert getötet wird oder bis die Enten verschwunden sind.
Es duckt sich auch, wenn der Gegner einen Schneeball hat, weil er nicht sterben will.
quelle
Knowbot, Python3
Verfolgt die Häufigkeit der vorherigen Züge, geht davon aus, dass der Gegner wieder die häufigste macht, und verteidigt sich dagegen.
** Aktualisiert, um keine Züge zu erwarten, die der Gegner nicht ausführen kann **
quelle
Braingolf , der Angreifer
Der Angreifer ist kein Feigling! Wenn er einen Schneeball hat, muss er werfen! Wenn er keine Schneebälle hat, soll er mehr machen!
Braingolf , der Wahnsinnige
Dies ist eigentlich kein Bot, sondern nur ein Programmierer, den ich entführt und gezwungen habe, jedes Projekt, das er jemals gemacht hat, auf Braingolf zu portieren. Er hat kein bisschen mehr Verstand.
Erzeugt eine Zufallszahl kleiner als 3 und gibt aus,
t % r
wobei t die aktuelle Runde und r die Zufallszahl istUm diese auszuführen, müssen Sie
braingolf.py
von Github herunterladen , dann entweder den Braingolf-Code in einer Datei speichern und ausführenoder einfach den Code direkt so einfügen
Die Eingaben sind ziemlich irrelevant, solange das zweite Argument nach dem Code / Dateinamen die Anzahl der Schneebälle angibt, die The Aggressor hat.
Hinweis: Der Angreifer verhält sich eigentlich identisch zum TestBot, ich wollte nur einen Eintrag in Braingolf machen
Braingolf , The Brainy [Derzeit gebrochen]
quelle
TestBot - Python
Dies ist ein Testbeitrag, der Ihnen zeigt, wie ein gültiger Beitrag aussehen kann. Die Strategie: Abwechselnd nachladen und werfen. Eine ziemlich schlechte Strategie, aber sie gibt Ihnen eine Vorstellung davon, wie Ihr Programm funktionieren sollte.
quelle
_, turn, snowballs, opponent_snowballs, ducks, opponent_ducks, max_snowballs = sys.argv
die Argumente?sys.argv[1:]
wenn Sie sich nicht damit_
UpperHandBot, Python 3
Dieser Bot versucht, mehr Schneebälle als sein Gegner zu sammeln und wirft dann los. Wenn UHB zu irgendeinem Zeitpunkt nicht mehr Schneebälle als sein Gegner hat, wird es:
quelle
Yggdrasli, Java
Ich habe diesen Bot "Yggdrasil" genannt, weil er tatsächlich im Spielbaum nach vorne schaut und eine Zustandsbewertung durchführt, aus der er eine annähernd ideale gemischte Strategie berechnen kann. Da es auf gemischten Strategien beruht, ist es sehr nicht deterministisch. Ich weiß nicht, wie gut dieses Ding im echten Wettbewerb abschneiden wird.
Ein paar Dinge über diesen Bot:
quelle
Schmerz im Nash (C ++)
So genannt, weil die Tatsache, dass ich meinen eigenen Nash-Gleichgewichtslöser schreiben musste, ein echtes Problem war. Ich bin erstaunt, dass es keine verfügbaren Nash-Lösungsbibliotheken gibt!
Kompilieren Sie als C ++ 11 oder besser. Für die Leistung ist es gut, mit OpenMP-Unterstützung zu kompilieren (dies dient jedoch nur der Geschwindigkeit; es ist nicht erforderlich).
Dabei werden die Nash-Gleichgewichte verwendet, um zu entscheiden, was in jeder Runde zu tun ist. Dies bedeutet, dass es theoretisch (über viele Spiele hinweg) auf lange Sicht immer gewinnt oder unentschieden bleibt, unabhängig davon, welche Strategie der Gegner anwendet. Ob dies in der Praxis der Fall ist, hängt davon ab, ob ich Fehler bei der Implementierung gemacht habe. Da dieser KoTH-Wettbewerb jedoch nur eine Runde gegen jeden Gegner hat, wird er in der Rangliste wahrscheinlich nicht sehr gut abschneiden.
Meine ursprüngliche Idee war es, eine einfache Bewertungsfunktion für jeden Spielstand zu haben (z. B. jeder Ball ist + b, jede Ente ist + d), aber dies führt zu offensichtlichen Problemen, um herauszufinden, wie diese Bewertungen aussehen sollten, und bedeutet, dass dies nicht möglich ist Handeln Sie, indem Sie die Renditen verringern, indem Sie immer mehr Bälle sammeln, usw. Stattdessen wird der gesamte Spielbaum analysiert , wobei ab Runde 1000 rückwärts gearbeitet wird. Geben Sie dann die tatsächlichen Bewertungen ein, die darauf basieren, wie sich jedes Spiel entwickeln könnte.
Das Ergebnis ist, dass ich absolut keine Ahnung habe, welche Strategie dies verwendet, außer ein paar hartcodierten "offensichtlichen" Verhaltensweisen (Schneebälle werfen, wenn Sie mehr Bälle haben als Ihr Gegner Bälle + Enten hat, und nachladen, wenn Sie beide aus sind von Schneebällen). Wenn jemand den von ihm erzeugten Datensatz analysieren möchte, stelle ich mir ein interessantes Verhalten vor!
Das Testen gegen "Save One" zeigt, dass es zwar langfristig gewinnt, aber nur mit einem kleinen Vorsprung (514 Siege, 486 Niederlagen, 0 Unentschieden in der ersten Partie von 1000 Spielen und 509 Siege, 491 Niederlagen, 0) zeichnet im zweiten).
Wichtig!
Dies funktioniert sofort, aber das ist keine gute Idee. Auf meinem Laptop mit moderaten Entwicklerspezifikationen dauert es ungefähr 9 Minuten, um den vollständigen Spielbaum zu generieren. Die endgültigen Wahrscheinlichkeiten werden jedoch in einer Datei gespeichert, sobald sie generiert wurden. Danach wird in jeder Runde nur eine Zufallszahl generiert und mit 2 Bytes verglichen. Das ist also superschnell.
Laden Sie einfach diese Datei (3,5 MB) herunter und legen Sie sie in dem Verzeichnis ab, in dem sich die ausführbare Datei befindet.
Oder Sie können es selbst generieren, indem Sie Folgendes ausführen:
Womit eine Datei pro Runde bis zur Konvergenz gespeichert wird. Beachten Sie, dass jede Datei 3,5 MB groß ist und bei 720 Runden konvergiert (dh 280 Dateien, ~ 1 GB). Da die meisten Spiele bei 720 Runden nicht annähernd ankommen, sind die Dateien vor der Konvergenz von sehr geringer Bedeutung.
quelle
Swift - TheCrazy_XcodeRandomness
Leider kann dies nur lokal in Xcode ausgeführt werden, da es das
Foundation
Modul und seine Funktion enthältarc4random_uniform()
. Sie können jedoch ziemlich genau sagen, was der Algorithmus ist:quelle
swift
Befehl aus und prüfen Sie, ob er funktioniertFoundation
, sorry: /TableBot, Python 2
Bezeichnet TableBot, weil es durch Implementierung dieser Tabelle erstellt wurde:
A 1 bedeutet 1 oder mehr, A 0 bedeutet keine.
Der Bot:
Probieren Sie es online!
quelle
AmbBot - Schlägersystem
Ich wollte es meistens ausprobieren
amb
, weil es cool ist. Dieser Bot ordnet die Optionen nach dem Zufallsprinzip an (neu laden, werfen und sich ducken), filtert diejenigen heraus, die keinen Sinn ergeben, und wählt die erste Option aus. Aber mitamb
können wir Fortsetzungen und Backtracking verwenden!Ich habe auch ein kleines Testprogramm erstellt, um zwei dieser Bots gegeneinander auszuführen. Es fühlt sich an, als würde der zweite Bot öfter gewinnen, also habe ich vielleicht irgendwo einen Fehler gemacht.
quelle
MonteBot, C ++
Im Grunde genommen habe ich den Code von dieser Koth genommen und für diese Herausforderung modifiziert. Es verwendet den entkoppelten UCT-Monte-Carlo-Baumsuchalgorithmus. Es sollte ziemlich nahe am Nash-Gleichgewicht sein.
Kompilieranleitung für Linux:
Speichern in
MonteBot.cpp
.Rennen
g++ -o -std=c++11 MonteBot MonteBot.cpp
.Befehl zum Ausführen:
./MonteBot <args>
quelle
Der Zauderer - Python 3
Der Zauderer wird zögern, indem er die ersten paar Runden spielt. Plötzlich will das Panikmonster vermeiden, den Ressourcenkrieg zu verlieren, indem es den am häufigsten verwendeten Zug des Gegners kontert.
quelle
ParanoidBot und PanicBot - ActionScript3 ( RedTamarin )
Aus einer unpassenden Nischensprache (mit Erweiterungen zur Bereitstellung von Befehlszeilenargumenten) stammt der skittische ParanoidBot und sein langweiliger Verbündeter PanicBot.
ParanoidBot
ParanoidBot verliert den Verstand und hat eine unnötig spezifische Strategie, auf die man sich verlassen kann. Zuerst werden Schneebälle abgefeuert, bis eine Schwelle erreicht ist, wobei einige davon in Reserve bleiben. Dann, nach drei vorsichtigen Enten, setzt Paranoia ein und der Bot versucht, mehr Schneebälle zwischen zufälligen Enten zu lagern. Nachdem ParanoidBot seinen Vorrat aufgefüllt hat, kehrt er zum Blindwerfen zurück. An den Stimmen in seinem Kopf erkennt ParanoidBot, ob es garantiert gewinnt oder verliert, und "strategisiert" entsprechend.
Zahnspangen sind etwas wackelig, um die Größe zu reduzieren
PanicBot
PanicBot ist bereits verrückt geworden und reagiert aus instinktiver Angst. Nachdem PanicBot vor Angst keine Enten mehr hat, wirft er blind alle seine Schneebälle weg und wirft verzweifelt weitere Schneebälle, bis er (wahrscheinlich) besiegt ist.
Dies ist einer von weniger als 15 anderen Einträgen, die AS3 hier auf PPCG verwenden. Vielleicht findet diese wohl exotische Sprache eines Tages ein Rätsel, das es zu lösen gilt.
quelle
snow.as
, sollte in bash Folgendes funktionieren:$ ./redshell snow.as -- 0 50 50 25 25
chmod +x redshell
ist dein Freund hier ...Verteidiger, Python
Lädt nach, wenn keiner der Spieler Schneebälle hat. Wenn es Schneebälle hat, wirft es. Wenn er keine Schneebälle hat, aber der Gegner, duckt er sich, wenn er kann, sonst lädt er nach.
Hinweis: noch nicht getestet
quelle