Viele Leute halten RPS für ein Glücksspiel. Wenn beide Spieler unvorhersehbar spielen, ist es die beste Strategie, nach dem Zufallsprinzip zu spielen. Lassen Sie uns jedoch ein wenig Vorhersehbarkeit einführen.
Jeder Bot hat die Möglichkeit, dem anderen Bot mitzuteilen, was er gleichzeitig spielen wird. Dann gibt es eine Pause, in der jeder Bot weiß, was der andere Spieler angekündigt hat. Wenn es diese Waffe ausspielt, die es angekündigt hat, erhält es zusätzlich zu seinen Punkten einen Punkt für einen Sieg, eine Niederlage oder ein Unentschieden.
Ein Sieg ist zwei Punkte wert, ein Unentschieden, ein Punkt und ein Verlust 0 Punkte.
Honest Bot Dishonest
Win 3 2
Draw 2 1
Loss 1 0
Es ist in Ihrem besten Interesse, ehrlich zu sein (aber auch sicherzustellen, dass Ihr Gegner Ihnen nicht glaubt).
Die Matches werden in einem Round-Robin-Format gespielt und das Ziel ist es, Ihre eigene Gesamtpunktzahl über die von Ihnen gespielten Matches hinweg zu maximieren.
E / A-Format:
- Ihr Bot wird eine Python 2.7-Funktion sein, die 4 Argumente akzeptiert und einen eindeutigen Namen haben muss (der verwendet wird, um Ihre Einreichung darzustellen).
- Die ersten beiden Argumente lauten immer der Reihe nach: die letzten Züge des Gegners, gefolgt von Ihren letzten Zügen. Hierbei handelt es sich um eine Liste in der Reihenfolge von der ersten bis zur letzten Runde, wobei jeder Index eine Liste mit dem Zug enthält, den der Gegner angeblich ausführen würde, gefolgt von dem Zug, den er tatsächlich ausgeführt hat.
- Mit den nächsten beiden Argumenten kann Ihr Bot feststellen, ob es sich um eine "ehrliche" oder eine "echte" Runde handelt. Wenn es sich um eine "ehrliche" Runde handelt, sind beide "Keine". Wenn es sich um eine "echte" Runde handelt, handelt es sich um den Zug, den Ihr Gegner angekündigt hat, gefolgt von dem Zug, den Sie angekündigt haben.
- Alle Argumente oder Teile von Argumenten, die Bewegungen darstellen, verwenden "R", "P" und "S", um Stein, Papier bzw. Schere darzustellen.
- Ihre Funktion sollte entweder ein "R" für Stein, ein "P" für Papier oder ein "S" für Schere zurückgeben. Bots, die die Möglichkeit haben, andere Werte zurückzugeben, werden disqualifiziert.
- Jeder Bot wird 200 Mal gegen jeden anderen Bot und 100 Mal gegen sich selbst ausgeführt. Ziel ist es, am Ende des Wettbewerbs der Bot mit den meisten Punkten zu sein.
- In Bezug auf die Diskussion in den Kommentaren dürfen die Einsendungen keine Dateien lesen oder in diese schreiben oder in irgendeiner Weise den Code des Gegners sabotieren oder lesen.
Beispiele:
Dies sind vier Beispiel-Bots, die ich schnell zusammengestellt habe. Sie werden als zusätzliche Bots am Wettbewerb teilnehmen. Wenn Sie bis zum letzten verlieren, müssen Sie noch etwas arbeiten.
def honestpaper(I,dont,care,about_these):
return "P"
def honestrock(I,dont,care,about_these):
return "R"
def honestscissors(I,dont,care,about_these):
return "S"
import random
def randombot(I,dont,care,about_these):
return random.choice(["R","P","S"])
Regler:
Und hier ist der Controller, den ich verwenden werde. Neue Einreichungen werden zu Beginn importiert und dem bot_map-Wörterbuch hinzugefügt.
from honestrock import honestrock
from honestpaper import honestpaper
from honestscissors import honestscissors
from randombot import randombot
bot_map = {
0:honestrock, 1:honestpaper, 2:honestscissors, 3:randombot
}
player_num=len(bot_map)
def real(history1,history2,number,honest1,honest2):
return bot_map[number](history1,history2,honest1,honest2)
def honest(history1,history2,number):
return bot_map[number](history1,history2,None,None)
def play_match(num1,num2):
history1=[]
history2=[]
score1=0
score2=0
for x in range(250):
h1=honest(history2,history1,num1)
h2=honest(history1,history2,num2)
r1=real(history2,history1,num1,h2,h1)
r2=real(history1,history2,num2,h1,h2)
if h1==r1: score1+=1
if h2==r2: score2+=1
if r1==r2: score1+=1; score2+=1
elif r1=="R":
if r2=="P": score2+=2
else: score1+=2
elif r1=="P":
if r2=="S": score2+=2
else: score1+=2
else:
if r2=="R": score2+=2
else: score1+=2
history1.append([h1,r1])
history2.append([h2,r2])
return score1,score2
scores = []
for x in range(player_num):
scores.append(0)
for _ in range(100):
for x in range(player_num):
for y in range(player_num):
scorex,scorey=play_match(x,y)
scores[x]+=scorex
scores[y]+=scorey
for score in scores:
print score
Endergebnisse:
csbot 3430397
thompson 3410414
rlbot 3340373
have_we_been_here_before 3270133
mason 3227817
deepthought 3019363
adaptive_bot 2957506
THEbot 2810535
dontlietome 2752984
irememberhowyoulie 2683508
learningbot4 2678388
betrayal 2635901
averager 2593368
honestrandom 2580764
twothirds 2568620
mirrorbot 2539016
tit4tat 2537981
honestscissors 2486401
trusting_bot 2466662
rotate_scissors 2456069
rotate_paper 2455038
rotate_rock 2454999
honestpaper 2412600
honestrock 2361196
rockBot 2283604
trustingRandom 2266456
user5957401bot 2250887
randombot 2065943
Dx 1622238
liarliar 1532558
everybodylies 1452785
quelle
Antworten:
Mason
Versucht, Informationen über andere Bots zu sammeln, wie zum Beispiel, wie ehrlich sie sind und wie sie durch meinen ersten Zug beeinflusst werden. Ich versuche dann, andere offensichtliche Bots zu finden, die einem Muster folgen, und nutze diese, um mir mehr Punkte zu geben. Schließlich hat der Maurer eine Geheimwaffe: Kenntnis einer Geheimgesellschaft, in der beide Bots, die sich gegenseitig beteiligen, eine vollständige Auslosung vornehmen und jeweils 500 Punkte erhalten. Leider ist das Geheimnis eher ... Gut geheim und ändert sich jedes Mal, wenn der Maurer es tut.
quelle
Rlbot: Stärkung des Lernens
Verwendet einen verstärkenden Lernansatz und geht dieses Spiel auf ähnliche Weise an wie das n-bewaffnete Banditenproblem. Dies geschieht auf zwei Arten: Es wird versucht zu lernen, welche Erklärung gegen jeden Gegner besser ist und sich an diese hält (nützlich gegen konstante Bots), und es wird versucht, das Ergebnis verschiedener Züge in früheren ähnlichen Situationen zu lernen (ähnlich in Bezug auf die relativen Spiele) (zB Stein gegen Papier ähnelt einem früheren Papier gegen Schere). Die anfänglichen Annahmen sind optimistisch, so dass dieser Spieler annehmen wird, dass es 3 Punkte gibt, wenn er ehrlich ist, und dass Lügen 2 Punkte gibt, und daher immer ehrlich ist, bis das Gegenteil bewiesen ist.
Update: Die ersten Turnierergebnisse zeigten ein Problem mit diesem Bot, das darin bestand, dass er in den Erklärungen seines Gegners keine Muster erkennen konnte (was dazu führte, dass er gegen Rotatoren nicht optimal spielte). Ich habe dann dem Code für die ehrlichen Runden eine Mustervergleichskomponente hinzugefügt, die mithilfe eines regulären Ausdrucks nach dem längsten Suffix in der Geschichte der Gegnererklärungen sucht, das irgendwo zuvor in dieser Geschichte vorhanden war, und welche Aktion danach ausgeführt wurde . Wir gehen davon aus, dass der Gegner den gleichen Zug noch einmal spielen wird, und verwenden das vorhergehende Verstärkungslernen, um zu entscheiden, wie die beste Antwort darauf aussehen soll.
Probieren Sie es online!
quelle
Ich habe Python noch nie wirklich benutzt, also bin ich mir sicher, dass ich irgendwo einen Fehler gemacht habe.
Es sollte die letzten 10 Runden überprüfen, um festzustellen, wie oft der Gegner gelogen hat, und dann abhängig davon eine andere Antwort wählen.
quelle
Hier ist mein adaptiver Bot. Es analysiert die letzten 2 Züge des Gegners, um festzustellen, ob es ein ehrlicher Bot ist oder nicht, und spielt dementsprechend:
Edit 1: Wenn der andere Bot ein konstanter Bot ist (dh immer die gleiche Waffe spielt), zerquetscht dieser Bot ihn, indem er die siegreiche Waffe spielt und gleichzeitig ehrlich ist.
Edit 2: Verbesserter Detektor für konstante Bots, um auch mit Rotator-Bots zu arbeiten.
quelle
csbot
Seien Sie ehrlich, solange der andere Spieler es ist, und entdecken Sie einfache deterministische Bots. Spielen Sie den Zug, der den erwarteten Wert maximiert, bei dem wir hauptsächlich unsere Punkte sammeln, aber auch dem anderen Spieler keine Punkte geben möchten. Aber die eigenen Punkte sind um den Faktor zehn besser, daher die ungewöhnlichen Zahlen in der
value
Funktion. Gegnerische Züge werden danach erwartet, wie oft wir sie in dieser Situation zuvor gesehen haben (deklarierte Züge), aber kürzlich gesehene Züge werden stärker gewichtet als zuvor gesehene Züge. Bei zufälligen Anfangszügen (Situationen, die noch nie zuvor gesehen wurden) und etwas mehr Unschärfe enthalten die Gewichte kleine zusätzliche Zufallszahlen.Update: Nutzen Sie die erwarteten Ergebnisse auch in der ehrlichen Runde. Um dies tun zu können, normalisiere und berücksichtige den zusätzlichen Punkt, den der Gegner für die Ehrlichkeit erhält - er konnte unsere Entscheidung in der realen Runde nicht beeinflussen, wird aber jetzt benötigt. Ich dachte von Anfang an darüber nach, dachte aber fälschlicherweise, dass es sich nicht lohnen würde. Ich habe gesehen, dass es möglich ist,
trusting_bot
weniger Punkte zu geben (aber dieser Bot ist sowieso kein starker Gegner), aber ich habe übersehen, dassrockbot
durch gutes Spiel in der ehrlichen Runde zusätzliche Punkte erzielt werden können, obwohl das Spiel in dieser Runde zufällig ist.quelle
if mydecl == None:
ist falsch.Verrat
Die Idee ist, dass ich in den ersten 50 Zügen ehrlich spiele und dann, wenn ich den Gegner dazu gebracht habe zu denken, ich sei ehrlich, unehrlich zu spielen und zu versuchen, das zu spielen, was dem Gegner entgegenwirken würde (basierend darauf, ob er ehrlich oder unehrlich war) in der Vergangenheit). Wenn ich den Punkt erreiche, an dem ich so oft ehrlich als unehrlich gespielt habe, ändere ich die Taktik und wähle den wahrscheinlichsten Zug des Gegners auf der Grundlage vorher bekannter Konfigurationen.
quelle
quelle
Bot Name: Ich erinnere mich, wie du lügst
Getestet für mehrere 100-Runden-Läufe und stellte sich heraus, dass der Sieger im Durchschnitt etwa 220 Punkte erzielt. Eher ehrlich finde ich;)
Das erste Mal, dass ich an KOTH-Herausforderungen teilnehme, daher denke ich, dass es noch Raum für Verbesserungen gibt
quelle
Wie du mir so ich dir
Der klassische Axelrodianer: hoffnungsvoll und doch kleinlich; Einfach und doch robust. Dies ist kein Gefangenendilemma, und ich habe keinen Versuch unternommen, den Zug des Gegners vorherzusagen. Ich bezweifle daher, dass er wirklich wettbewerbsfähig sein wird. Aber "kooperieren" bringt immer noch die meisten Punkte für die Teilnehmer, also denke ich, wird es zumindest mittelmäßig gehen.
quelle
Zwei Drittel
Verwendet die Strategie, die Peter Taylor in der Sandbox und in diesem Kommentar erwähnt hat .
Es nutzt das Nash-Gleichgewicht .
quelle
random.choice
eine zufällige Indexnummer auswählen und dann das Objekt in der Liste an diesem Index zurückgeben müssen. Da Sets keine Reihenfolge haben, unterstützen sie auch keine Indizierung und funktionieren daher nicht mitrandom.choice
. Eine einfache Lösung hierfür wäre, das Set vor dem Aufruf in eine Liste umzuwandelnrandom.choice
.Tiefer Gedanke
Nur ein paar Anmerkungen dazu:
Ich bin neu für beide, Koth und Python, also sag mir, ob ich irgendetwas in diesem Bot durcheinander gebracht habe. Ich denke nicht, dass es das verstärkte Lernen überbieten kann (weil ich vermute, dass es meine Bewegungen zu schnell lernen wird), aber lassen Sie es uns versuchen.
Ich mag diese Herausforderung, und wenn ich etwas Zeit finde, möchte ich einen Ansatz für organisches Rechnen hinzufügen (obwohl die höheren Dimensionen möglicherweise zu wenig Druck ausüben). Dürfen mehrere Vorschläge hinzugefügt werden? Oder ist es verboten, das Boosten Ihres Hauptbots zu verhindern, indem Sie einige einsetzen, die nur darauf abzielen, sich gegen Ihren Hauptbot zu verlieren?
EDIT: Ein Code-Tippfehler wurde behoben, der mich als nicht englischsprachigen Muttersprachler charakterisierte
quelle
return result
ein zusätzlicher Einzug erforderlich ist. Ich glaube, es sollte innerhalb der gigantischen if-Anweisung liegen, die unmittelbar danachreturn
folgt , da die Variable nur in dieser it-Anweisung deklariert wird. Ich habe diese Änderung in meinem Code vorgenommen und sie wird nun fehlerfrei ausgeführt. Wenn es Ihnen nichts ausmacht, diese Änderung hier vorzunehmen, wäre das großartig.R=random.Random(seed)
und verwenden Sie es wie folgt aus :R.choice(...)
.{}
Schaltfläche in der Symbolleiste klicken, um jede Zeile automatisch einzurücken.quelle
haben_wir_hier_vorher
Fragt einfach "Waren wir schon einmal hier?" Und wählt den Zug aus, der das beste durchschnittliche Ergebnis in einem solchen früheren Spiel erzielt hätte.
Bearbeiten: Honesty Club. Ich habe einen kleinen Codeblock hinzugefügt, weil ein anderer Bot (Maurer) es sehr gut gemacht hat, mit sich selbst einen geheimen Club zu gründen. Beachten Sie jedoch, dass ein ehrliches Spiel gegen ehrliche Gegner im Durchschnitt genau den gleichen Gewinn bringt, wenn Sie gegen sich selbst spielen.
Edit2: Zum Zeitpunkt des Schreibens der beiden Bots vor mir nutzen beide Rotatoren, also werde ich einen weiteren Codeblock hinzufügen, um auch auf diesen Zug zu springen. Ich denke, mein Code scheint ziemlich altmodisch zu sein - ich halte mich an vertraute Konstrukte, die in jeder Programmiersprache zu finden sind, weil ich Python wirklich nicht kenne.
quelle
THEbot: DER ehrliche Ausbeuter
quelle
Thompson
quelle
Mirrorbot
Ich werde einen einfachen Bot ausprobieren, der das letzte Spiel seines Gegners unter diesen Bedingungen wiederholt
quelle
Die Idee dabei ist, die Punktzahl zu maximieren, während Sie sich selbst spielen, während Sie in anderen Phasen zufällig gegen andere schlechte Bots antreten.
quelle
is
ist ein Schlüsselwort, das ist also ungültig.Dx
Ich habe nur diesen Bot geschrieben, damit ich einen Smiley in meinem Bot-Namen xD haben kann.
quelle
Jeder lügt
Es liegt an seinem Zug ("Ich spiele Schere!") Und es wird davon ausgegangen, dass der Gegner auch gelogen hat und versucht, meinen Zug zu schlagen ("hmm, Rock schlägt Schere, also spiele ich dass "), aber ich spiele tatsächlich den Zug, der diesen Zug schlägt (" Papier! Überraschung! ").
quelle
Vertrauender Bot
Behauptet immer, eine Schere zu werfen, tut aber, was der Gegner gesagt hat. Wird zuverlässig mit sich selbst zeichnen.
quelle
Botname: Lügner Lügner
Kann nicht aufhören zu lügen.
quelle
RockBot
Nimmt an, dass der Gegner ehrlich ist und versucht, ihn zu schlagen, weigert sich jedoch, Rock zu spielen.
quelle
Name des Bots: dontlietome
Bestimmt, ob der Gegner lügt oder nicht, abhängig davon, wie oft der Gegner in den letzten 10 Runden gelogen hat. Wählt den Zug je nachdem, ob der Gegner lügt oder nicht. Wenn der Gegner entschlossen ist zu lügen, spielt er, was der Hinweis war.
quelle
lost_against_map
undquelle
Averager
quelle
Nur ein bisschen besser als mein vorheriger Eintrag ...
quelle
Csbot auf Steroiden
Ich denke, der Vorschlag, den @ user1502040 in den Kommentaren macht, sollte befolgt werden. Andernfalls hätte dieser Bot einen Vorteil, den ich für unfair halte. Ich reiche es ein, damit der Unterschied, den es macht, beurteilt werden kann. Mit der vorgeschlagenen zufälligen Aussaat würden die Steroide neutralisiert und der Bot würde gleichwertig sein
csbot
, so dass nur einer am Wettbewerb teilnehmen sollte.quelle