Wiele osób uważa RPS za grę losową. Jeśli obaj gracze grają nieprzewidywalnie, najlepszą strategią jest gra losowa. Wprowadźmy jednak trochę przewidywalności.
Każdy bot będzie miał okazję powiedzieć drugiemu botowi, co będzie grał jednocześnie. Następnie następuje przerwa, w której każdy bot będzie wiedział, co ogłosił drugi gracz. Jeśli zagra tą bronią, którą ogłosi, zdobędzie jeden punkt oprócz punktów za przegraną lub remis.
Wygrana jest warta dwa punkty, remis, jeden punkt, a przegrana 0 punktów.
Honest Bot Dishonest
Win 3 2
Draw 2 1
Loss 1 0
W twoim najlepszym interesie jest bycie uczciwym (ale także upewnienie się, że przeciwnik ci nie wierzy).
Mecze będą rozgrywane w formacie round robin, a celem będzie zmaksymalizowanie własnego wyniku w meczach, w które grasz.
Format we / wy:
- Twój bot będzie funkcją Python 2.7, która pobiera 4 argumenty i musi mieć unikalną nazwę (która będzie używana do przedstawienia twojego przesłania).
- Pierwsze dwa argumenty zawsze będą w kolejności: przeszłe ruchy przeciwnika, a następnie poprzednie ruchy. Będzie to lista w kolejności od pierwszej do ostatniej rundy, przy czym każdy indeks będzie zawierał listę ruchów, o których twierdził przeciwnik, a następnie ruch, który faktycznie wykonali.
- Następne dwa argumenty pozwolą Twojemu botowi ustalić, czy jest to runda „uczciwa”, czy „prawdziwa”. Jeśli jest to „uczciwa” runda, obie będą Żadne. Jeśli jest to „prawdziwa” runda, będą to kolejno ruch, który zadeklarował twój przeciwnik, a następnie ruch, który zadeklarujesz, że wykonasz.
- Wszystkie argumenty lub części argumentów, które reprezentują ruchy, będą używać odpowiednio „R”, „P” i „S” do przedstawienia odpowiednio kamienia, papieru i nożyczek.
- Twoja funkcja powinna zwracać albo „R” dla kamienia, „P” dla papieru lub „S” dla nożyczek. Boty, które mogą zwracać inne wartości, zostaną zdyskwalifikowane.
- Każdy bot zostanie uruchomiony przeciwko każdemu drugiemu botowi 200 razy, a sam 100 razy. Celem jest bycie botem z największą liczbą punktów na koniec zawodów.
- W odniesieniu do dyskusji w komentarzach, zgłoszenia nie mogą odczytywać ani zapisywać żadnych plików, ani w żaden sposób sabotować ani odczytywać kodu przeciwnika.
Przykłady:
Są to cztery przykładowe boty, które szybko zestawiłem. Dołączą do konkursu jako dodatkowe boty. Jeśli przegrasz do ostatniego, masz trochę do zrobienia.
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"])
Kontroler:
A oto kontroler, którego będę używać. Nowe zgłoszenia zostaną zaimportowane na początku i dodane do słownika bot_map.
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
Ostateczne wyniki:
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
źródło
Odpowiedzi:
Mason
Próbuje zebrać informacje o innych botach, takie jak ich uczciwość i wpływ, jaki wywarł na nich mój pierwszy ruch. Następnie próbuję znaleźć inne oczywiste boty, które podążają za tym wzorem, i wykorzystuję je, by dać mi więcej punktów. Wreszcie, Mason ma tajną broń: wiedzę o tajnym stowarzyszeniu, w którym oba boty biorące udział w sobie biorą udział w pełnym losowaniu, zdobywając po 500 punktów każdy. Niestety, sekret jest raczej ... Dobrze tajny i zmienia się za każdym razem, gdy robi to Mason.
źródło
Rlbot: nauka wzmocnienia
Wykorzystuje podejście uczenia się wzmacniającego, rozwiązując tę grę w sposób podobny do problemu n-uzbrojonego bandyty. Robi to na dwa sposoby: próbuje dowiedzieć się, która deklaracja jest lepsza dla każdego przeciwnika i trzyma się tego (przydatny w przypadku stałych botów), i próbuje poznać wyniki różnych ruchów w poprzednich podobnych sytuacjach (podobnie w odniesieniu do względnych zagrań , np. kamień kontra papier jest podobny do poprzedniego papieru kontra nożyce). Początkowe założenia są optymistyczne, więc ten gracz będzie zakładał, że uczciwość da mu 3 punkty, a kłamstwo da 2, a zatem zawsze będzie uczciwy, dopóki nie zostanie udowodnione inaczej.
Aktualizacja: Wyniki pierwszego turnieju uwidoczniły problem z tym botem, którym była niemożność wykrycia wzorców w deklaracjach przeciwników (co spowodowało, że grał on nieoptymalnie przeciwko rotatorom). Następnie dodałem do kodu element dopasowujący wzorzec dla uczciwych rund, który używa wyrażenia regularnego, aby wyszukać najdłuższy przyrostek w historii deklaracji przeciwników, który jest obecny gdzieś w tej historii, i jaki ruch został wykonany po tym . Zakładamy, że przeciwnik ponownie wykona ten sam ruch i użyje uczenia wzmacniającego jak wcześniej, aby zdecydować, jaka powinna być najlepsza odpowiedź.
Wypróbuj online!
źródło
Nigdy tak naprawdę nie używałem Pythona, więc jestem pewien, że gdzieś popełniłem błąd.
Powinien sprawdzić ostatnie 10 rund, aby zobaczyć, jak często kłamał przeciwnik, a następnie wybrać inną odpowiedź w zależności od tego.
źródło
Oto mój adaptacyjny bot. Analizuje 2 ostatnie ruchy przeciwnika, aby ustalić, czy jest to uczciwy bot, czy nie, i gra odpowiednio:
Edycja 1: Jeśli drugi bot jest stałym botem (tzn. Zawsze gra tą samą bronią), ten bot miażdży go, grając zwycięską bronią i jednocześnie będąc szczerym.
Edycja 2: Ulepszony stały wykrywacz botów do pracy z botami rotatorowymi.
źródło
csbot
Bądź szczery, dopóki jest inny gracz, i wykrywaj proste deterministyczne boty. Zagraj w ruch, który maksymalizuje oczekiwaną wartość, w którym głównie zbieramy nasze punkty, ale także nie chcemy dawać punktów drugiemu graczowi. Ale własne punkty są lepsze dziesięciokrotnie, stąd niezwykłe liczby w
value
funkcji. Ruchy przeciwnika są oczekiwane w zależności od tego, jak często je widzieliśmy w tej sytuacji (ruchy zadeklarowane), ale ostatnio widziane ruchy są ważone bardziej niż ruchy widziane wcześniej. W przypadku losowych początkowych ruchów (sytuacje, których nigdy wcześniej nie widziałem) i dodatkowego rozmycia, wagi obejmują małe dodatkowe losowe liczby.Aktualizacja: Używaj oczekiwanych wyników także w uczciwej rundzie. Aby móc to zrobić, znormalizować i wziąć dodatkowy punkt, który przeciwnik może uzyskać za uczciwość - nie mógł wpłynąć na naszą decyzję w prawdziwej rundzie, ale jest teraz potrzebny. Zastanawiałem się nad zrobieniem tego od samego początku, ale niesłusznie pomyślałem, że nie będzie to opłacalne. Widziałem, że można dać
trusting_bot
mniej punktów (ale ten bot i tak nie jest silnym przeciwnikiem), ale przegapiłem, że dodatkowe punkty można zdobyćrockbot
dzięki dobrej grze w uczciwej rundzie, chociaż jej gra w tej rundzie jest losowa.źródło
if mydecl == None:
jest błędny.Zdrada
Chodzi o to, że przez pierwsze 50 ruchów gram uczciwie, a potem, gdy już skłaniam przeciwnika do myślenia, że jestem uczciwy, graj nieuczciwie, próbując zagrać w coś, co przeciwstawi się temu, co przeciwnik zagra (na podstawie tego, czy był uczciwy czy nieuczciwy w przeszłości). Kiedy dochodzę do punktu, w którym grałem tak często uczciwie niż nieuczciwie, zmieniam taktykę i wybieram najbardziej prawdopodobny ruch przeciwnika na podstawie poprzednich znanych konfiguracji.
źródło
źródło
Nazwa bota: I Remember How You Lie
Testowany na kilka 100-rundowych przebiegów i okazało się, że zwycięzca osiąga średnio około 220 punktów. Myślę, że raczej szczerze;)
Po raz pierwszy biorę udział w wyzwaniach KOTH, więc myślę, że wciąż jest miejsce na ulepszenia
źródło
Wet za wet
Klasyczny zawodnik Axelrodian: pełen nadziei, ale małostkowy; proste, ale solidne. To nie jest Dylemat Więźnia i nie próbowałem przewidzieć ruchu przeciwnika, więc bardzo wątpię, czy będzie on naprawdę konkurencyjny. Ale „kooperacja” nadal generuje najbardziej ogólne punkty dla zawodników, więc myślę, że przynajmniej zrobi to średnio.
źródło
Dwie trzecie
Wykorzystuje strategię, o której wspomniał Peter Taylor w piaskownicy i w tym komentarzu .
Wykorzystuje równowagę Nasha .
źródło
random.choice
polega na wybraniu losowego numeru indeksu, a następnie zwróceniu obiektu na liście pod tym indeksem. Ponieważ zestawy nie mają kolejności, nie obsługują także indeksowania i dlatego nie działająrandom.choice
. Prostym rozwiązaniem byłoby przeniesienie zestawu na listę przed wywołaniemrandom.choice
.Głęboka myśl
Kilka uwag na ten temat:
Jestem nowy zarówno dla Kotha, jak i Pythona, więc powiedz mi, czy coś pomieszałem w tym bocie. Nie sądzę, że może pokonać naukę wzmocnioną (ponieważ myślę, że zbyt szybko nauczy się moich ruchów), ale spróbujmy.
Podoba mi się to wyzwanie, a jeśli znajdę trochę czasu, chciałbym dodać organiczną metodę obliczeniową (choć może być zbyt mała presja na wyższe wymiary). Czy można dodawać wiele sugestii? A może zabrania się przejmowania głównego bota przez wstawianie takich, które mają jedynie na celu przegrywanie z głównym botem?
EDYCJA: Naprawiono literówkę, która sprawiała, że nie mówiłem po angielsku
źródło
return result
wymaga dodatkowego wcięcia. Uważam, że powinna znajdować się wewnątrz gigantycznej instrukcji if, która następuje zaraz po niej, ponieważ zmiennareturn
jest deklarowana tylko w tym, że instrukcja. Dokonałem tej modyfikacji w moim kodzie i teraz działa ona bezbłędnie. Jeśli nie miałbyś nic przeciwko wprowadzeniu tej zmiany tutaj, byłoby świetnie.R=random.Random(seed)
i używać go tak:R.choice(...)
.{}
przycisk na pasku narzędzi, aby automatycznie wciąć każdą linię.źródło
have_we_been_here_before
Po prostu pyta „byliśmy tu wcześniej” i wybiera ruch, który dałby najlepszy średni wynik we wszystkich poprzednich grach.
Edycja: Klub uczciwości. Dodałem mały blok kodu, ponieważ inny bot (mason) zrobił bardzo dobrze, tworząc ze sobą tajny klub. Zauważ jednak, że uczciwa gra przeciwko uczciwym przeciwnikom przynosi średnio dokładnie taką samą wypłatę, gdy gra się przeciwko sobie, a może być może są też szersze wzajemne korzyści?
Edycja2: W momencie pisania dwóch botów przede mną, oba wykorzystują rotatory, więc dodam kolejny blok kodu, aby wskoczyć również na ten bandwagon. Wydaje mi się, że mój kod musi wydawać się dość oldschoolowy - trzymać się znanych konstruktów znalezionych w dowolnym języku programowania, ponieważ tak naprawdę nie znam Python.
źródło
THEbot: uczciwy odkrywca
źródło
Thompson
źródło
mirrorbot
Spróbuję prostego bota, który w tych warunkach przerwie ostatnią grę przeciwnika
źródło
Chodzi o to, aby zmaksymalizować wynik podczas gry w siebie, a jednocześnie być losowo konkurencyjnym na innych etapach przeciwko innym złym botom.
źródło
is
jest słowem kluczowym, dlatego jest nieprawidłowe.Dx
Napisałem tylko tego bota, więc mogę mieć buźkę w nazwie bota xD.
źródło
Wszyscy kłamią
Kłamie o swoim ruchu („Będę grał w nożyczki!”) I zakłada, że przeciwnik też kłamał i że spróbują pokonać to, co powiedziałem, że mój ruch to („hmm, Rock bije nożyczki, więc gram że ”), ale tak naprawdę gram ruch, który bije ten ruch („ Paper! Surprise! ”).
źródło
Zaufanie Botowi
Zawsze twierdzi, że rzuca nożyczkami, ale zrobi wszystko, co bije to, co powiedział przeciwnik. Rzetelnie rysuje sam ze sobą.
źródło
Nazwa bota: Liar Liar
Nie mogę przestać kłamać.
źródło
RockBot
Zakłada, że przeciwnik będzie uczciwy i spróbuje go pokonać, ale nie chce grać w rock.
źródło
Nazwa bota: dontlietome
Określa, czy przeciwnik kłamie, czy nie, w zależności od tego, ile razy przeciwnik kłamał w ostatnich 10 rundach. Wybiera ruch w zależności od tego, czy przeciwnik kłamie, czy nie. Jeśli przeciwnik jest zdeterminowany, by kłamać, wówczas zagrywa podpowiedź.
źródło
lost_against_map
i naprawił instrukcję if sprawdzającą, czy uczciwa runda)źródło
Uśrednianie
źródło
Tylko trochę lepiej niż mój poprzedni wpis ...
źródło
csbot na sterydach
Myślę, że należy postępować zgodnie z sugestią @ user1502040 zawartą w komentarzach. W przeciwnym razie ten bot miałby przewagę, którą uważałbym za niesprawiedliwą. Przedkładam to, aby można było ocenić różnicę, którą powoduje. Przy sugerowanym losowym wysiewie sterydy zostaną zneutralizowane, a bot będzie równoważny
csbot
, więc tylko jeden powinien wziąć udział w konkursie.źródło