ANMERKUNG: Diese Herausforderung ist derzeit nicht aktiv, da ich die für die Ausführung eines Matches erforderlichen Sprachen nicht installieren kann. Wenn jemand anderes die Zeit und das Interesse dazu hat, bin ich nicht dagegen.
Eine Rangliste finden Sie unten im Beitrag.
Dies ist eine semi-kooperative King-of-the-Hill-Herausforderung, bei der die Bots Pfade durch ein zweidimensionales Gitterdiagramm konstruieren. Der Bot, der die Knoten mit dem meisten Verkehr kontrolliert, ist der Gewinner. Es sind jedoch mehr als die Ressourcen eines Bots erforderlich, um tatsächlich einen Verbindungspfad zu erstellen, sodass die Bots in gewissem Maße zusammenarbeiten müssen.
Gameplay
Geben Sie im Folgenden N > 0
die Anzahl der im Spiel befindlichen Bots an.
Das Gitter
Das Spiel wird auf einem zweidimensionalen, ganzzahligen Gitter gespielt , dessen linke untere Koordinate bei liegt . Jede Koordinate mit hat ausgehende Kanten für die drei Koordinaten , und darüber, wo die -Koordinaten modulo getroffen werden . Dies bedeutet, dass das Gitter an den Ost- und Westkanten umläuft. Jede untere Koordinate ist eine Quelle und jede obere Koordinate ist eine Senke .⌊4/3N2⌋ × ⌊4/3N2⌋
(0,0)
(x,y)
0 ≤ y < ⌊4/3N2⌋-1
(x-1,y+1)
(x,y+1)
(x+1,y+1)
x
⌊4/3N2⌋
(x,0)
(x,⌊4/3N2⌋-1)
Das folgende Bild zeigt ein 8 × 8
Raster.
Jeder Scheitelpunkt des Diagramms ist entweder inaktiv , aktiv oder unterbrochen . Alle Vertices beginnen inaktiv und können von Bots aktiviert werden, die dann ihre Eigentümer sind. Außerdem können Bots Scheitelpunkte brechen und können nicht repariert werden.
Turn Order
Eine Runde besteht aus einer Zerstörungsphase und einer Aktivierungsphase . In der Zerstörungsphase kann jeder Bot einen inaktiven Vertex brechen. Dieser Scheitelpunkt ist von da an unterbrochen und darf von niemandem aktiviert werden. In der Aktivierungsphase kann jeder Bot einen inaktiven Vertex aktivieren. Von da an besitzen sie diesen Scheitelpunkt und er kann von niemand anderem reaktiviert werden. Mehrere Bots können einen einzigen Vertex besitzen, wenn sie ihn alle im selben Zug aktivieren. In jeder Phase werden die Scheitelpunktauswahlen gleichzeitig durchgeführt.
Wertung
Eine Runde dauert genau Drehungen. Danach wird die Runde wie folgt gewertet. Von jedem aktiven Quellscheitelpunkt führen wir mal eine zufällige Tiefensuche entlang der aktiven Scheitelpunkte durch (was bedeutet, dass die Kinder jedes Scheitelpunkts in einer zufälligen Reihenfolge besucht werden). Wenn ein Pfad von der Quelle zu einer Senke gefunden wird, erhält jeder Eigentümer des Scheitelpunkts für alle Scheitelpunkte entlang dieses Pfads einen Punkt.N2
N
Das gesamte Spiel dauert 100 Runden und der Bot mit den meisten Punkten ist der Gewinner. Ich kann diese Zahl erhöhen, wenn die Varianz der Ergebnisse zu hoch ist.
Zusätzliche Regeln
- Kein Durcheinander mit dem Controller oder anderen Einsendungen.
- Höchstens eine Einreichung pro Teilnehmer.
- Keine externen Ressourcen außer einer privaten Textdatei wurden zu Beginn des Spiels gelöscht.
- Gestalten Sie Ihren Bot nicht so, dass er bestimmte Gegner schlägt oder unterstützt.
- Stellen Sie Befehle bereit, um Ihren Bot zu kompilieren und auszuführen. Jeder Compiler / Interpreter, der für Debian Linux frei verfügbar ist, ist akzeptabel.
Der Controller
Der Controller ist in Python 3 geschrieben und befindet sich in GitHub . Ausführliche Anweisungen finden Sie in der README-Datei. Hier ist eine API, mit der Sie loslegen können:
- Bots werden zu Beginn jeder Runde gestartet und bleiben bis zum Ende der Runde bestehen. Die Kommunikation mit der Steuerung erfolgt über STDIN und STDOUT unter Verwendung von Nachrichten mit Zeilenumbruch.
BEGIN [num-of-bots] [num-of-turns] [side-length]
wird am Anfang eingegeben.DESTROY [turn]
wird zu Beginn jeder Zerstörungsphase eingegeben. Ihr Bot antwortet entwederVERTEX x,y
mit, um einen Scheitelpunkt auszuwählen, oderNONE
.BROKEN [turn] [your-choice] [other-choices]
wird am Ende jeder Zerstörungsphase eingegeben. Die Reihenfolge der anderen Bots wird zu Beginn eines jeden Spiels zufällig festgelegt, bleibt jedoch dabei festgelegt. Die Auswahlmöglichkeiten werden alsx,y
oder dargestelltN
.ACTIVATE [turn]
undOWNED [turn] [your-choice] [other-choices]
sind die Äquivalente der oben genannten für die Aktivierungsphase und haben die gleiche Semantik.SCORE [your-score] [other-scores]
wird am Ende des Spiels eingegeben.- Ihr Bot hat 1 Sekunde Zeit , um die Ergebnisse einer Phase zu analysieren und den nächsten Scheitelpunkt auszuwählen, und 1 Sekunde , um nach der Bewertung zu beenden. Ich werde die Einsendungen auf meinem relativ alten Laptop testen, also ist es besser, hier etwas Spielraum zu lassen.
Bitte denken Sie daran, Ihren Ausgabepuffer zu leeren. Andernfalls kann der Controller in einigen Umgebungen hängen bleiben.
Bestenliste
Aktualisiert 13.03.2015
Peacemaker ist in Betrieb und auch Funnelweb hat ein Update erhalten. Die Punktzahlen stiegen um eine Größenordnung. Connector hat das Zeitlimit in zwei Spielen überschritten.
Funnelweb: 30911
Connector: 18431
Watermelon: 3488
Annoyance: 1552
Explorer: 735
Checkpoint: 720
Random Builder: 535
FaucetBot: 236
Peacemaker: 80
Das vollständige Protokoll mit ASCII-Grafiken finden Sie im Repository des Controllers unter graphical_log.txt
.
Einige Beobachtungen:
- Der Konnektor kann sehr einfach gestoppt werden, indem ein einzelner Scheitelpunkt davor gebrochen wird. Ich vermute, dass Ärger dies häufig tut. Derzeit ist dies jedoch wenig sinnvoll, da möglicherweise nur Connector einen Pfad erstellen kann.
- Wassermelone kann eine anständige Punktzahl erzielen, indem sie sich zufällig auf einem Verbindungspfad befindet (da die DFS sehr wahrscheinlich ihre Scheitelpunkte verwendet).
- Forscher mag Reben von den Wassermelonen anbauen.
- Das aktualisierte Funnelweb erzielt wirklich gute Ergebnisse, da Connector normalerweise in der unteren Hälfte des Rasters einrastet.
- Die Spiele werden ziemlich lang, die durchschnittliche Runde auf meinem Computer dauert ungefähr 25 Sekunden.
4/3*N^2
, und selbst dort hatten die Bots Probleme, gültige Pfade zu bilden. Connector wurde jedoch vorübergehend aufgrund eines Fehlers disqualifiziert, und jetzt, da es behoben wurde, erwarte ich, dass die Spiele interessanter werden. Ich werde heute Abend eine weitere Charge ausführen.Antworten:
Anschluss (Java)
Versucht, einen Pfad an einer zufälligen Position zu erstellen. Da es keinen eigenen Pfad erstellen kann, sucht es nach aktiven Zellen und verwendet sie. Gutschrift geht an Geobits, von denen ich Code gestohlen habe. Außerdem ist diese Übermittlung noch nicht abgeschlossen, da sie einfach aufhört, etwas zu tun, sobald der Pfad erstellt ist.
Bearbeiten: Wenn ein Pfad erstellt wird, versucht Connector, mehrere Pfade entlang des vorhandenen Pfads zu erstellen.
quelle
java.lang.ArrayIndexOutOfBoundsException: -1 at Connector.findExtendingPathPoint(Connector.java:166)
.Funnelweb, Python 2
version 1.2 - Besserer Beitrittscode, neue Animation hinzugefügt
Benannt nach einer der weniger freundlichen Spinnen Australiens. Dieser Bot baut zuerst ein trichterförmiges Nest in den oberen Reihen und lockt dann andere Bots in Baupfade für den Verkehr zum Nest.
Hier ist eine neue Animation eines 6-Bot-Spiels auf einem 4 / 3N ^ 2-Brett, die das Trichterweb und einige einfachere Bots zeigt:
Der Python-Code des Trichterwebs:
Die Spinne läuft mit
python funnelweb.py
.quelle
Checkpoint, Java
Dieser Bot versucht, Checkpoints zu erstellen, damit ein gültiger Pfad durch einen meiner Vertices verläuft. Da es N 2 Windungen gibt und die Platine 2 N 2 breit ist , kann ich jeden Knoten auf einer einzelnen horizontalen Linie aktivieren / unterbrechen (vorausgesetzt, ich bin zuerst da). Mach das abwechselnd (
x
ist kaputt,o
ist meins):Wenn du einen Pfad machen willst, musst du meine Checkpoints durchgehen :)
Nun gibt es einige Probleme, mit denen dies zu tun haben könnte. Erstens wird es überhaupt nicht gut gehen, wenn es nicht viele Wege gibt. Da er selbst keine produktiven Wege geht, ist er absolut darauf angewiesen, dass es Konkurrenten gibt. Selbst ein paar Konkurrenten, die sich zu einem einzigen Pfad zusammenschließen, helfen nicht viel, da er nur einen Punkt für jeden gefundenen Pfad erzielt. Was er braucht, um zu glänzen, sind wahrscheinlich einige Bots, die einige unterschiedliche Wege gehen. Selbst dann könnte es nicht sehr hoch punkten , aber es war eine Idee, die ich im Chat hatte, so ...
Wenn eines der Leerzeichen in der Zeile bereits blockiert / beansprucht ist, suche ich einfach nach einem nahe gelegenen Punkt, den ich verwenden kann (vorzugsweise in derselben
x
Zeile, nur vertikal verschoben).Zum Kompilieren ist es
javac Checkpoint.java
. Zu rennenjava Checkpoint
,. Sie möchten den Pfad hinzufügen / ändern, um ihn überall wiederzugeben.quelle
Wassermelone, Java
Versuche, Wassermelonen auf dem Gitter zu zeichnen.
quelle
WasserhahnBot (in R)
Erstellt einen Engpass in der zweiten Zeile und aktiviert Knoten auf dem Pfad dahinter.
Wenn ich es nicht vermasselt habe, sollte die endgültige Konfiguration ungefähr so aussehen:
Befehl ist
Rscript FaucetBot.R
.quelle
Friedensstifter, Java
Basierend auf Manus Code.
Friedensstifter suchen Konfliktzonen (dh die meisten KAPUTTEN oder AKTIVEN Scheitelpunktkonzentrationen) und aktivieren einen zufälligen Scheitelpunkt in der Nähe.
quelle
while
Schleife deractivate
Methode liegt. Sie brechen die Suche ab, sobald Sie einen Scheitelpunkt gefunden haben, der Ihnen nicht gehört und der nicht beschädigt ist. Sie können ihn also nicht aktivieren.Zufälliger Builder, Python 3
Dies ist ein dummer Beispielbot, der niemals etwas zerstört und versucht, in jeder Runde einen zufälligen Scheitelpunkt zu aktivieren. Beachten Sie, dass nicht überprüft werden muss, ob der Scheitelpunkt inaktiv ist. das regelt der controller.
Führen Sie den Befehl aus
Sie können ersetzen müssen
python3
durchpython
je nach Ihrer Python - Installation. Bearbeiten Sie dazu einfach diebots.txt
Datei. Ich habe den Controller aktualisiert und muss nicht mehr mit Dateipfaden herumspielen.quelle
sys.stdout.flush()
können Sie dies nurflush=True
als Argument verwendenprint
.Explorer, Python 3
Aktivierungsstrategie:
Erstellt eine Heatmap basierend auf dem Status jedes Knotens (aktiv / inaktiv / defekt) und wählt den Knoten aus, der den größten erwarteten Heatmap-Wert pro Person hätte, wenn er diesen auswählen würde.
Zerstörungsstrategie:
Zerstöre niemals etwas, da dies dem Bot nicht viel hilft.
quelle
Ärger, Bash
Versucht, das Ergebnis interessanter aussehen zu lassen.
Laufen Sie mit
bash annoyance.sh
.quelle
Middle Man
Ich habe gesehen, dass einige Bots von oben und einige von unten gebaut wurden. Dies ist der erste (glaube ich), der in der Mitte beginnt und auf und ab arbeitet.
(Es wird nicht mit dem Controller getestet. Wenn es also nicht funktioniert, lassen Sie es mich wissen.)
quelle