Banyak orang menganggap RPS sebagai permainan peluang. Jika kedua pemain bermain tanpa terduga, strategi terbaik adalah bermain secara acak. Namun, mari kita perkenalkan sedikit hal yang dapat diprediksi.
Setiap bot akan memiliki kesempatan untuk memberi tahu bot lain apa yang akan dimainkan secara bersamaan. Lalu ada jeda di mana setiap bot akan tahu apa yang diumumkan pemain lain. Jika ia memainkan senjata itu, ia mengumumkan akan mencetak satu poin di samping poinnya untuk menang kalah atau seri.
Kemenangan bernilai dua poin, satu imbang, satu poin, dan kehilangan 0 poin.
Honest Bot Dishonest
Win 3 2
Draw 2 1
Loss 1 0
Adalah kepentingan terbaik Anda untuk jujur (tetapi juga untuk memastikan lawan Anda tidak percaya Anda).
Pertandingan akan dimainkan dalam format round robin, dan tujuannya adalah untuk memaksimalkan skor total Anda sendiri di pertandingan yang Anda mainkan.
Format I / O:
- Bot Anda akan menjadi fungsi Python 2.7 yang mengambil 4 argumen, dan harus memiliki nama unik (yang akan digunakan untuk mewakili kiriman Anda).
- Dua argumen pertama akan selalu, secara berurutan: gerakan masa lalu lawan, diikuti dengan gerakan masa lalu Anda. Ini akan menjadi daftar secara berurutan dari babak pertama hingga babak terbaru, dengan setiap indeks berisi daftar dengan gerakan yang diklaim akan dibuat lawan, diikuti dengan gerakan yang benar-benar mereka buat.
- Dua argumen berikutnya akan memungkinkan bot Anda untuk menentukan apakah ini putaran "jujur" atau putaran "nyata". Jika itu adalah babak "jujur", keduanya akan menjadi Tidak Ada. Jika itu adalah babak "nyata", mereka akan, secara berurutan, gerakan yang dinyatakan lawan Anda akan dibuat, diikuti oleh langkah yang Anda nyatakan akan Anda buat.
- Semua argumen atau bagian dari argumen yang mewakili gerakan akan menggunakan "R", "P", dan "S" untuk masing-masing mewakili batu, kertas, dan gunting.
- Fungsi Anda harus mengembalikan "R" untuk rock, "P" untuk kertas, atau "S" untuk gunting. Bot yang memiliki kemampuan untuk mengembalikan nilai lain akan didiskualifikasi.
- Setiap bot akan dijalankan melawan setiap bot lainnya 200 kali, dan itu sendiri 100 kali. Tujuannya adalah menjadi bot dengan poin terbanyak di akhir kompetisi.
- Berkenaan dengan diskusi dalam komentar, pengiriman tidak boleh membaca dari atau menulis ke file apa pun, atau dengan cara apa pun menyabotase atau membaca kode lawan.
Contoh:
Ini adalah empat contoh bot yang saya kumpulkan dengan cepat. Mereka akan bergabung dengan kompetisi sebagai bot tambahan. Jika Anda kalah dari yang terakhir, Anda memiliki beberapa pekerjaan yang harus dilakukan.
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"])
Pengendali:
Dan inilah pengontrol yang akan saya gunakan. Kiriman baru akan diimpor di awal dan ditambahkan ke kamus 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
Skor Akhir:
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
sumber
Jawaban:
Tukang batu
Mencoba mengambil informasi tentang bot lain seperti seberapa jujur mereka dan bagaimana mereka dipengaruhi oleh langkah pertama saya. Saya kemudian mencoba dan menemukan bot lain yang jelas yang mengikuti pola dan mengeksploitasi mereka untuk memberi saya lebih banyak poin. Akhirnya, Mason memiliki senjata rahasia: pengetahuan tentang masyarakat rahasia di mana kedua bot yang berpartisipasi saling bertarung untuk hasil imbang penuh, masing-masing memperoleh 500 poin. Sayangnya rahasianya agak ... Rahasia baik dan berubah setiap kali Mason melakukannya.
sumber
Rlbot: pembelajaran penguatan
Menggunakan pendekatan pembelajaran penguatan, menangani game ini dengan cara yang mirip dengan masalah bandit n-bersenjata. Ia melakukannya dengan dua cara: mencoba mempelajari deklarasi mana yang lebih baik terhadap masing-masing lawan dan berpegang teguh pada yang satu itu (berguna melawan bot konstan), dan mencoba mempelajari hasil dari berbagai gerakan dalam situasi serupa sebelumnya (serupa dalam hal permainan relatif , misalnya batu vs kertas mirip dengan kertas sebelumnya vs gunting). Asumsi awal optimis, sehingga pemain ini akan menganggap bahwa bersikap jujur akan memberinya 3 poin dan berbohong akan memberi 2, dan karena itu akan selalu jujur sampai terbukti sebaliknya.
Pembaruan: Hasil turnamen pertama menyoroti masalah dengan bot ini, yang merupakan ketidakmampuannya untuk mendeteksi pola dalam deklarasi lawannya (yang membuatnya bermain secara optimal terhadap rotator). Saya kemudian menambahkan komponen pencocokan pola ke kode untuk putaran jujur, yang menggunakan regex untuk mencari sufiks terpanjang dalam sejarah deklarasi lawan yang ada di suatu tempat sebelumnya dalam sejarah itu, dan langkah apa yang dimainkan setelah itu . Kami berasumsi bahwa lawan akan memainkan langkah yang sama lagi, dan menggunakan pembelajaran penguatan seperti sebelumnya untuk memutuskan apa jawaban terbaik untuk itu.
Cobalah online!
sumber
Saya tidak pernah benar-benar menggunakan python jadi saya yakin saya telah membuat kesalahan di suatu tempat.
Seharusnya memeriksa 10 putaran terakhir untuk melihat seberapa sering lawan berbohong, lalu memilih respons yang berbeda tergantung pada itu.
sumber
Ini bot adaptif saya. Ini menganalisis 2 gerakan terakhir lawan untuk menentukan apakah itu bot yang jujur atau tidak dan bermain sesuai:
Sunting 1: Jika bot lain adalah bot konstan (mis. Selalu memainkan senjata yang sama) bot ini menghancurkannya dengan memainkan senjata yang menang dan jujur pada saat yang sama.
Sunting 2: Detektor bot konstan yang ditingkatkan untuk bekerja dengan bot rotator juga.
sumber
csbot
Jujur selama pemain lain, dan mendeteksi bot deterministik sederhana. Mainkan gerakan yang memaksimalkan nilai yang diharapkan, di mana kita sebagian besar mengejar poin kita, tetapi juga suka tidak memberikan poin kepada pemain lain. Tetapi poin sendiri lebih baik dengan faktor sepuluh, karenanya angka yang tidak biasa dalam
value
fungsi. Gerakan lawan diharapkan sesuai dengan seberapa sering kita telah melihatnya sebelumnya dalam situasi ini (gerakan yang dinyatakan), tetapi gerakan yang baru-baru ini terlihat lebih berat daripada pergerakan yang terlihat sebelumnya. Untuk gerakan awal acak (situasi yang belum pernah terlihat sebelumnya) dan beberapa fuzzyness ekstra, bobotnya termasuk angka acak ekstra kecil.Pembaruan: Gunakan hasil yang diharapkan juga di babak jujur. Untuk dapat melakukan ini, normalkan dan ambil poin tambahan yang mungkin diperhitungkan lawan untuk kejujuran - itu tidak dapat memengaruhi keputusan kita di babak nyata tetapi dibutuhkan sekarang. Saya mempertimbangkan untuk melakukan ini sejak awal, tetapi salah berpikir itu tidak akan bermanfaat. Saya melihat bahwa mungkin untuk memberikan
trusting_bot
poin lebih sedikit (tapi bot itu bukan lawan yang kuat), tetapi melewatkan bahwa poin tambahan bisa didapat darirockbot
permainan bagus di babak jujur meskipun permainannya di babak ini acak.sumber
if mydecl == None:
salah.Pengkhianatan
Idenya adalah bahwa untuk 50 langkah pertama saya bermain jujur, dan kemudian setelah saya membujuk lawan untuk berpikir saya jujur, bermain tidak jujur, mencoba bermain apa yang akan melawan apa yang akan lawan mainkan (berdasarkan apakah dia jujur atau tidak jujur) di masa lalu). Ketika saya mencapai titik di mana saya bermain sesering yang jujur daripada tidak jujur, saya mengubah taktik dan memilih langkah yang paling mungkin dari lawan berdasarkan konfigurasi yang diketahui sebelumnya.
sumber
sumber
Nama Bot: I Remember How You Lie
Diuji untuk beberapa putaran 100 putaran, dan ternyata skor pemenang rata-rata sekitar 220. Agak jujur saya pikir;)
Pertama kali bagi saya untuk berpartisipasi dalam tantangan KOTH, jadi saya pikir masih ada ruang untuk perbaikan
sumber
Gayung bersambut
Kontestan Axelrodian klasik: penuh harap, namun picik; sederhana, namun kuat. Ini bukan Dilema Tahanan dan saya tidak berusaha untuk memprediksi langkah lawan, jadi saya sangat meragukan itu akan benar-benar kompetitif. Tapi "bekerja sama" masih menghasilkan poin paling keseluruhan untuk kontestan, jadi saya pikir itu setidaknya akan lumayan.
sumber
Dua pertiga
Menggunakan strategi yang disebutkan Peter Taylor di Sandbox dan dalam komentar ini .
Ia menggunakan keseimbangan Nash .
sumber
random.choice
bergantung pada memilih nomor indeks acak dan kemudian mengembalikan objek dalam daftar di indeks itu. Karena set tidak memiliki pesanan, mereka juga tidak mendukung pengindeksan dan karenanya tidak berfungsirandom.choice
. Perbaikan sederhana untuk ini adalah untuk melemparkan set ke daftar sebelum memanggilrandom.choice
.Pikiran yang dalam
Hanya beberapa catatan di atasnya:
Saya baru untuk keduanya, koth dan Python, jadi beri tahu saya jika saya mengacaukan sesuatu di bot ini. Saya tidak berpikir itu bisa mengalahkan pembelajaran yang diperkuat (karena saya kira itu akan belajar gerakan saya terlalu cepat), tapi mari kita coba.
Saya suka tantangan ini, dan jika saya menemukan waktu, saya ingin menambahkan pendekatan komputasi organik (meskipun mungkin ada tekanan yang terlalu sedikit pada dimensi yang lebih tinggi). Apakah diizinkan menambahkan beberapa saran? Atau apakah dilarang untuk mencegah bot utama Anda dengan memasukkan beberapa yang hanya bertujuan untuk kalah dengan bot utama Anda?
EDIT: Memperbaiki kesalahan ketik kode yang menandai saya sebagai penutur bahasa Inggris yang bukan penutur asli
sumber
return result
membutuhkan indentasi tambahan. Saya percaya itu harus di dalam raksasa jika pernyataan itu segera setelah, karena variabelreturn
hanya dinyatakan dalam pernyataan itu. Saya membuat modifikasi ini dalam kode saya, dan sekarang berjalan tanpa kesalahan. Jika Anda tidak keberatan melakukan perubahan itu di sini, itu akan bagus.R=random.Random(seed)
dan menggunakannya seperti ini:R.choice(...)
.{}
tombol pada bilah alat untuk secara otomatis membuat indentasi setiap baris.sumber
have_we_been_here_before
Cukup tanyakan "apakah kita pernah ke sini sebelumnya", dan memilih langkah yang akan memberikan hasil rata-rata terbaik dalam permainan sebelumnya.
Sunting: Klub Kejujuran.Saya telah menambahkan satu blok kode kecil karena bot lain (tukang batu) telah bekerja dengan sangat baik dengan membentuk klub rahasia dengan dirinya sendiri. Namun perhatikan, bahwa bermain jujur melawan lawan yang jujur memiliki rata-rata imbalan yang persis sama ketika bermain melawan diri sendiri, dan mungkin ada manfaat bersama yang lebih luas yang bisa didapat juga?
Sunting2: Pada saat penulisan kedua bot di depan saya sama-sama mengeksploitasi rotator, jadi saya akan menambahkan satu blok kode lagi untuk melompat pada kereta musik itu juga. Saya kira kode saya harus tampak sekolah yang cukup tua - menempel pada konstruksi akrab yang ditemukan dalam bahasa pemrograman karena saya benar-benar tidak tahu Python.
sumber
THEbot: THE Exploiter Jujur
sumber
Thompson
sumber
mirrorbot
Saya akan mencoba bot sederhana yang mengulang permainan terakhir lawannya dalam kondisi ini
sumber
Idenya di sini adalah untuk memaksimalkan skor saat bermain sendiri sementara masih kompetitif secara acak selama tahap lain melawan bot buruk lainnya.
sumber
is
adalah kata kunci, jadi ini tidak valid.Dx
Saya hanya menulis bot ini sehingga saya dapat memiliki smiley di nama bot saya xD.
sumber
Semua orang berbohong
Itu terletak pada gerakannya ("Aku akan bermain Gunting!"), Dan menganggap lawan juga berbohong dan bahwa mereka akan mencoba untuk mengalahkan apa yang saya katakan akan bergerak saya ("hmm, Rock mengalahkan Gunting jadi saya bermain itu "), tetapi saya benar-benar memainkan gerakan yang mengalahkan gerakan itu (" Kertas! Kejutan! ").
sumber
Bot Percaya
Selalu mengaku melempar gunting, tetapi akan melakukan apa pun yang mengalahkan apa yang dikatakan lawan. Akan andal menggambar dengan sendirinya.
sumber
Nama bot: Pembohong Pembohong
Tidak bisa berhenti berbohong
sumber
RockBot
Diasumsikan lawan akan jujur dan mencoba untuk mengalahkan mereka, tetapi menolak untuk bermain rock.
sumber
Nama bot: dontlietome
Menentukan apakah lawan berbohong atau tidak tergantung pada berapa kali lawan berbohong dalam 10 putaran terakhir. Memilih bergerak tergantung pada apakah lawan berbohong atau tidak. Jika lawan bertekad berbohong, maka mainkan isyarat itu.
sumber
lost_against_map
, dan memperbaiki pernyataan if memeriksa jika jujur)sumber
Averager
sumber
Hanya sedikit lebih baik daripada entri saya sebelumnya ...
sumber
csbot pada steroid
Saya pikir saran yang dibuat oleh @ user1502040 dalam komentar harus diikuti. Kalau tidak, bot ini akan memiliki keuntungan yang saya anggap tidak adil. Saya serahkan supaya perbedaan yang dibuat bisa dinilai. Dengan pembibitan acak yang disarankan steroid akan dinetralkan dan bot akan setara dengan
csbot
, jadi hanya satu yang harus berpartisipasi dalam kontes.sumber