Wettbewerb permanent geöffnet - Aktualisiert am 10. August 2017
Obwohl ich am 5. Juni 2017 einen Gewinner gekürt habe (der als beste Antwort gilt), werde ich neue Bots starten und die Ergebnisse aktualisieren.
5. Juni Ergebnisse
Glückwunsch user1502040
Da es keine Gleichheit gibt, zeige ich nur den Prozentsatz der gewonnenen Matches.
Statistician2
- 95,7%
Fitter
- 89,1%
Nash
- 83,9%
Weigher
- 79,9%
ExpectedBayes
- 76,4%
AntiRepeater
- 72,1%
Yggdrasil
- 65,0%
AntiGreedy
- 64,1%
Reactor
- 59,9%
NotHungry
- 57,3%
NashBot
- 55,1%
Blodsocer
- 48,6%
BestOfBothWorlds
- 48,4%
GoodWinning
- 43,9%
Rockstar
- 40,5%
ArtsyChild
- 40,4%
Assassin
- 38,1 %
WeightedRandom
- 37,7%
Ensemble
- 37,4%
UseOpponents
- 36,4%
GreedyPsychologist
- 36,3%
TheMessenger
- 33,9%
Copycat
- 31,4%
Greedy
- 28,3%
SomewhatHungry
- 27,6%
AntiAntiGreedy
- 21,0%
Cycler
- 20,3%
Swap
- 19,8%
RandomBot
- 16,2%
Ich habe ein Google Sheet mit dem Ergebnisraster für jede Verknüpfung erstellt: https://docs.google.com/spreadsheets/d/1KrMvcvWMkK-h1Ee50w0gWLh_L6rCFOgLhTN_QlEXHyk/edit?usp=sharing
Dank des Petri-Dilemmas konnte ich mit diesem König des Hügels fertig werden.
Das Spiel
Das Spiel ist eine einfache "Stein-Papier-Schere" mit einem Twist: Punkte, die mit jedem Sieg während des Spiels gewonnen werden (Ihre R, P oder S werden geladen).
- Papier gewinnt Rock
- Schere gewinnt Papier
- Rock gewinnt die Schere
Der Gewinner erhält so viele Punkte wie er spielt.
Der Verlierer erhöht die Belastung seines Spiels um 1.
Bei einem Gleichstand erhöht jeder Spieler die Belastung seines Spiels um 0,5.
Nach 100 Spielen gewinnt derjenige mit mehr Punkten.
Beispiel: P1 hat Lasten [10,11,12] (Stein, Papier, Schere) und P2 [7,8,9]. P1 spielt R, P2 spielt P. P2 gewinnt und bekommt 8 Punkte. P1-Lasten werden [11,11,12], P2-Lasten bleiben gleich.
Herausforderungsspezifikationen
Ihr Programm muss in Python geschrieben sein (Entschuldigung, ich weiß nicht, wie ich damit umgehen soll). Sie müssen eine Funktion erstellen, die bei jeder Ausführung jede dieser Variablen als Argument verwendet:
my_points, opp_points, my_loaded, opp_loaded, my_history, opp_history
points
- Aktuelle Punkte (Ihre und Ihre Gegner)
loaded
- Array mit Lasten (in der Reihenfolge RPS) (Ihr und Ihr Gegner)
history
- Saite mit allen Spielen, letzter Charakter ist das letzte Spiel (dein und dein Gegner)
Sie müssen zurückkehren "R"
, "P"
oder "S"
. Wenn Sie etwas anderes zurückgeben würden, wäre dies automatisch ein Verlust des Spiels.
Regeln
Sie können die integrierten Funktionen nicht ändern.
Testen
Ich halte einen Git mit dem Code und allen Bots auf dem Laufenden: https://github.com/Masclins/LoadedRPS
Beurteilen
Der Gewinner wird durch Auswahl der Person mit den meisten Siegen nach 1000 vollen Round-Robin-Spielen ermittelt. Die Krawatten werden durch Gleichstand unterbrochen. Es werden mehr als 1000 Spiele gespielt, weil ich viel Zufälligkeit erwarte, und auf diese Weise wäre die Zufälligkeit weniger relevant.
Sie können bis zu 5 Bots einreichen.
Der Wettbewerb endet am Juli 4. Juni (das wird der letzte Tag sein , die ich keine Antwort akzeptieren werde), und am Juli 5. Juni werde ich die letzten stadings Post (vielleicht versuchen , eine advancemnt vor schreiben).
Da dies meine erste KOTH ist, bin ich zu 100% offen für Verbesserungen, wie zum Beispiel die Anzahl der Matches, die gegen jeden Bot gespielt werden.
Auf 1000 Streichhölzer bearbeitet, da ich sehe, dass es wirklich um Zufälligkeiten geht.
quelle
runcode
undbots
) veröffentlichen?Antworten:
Statistiker(spielt nicht mehr)Wechselt zwischen einigen einfachen Strategien, basierend auf der erwarteten Leistung in der Vergangenheit
Statistiker 2
Nash
Berechnet ein ungefähres Nash-Gleichgewicht durch Gradientenabstieg.
quelle
Wieger
Ich habe den Überblick verloren, als ich mit dem Code experimentiert habe, aber die Grundidee ist, die Zugwahrscheinlichkeit des Gegners durch die letzten drei Züge unter Verwendung einiger Gewichte zu schätzen und sie mit einem anderen Gewicht zu multiplizieren, das von der Last abhängt. Ich dachte, dass ich es irgendwie auch benutzen kann
my_loaded
, aber ich konnte mich nicht entscheiden, also ließ ich es weg.Satan
Wahrscheinlich wird es disqualifiziert, weil es eine Art Schummeln ist und einige Annahmen über die Testfunktion macht (es muss die Funktion des Gegners in einer Variablen auf seinem Stack-Frame haben), aber es bricht technisch keine aktuellen Regeln - es tut es nicht etwas neu definieren oder umschreiben. Es benutzt einfach schwarze Magie, um die gegnerische Funktion auszuführen und zu sehen, was sie getan haben / tun werden. Es kann nicht mit Zufälligkeiten umgehen, aber deterministische Bots haben keine Chance, Satan zu besiegen.
quelle
my_loaded
ein Gewicht hinzufügen, das den Zug bewertet, der gegen Ihre letzten Züge verloren würde. Das ist so, als würde man annehmen, dass Ihr Gegner etwas Ähnliches tut wie Sie und ihn deshalb dafür bestrafen, dass er annimmt, dass Sie das Gleiche weiterspielen. So etwas wie:for i, m in enumerate(reversed(my_history[-3:])): sc[(idx[m]+1)%3] += (K / (1 + i))
Monteur
Dieser Bot verbessert Pattern und verschmilzt ihn mit Economist (Pattern und Economist nehmen nicht mehr teil)
Die Verbesserung von Pattern ist, dass der Bot nun nach zwei Arten von Patterns sucht: Gegner, der auf sein letztes Spiel reagiert, und Gegner, der auf mein letztes Spiel reagiert. Anschließend werden beide Vorhersagen ausgewertet, um diejenige zu verwenden, die am besten passt.
Aus diesem Muster hat der Bot nun die Wahrscheinlichkeit für R, P und S. Unter Berücksichtigung des erwarteten Werts jedes Spiels (wie Economist es tat) spielt der Bot denjenigen, der den größten Wert ergibt.
Hier sind die beiden alten Codes
Pattern(spielt nicht mehr)Das Pattern versucht, Muster auf seinem Gegner zu finden. Es sieht so aus, als hätte der Gegner nach dem letzten Spiel, das er gespielt hat, mehr Gewicht gegeben. Dadurch wird erraten, was der Gegner spielen wird, und das Gegenstück dazu gespielt.
Ökonom(spielt nicht mehr)Der Economist tut Folgendes: Ermittelt die Wahrscheinlichkeit jedes Spiels des Gegners, indem er beobachtet, was er in den letzten 9 Runden gespielt hat. Berechnet daraus den erwarteten Nutzen eines jeden Spiels und geht zu dem Spiel über, das den besten erwarteten Wert hat.
quelle
Yggdrasil
Dies wird "Yggdrasil" genannt, weil es im Spielbaum nach vorne schaut. Dieser Bot nimmt keine Vorhersage des Gegners vor, sondern versucht lediglich, einen statistischen Vorteil beizubehalten, wenn er einen hat (durch Abwägen aktueller und zukünftiger Gewinne). Es berechnet eine ungefähr ideale gemischte Strategie und gibt einen Zug zurück, der zufällig mit diesen Gewichten ausgewählt wurde. Wenn dieser Bot perfekt wäre (was nicht der Fall ist, weil die Funktion zur Bewertung des Zustands ziemlich schlecht ist und nicht sehr weit vorausschaut), wäre es unmöglich, diesen Bot in mehr als 50% der Fälle zu schlagen. Ich weiß nicht, wie gut dieser Bot in der Praxis abschneiden wird.
quelle
Anti-Repeater
Nimmt Papier in der ersten Runde und gibt dann das zurück, was der Gegner am meisten getan hat. Bei einem Unentschieden wählt er Papier aus.
Nachahmer
Kopiert einfach den letzten Zug des Gegners.
Anti-Anti-Gierig
Wählt, was auch immer an der am schwersten gewichteten Wahl des Gegners verliert.
Etwas hungrig
quelle
Der Messenger
Rockstar
Attentäter
Erläuterung
Nun, Sie könnten denken, dass diese Bots völlig dumm sind.
Dies ist nicht ganz richtig, sondern basiert auf der Idee, einen riesigen Bonus zu sammeln und den Feind in die Irre zu führen und sich damit herumschlagen zu lassen.
Diese Bots spielen sich sehr ähnlich wie Gierige, sind jedoch einfacher und werden nicht zufällig ausgewählt, bis sie eine Waffe beladen haben. Sie bleiben bei der Waffe ihrer Wahl.
Noch etwas zu beachten: Diese schlagen jeweils etwa die Hälfte der Zeit gierig, ziehen ein Drittel der Zeit und verlieren ein Sechstel der Zeit. Wenn sie gewinnen, werden sie tendenziell viel gewinnen. warum ist das?
Gierig, bis er eine Runde verliert, wird zufällig eine Waffe auswählen. Dies bedeutet, dass er, wenn er keine Runde gewinnt, zufällig wieder eine Waffe auswählt, die möglicherweise wieder gewinnt. Wenn gierig zieht oder verliert, bleibt er bei dieser Waffe. Wenn gierig mindestens eine Runde gewinnt, wählt sie die gleiche Waffe wie der Bot. Gierig gewinnt. Wenn gierig irgendwann die verlorene Waffe auswählt, gewinnt unser Bot, weil die Ladung unserer Waffe höher gewesen wäre als die Punktzahl, die gierig ist.
Vorausgesetzt, dass Gierige nicht immer nur die Siegerwaffe durch einen großen Zufall auswählen, bedeutet dies, dass folgende Chancen bestehen:
1/3: {1/2 Gewinn (insgesamt 1/6). 1/2 verlieren (1/6 insgesamt). }
1/3 Unentschieden
1/3 Gewinn
Also: 1/3-Chance zu ziehen, 1/6-Chance auf Niederlage, 1/2-Chance zu gewinnen.
Dies zeigt wahrscheinlich, dass Sie mehrere Spiele in mehreren Runden durchführen müssen
Diese dienen hauptsächlich dazu, die Herausforderung ins Rollen zu bringen
quelle
Reaktor
Macht das Spiel, das die vorherige Runde gewonnen hätte.
quelle
opp_history[len(opp_history)-1]
mitopp_history[-1]
.Künstlerisches Kind
Dieser Bot verhält sich wie ein Kind, das Kunsthandwerk spielt, mit Papier anfängt und entweder Papier oder Schere zufällig verwendet, aber keine Schere nach Stein oder Schere verwendet, weil sie die Schere auf Papier verwenden muss. Wirft einen Stein zurück auf jemanden, der einen Stein auf sie wirft.
quelle
Hier die drei Bots, die ich zum Testen gebaut habe:
RandomBot
Gierig
Wählt einfach seine am meisten geladene Option.
Antigreedy
Angenommen, der Gegner spielt gierig und spielt die gewinnende Alternative.
quelle
Nicht hungrig
Dies ist buchstäblich das Gegenteil von Gierig, es wählt die niedrigsten verfügbaren Punkte.
quelle
Verwenden Sie den Favoriten des Gegners
Wählt in der ersten Runde einen zufälligen Gegenstand aus. Verwendet für jede zweite Runde die häufigste Wahl des Gegners. Wenn es ein Unentschieden gibt, wird standardmäßig die früheste häufigste Wahl getroffen.
// Ich habe Code von hier
Gewinnen ist gut
Gibt die Wahl des Gewinners der vorherigen Runde zurück. Wenn die vorherige Runde unentschieden war, wird die vorherige Runde rekursiv überprüft. Wenn es nur Unentschieden waren oder es sich um die erste Runde handelt, wird eine zufällige Auswahl zurückgegeben.
quelle
Beste aus beiden Welten
Dieser Bot kombiniert grundsätzlich Anti-Greedy und Greedy (daher der Name).
quelle
find
ist für Streicher.my_loaded
undopp_loaded
sind beide Listen.index
sollte gut für das sein, was du willst.NashBot
Wählt nach dem Zufallsprinzip eine der drei Optionen aus, sodass der Gegner statistisch gesehen keine Präferenz zwischen Zügen hat, was die Punktzahl betrifft. Mit anderen Worten, sowohl Gierig als auch Nicht hungrig sollten die gleiche durchschnittliche erwartete Punktzahl haben.
quelle
Erwartete Bayes
Bearbeiten: Rangliste aktualisiert
Dies ist die neue Top-Platzierung nach Einbeziehung von Expectedbayes:
Erklärungen
(Hinweis: Einreichung nach dem 05.06.2017)
Dieser Bot versucht den erwarteten Wert seines nächsten Zuges zu maximieren, indem er:
Die Wahrscheinlichkeiten werden alle zehn Züge aktualisiert. Die Anzahl der letzten Züge, die zur Berechnung der Wahrscheinlichkeiten verwendet wurden, wurde für jeden Bot auf 10 festgelegt (also insgesamt 20 Features). Dies ist wahrscheinlich eine Überanpassung der Daten, aber ich habe nicht weiter versucht, dies zu überprüfen.
Es stützt sich auf die Scikit-Bibliothek, um die Zugwahrscheinlichkeiten des Gegners zu berechnen (ich sage es, falls ich die Regeln falsch verstanden habe und es tatsächlich nicht erlaubt war).
Es gewinnt leicht gegen Bots, die immer die gleiche Wahl treffen. Überraschenderweise ist es gegen den Zufallsbot mit einer Gewinnrate von 93% recht effektiv (ich glaube, dies liegt an der Tatsache, dass es die Anzahl der Punkte begrenzt, die sein Gegner erhalten kann, während er seine eigene Anzahl möglicher Punkte für jede Runde maximiert).
Ich habe einen schnellen Versuch mit 100 Runden und nur einer begrenzten Anzahl von Bots gemacht, und das habe ich von result_standing erhalten:
Welches ist nicht so schlimm!
quelle
Cycler
0
quelle
Ensemble
Mehrere konkurrierende Algorithmen stimmen über die beste Lösung ab.
Tauschen
Führt einen zufälligen Zug aus, ohne jedoch den letzten zu wiederholen.
quelle
Blodsocer
Gesellschaft
Ich habe es behoben, also sollte es jetzt wahrscheinlich funktionieren, hoffe ich
Ich habe wieder etwas durcheinander gebracht, also habe ich gelöscht und wieder hergestellt. Ich mache eine Menge Durcheinander.
quelle
if opp_history[1] == "S": return "R" elif opp_history[1] == "R": return "R" else: return "P"
Was für eine Gesellschaft ist das?elif min(opp_history.count(i) for i in "RPS")/max(opp_history.count(i) for i in "RPS") >0.8 and len(my_history)>30:
"RPS"[my_loaded.index(max(my_loaded))+len(my_history)%2]
aber es sieht nicht in Reichweite aus (und die weiteren Zeilen auch).Gewichteter Zufall
Wie RandomBot, aber bei jedem Aufruf werden nur 2 geworfen. Schlägt manchmal Rockstar oder Assassin, erhöht aber die Punktzahl des anderen (wenn es beispielsweise Rockstar schlägt, gibt es Assassin einen Punkt-Boost).
quelle
Gieriger Psychologe
Genannt, weil es standardmäßig gierig ist, aber wenn es sich nicht entscheiden kann, kontert es, was der Gegner tun würde, wenn er die gierige Strategie verwendet. Wenn es sich immer noch nicht entscheiden kann, geht es nach dem Zufallsprinzip.
quelle