Kontes dibuka secara permanen - Diperbarui 10 Agustus 2017
Meskipun pada 5 Juni 2017 saya menyatakan pemenang (yang akan disimpan sebagai jawaban terbaik) saya akan menemukan bot baru dan memperbarui hasilnya.
Hasil 5 Juni
Selamat pengguna1502040
Karena tidak ada ikatan, saya hanya menunjukkan% pertandingan yang dimenangkan.
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
- 19,8% - 16,2%
Saya membuat Google Sheet dengan kisi hasil masing-masing pasangan: https://docs.google.com/spreadsheets/d/1KrMvcvWMkK-h1Ee50w0gWLh_L6rCFOgLhTN_QlEXHyk/edit?usp=sharing
Berkat Dilema Petri, saya menemukan diri saya mampu menangani Raja Bukit ini.
Permainan
Permainan ini sederhana "Rock-Paper-Scissors" dengan twist: Poin yang diperoleh dengan setiap peningkatan kemenangan selama pertandingan (R, P atau S Anda dimuat).
- Kertas memenangkan Rock
- Gunting memenangkan Kertas
- Rock menang Gunting
Pemenang mendapat poin sebanyak bebannya pada permainannya.
Yang kalah bertambah dengan 1 beban pada permainannya.
Dalam kasus seri, masing-masing pemain menambah beban pada permainannya sebesar 0,5.
Setelah 100 drama, yang memiliki poin lebih banyak adalah pemenangnya.
misalnya: P1 memiliki banyak [10,11,12] (Rock, Paper, Gunting) dan P2 [7,8,9]. P1 memainkan R, P2 memainkan P. P2 menang dan mendapat 8 poin. Beban P1 menjadi [11,11,12], beban P2 tetap sama.
Spesifikasi tantangan
Program Anda harus ditulis dengan Python (maaf, saya tidak tahu bagaimana cara mengatasinya). Anda harus membuat fungsi yang mengambil masing-masing variabel ini sebagai argumen pada setiap eksekusi:
my_points, opp_points, my_loaded, opp_loaded, my_history, opp_history
points
- Poin saat ini (milik Anda dan lawan Anda)
loaded
- Array dengan banyak (agar RPS) (milik Anda dan opp Anda)
history
- String dengan semua permainan, karakter terakhir adalah permainan terakhir (milik Anda dan lawan Anda)
Anda harus kembali "R"
, "P"
atau "S"
. Jika Anda akan mengembalikan sesuatu yang berbeda, itu akan menjadi kekalahan otomatis dari pertandingan.
Aturan
Anda tidak dapat mengubah fungsi bawaan.
Pengujian
Saya akan terus memperbarui Git dengan kode dan semua bot yang memenuhi: https://github.com/Masclins/LoadedRPS
Menilai
Pemenang akan ditentukan dengan memilih orang dengan pertandingan yang paling menang setelah 1000 round-robin penuh. Ikatan akan dipatahkan oleh pertandingan yang diikat. 1000 pertandingan dimainkan lebih dari satu karena saya mengharapkan banyak keacakan, dan dengan cara itu keacakan akan kurang relevan.
Anda dapat mengirim hingga 5 bot.
Kontes berakhir pada Juli 4 Jun (yang akan menjadi hari terakhir saya akan menerima jawaban apa pun), dan pada Juli 5 Jun Aku akan posting stadings akhir (mungkin mencoba untuk memposting advancemnt sebelumnya).
Karena ini adalah KOTH pertamaku, aku 100% terbuka untuk mengubah apa pun untuk peningkatan, seperti jumlah pertandingan yang dimainkan melawan setiap bot.
Diedit ke 1000 pertandingan, karena saya melihat benar-benar ada keacakan yang terlibat.
sumber
runcode
danbots
)?Jawaban:
Ahli statistik(tidak lagi bermain)Beralih di antara beberapa strategi sederhana berdasarkan kinerja masa lalu yang diharapkan
Ahli Statistik 2
Nash
Menghitung ekuilibrium Nash perkiraan dengan gradien descent.
sumber
Timbangan
Saya kehilangan jejak penalaran saat bereksperimen dengan kode, tetapi ide dasarnya adalah memperkirakan probabilitas gerakan lawan dengan 3 gerakan terakhir menggunakan beberapa bobot dan mengalikannya dengan bobot lain yang tergantung pada beban. Saya berpikir bahwa saya entah bagaimana dapat menggunakan
my_loaded
juga, tetapi saya tidak dapat memutuskan bagaimana, jadi tinggalkan saja.Setan
Mungkin akan didiskualifikasi, karena itu semacam kecurangan dan membuat beberapa asumsi tentang fungsi pengujian (harus memiliki fungsi lawan dalam variabel pada kerangka tumpukannya), tetapi secara teknis tidak melanggar aturan apa pun saat ini - tidak mendefinisikan kembali atau menulis ulang apa pun. Itu hanya menggunakan ilmu hitam untuk menjalankan fungsi lawan untuk melihat apa yang dilakukan / akan mereka lakukan. Itu tidak bisa berurusan dengan keacakan, tetapi bot deterministik tidak memiliki kesempatan untuk mengalahkan Setan.
sumber
my_loaded
Anda bisa menambahkan bobot yang menghargai gerakan yang akan kalah terhadap langkah terakhir Anda. Itu seperti mengasumsikan lawan Anda akan melakukan sesuatu yang mirip dengan yang Anda lakukan, dan karenanya menghukumnya karena menganggap Anda akan terus bermain sama. Sesuatu seperti:for i, m in enumerate(reversed(my_history[-3:])): sc[(idx[m]+1)%3] += (K / (1 + i))
Instalatur
Bot ini meningkatkan Pola dan menggabungkannya dengan Economist (Pattern and Economist tidak akan lagi berpartisipasi)
Peningkatan Pola adalah bahwa Bot sekarang mencari dua jenis pola: Lawan bereaksi terhadap permainan terakhirnya dan lawan bereaksi terhadap permainan terakhir saya. Kemudian evaluasi kedua prediksi untuk menggunakan prediksi yang paling cocok.
Dari pola itu Bot sekarang memiliki probabilitas untuk R, P dan S. Dengan memperhitungkannya dan nilai yang diharapkan dari setiap permainan (seperti yang dilakukan oleh Economist), Bot memainkan salah satu yang memberikan nilai paling besar.
Berikut adalah dua kode lama
Pola(tidak lagi bermain)Pola berusaha menemukan pola pada lawannya. Itu terlihat seperti apa yang telah dimainkan lawan setelah permainan terakhir yang dilakukannya (memberikan bobot lebih untuk drama terakhir). Melalui itu, ia menebak apa yang akan dimainkan lawan, dan memainkan serangan balasan untuk itu.
Ekonom(tidak lagi bermain)The Economist melakukan yang berikut: Menebak probabilitas setiap permainan oleh lawan dengan menonton apa yang telah ia mainkan dalam 9 putaran terakhir. Dari itu, menghitung manfaat yang diharapkan dari setiap permainan dan berjalan dengan yang memiliki nilai harapan terbaik.
sumber
Yggdrasil
Ini dinamai "Yggdrasil" karena terlihat di depan di pohon permainan. Bot ini tidak melakukan prediksi lawan, ia hanya mencoba mempertahankan keunggulan statistik jika diberikan satu (dengan menyeimbangkan keuntungan saat ini dan masa depan). Ini menghitung strategi campuran sekitar ideal, dan mengembalikan langkah yang dipilih secara acak dengan bobot tersebut. Jika bot ini sempurna (yang bukan, karena fungsi penilaian negara sangat buruk dan tidak terlihat terlalu jauh ke depan), maka tidak mungkin mengalahkan bot ini lebih dari 50% dari waktu. Saya tidak tahu seberapa baik bot ini dalam praktiknya.
sumber
Anti-Pengulang
Pilih kertas pada belokan pertama, setelah itu mengembalikan apa pun yang mengalahkan apa yang paling banyak dilakukan lawan, mengambil kertas jika ada dasi.
Peniru
Cukup salin langkah terakhir lawan.
Anti-Anti-Serakah
Pilihan apa pun yang kalah dari pilihan lawan yang paling berat.
Agak Lapar
sumber
Utusan
Rockstar
Pembunuh
Penjelasan
Sekarang, Anda mungkin berpikir bahwa bot ini sepenuhnya bodoh.
tidak sepenuhnya benar, ini sebenarnya didasarkan pada ide, dari mengumpulkan bonus besar, dan musuh membuat kesalahan langkah dan dipukuli dengannya.
sekarang, bot ini bermain sangat mirip dengan serakah, namun, mereka lebih sederhana, dan tidak memilih secara acak sampai mereka mendapatkan beban pada satu senjata, mereka tetap dengan senjata pilihan mereka.
Hal lain yang perlu diperhatikan: masing-masing akan mengalahkan rakus sekitar setengah waktu, menarik sepertiga dari waktu, dan kehilangan seperenam waktu ketika mereka menang, mereka cenderung menang banyak. kenapa ini?
Serakah, sampai dia kalah satu ronde, akan secara acak memilih senjata. ini berarti bahwa ketika dia tidak memenangkan ronde, dia akan memilih senjata secara acak lagi, yang bisa menjadi senjata yang menang lagi. jika serakah imbang atau kalah, dia bertahan dengan senjata itu. jika serakah menang setidaknya satu putaran, lalu pilih senjata yang sama dengan bot, serakah menang. jika serakah mengambil senjata yang hilang di beberapa titik, bot kami menang, karena beban pada senjata kami akan lebih tinggi dari skor serakah.
Dengan asumsi serakah tidak selalu hanya mengambil senjata yang menang melalui kesempatan besar, ini berarti bahwa kemungkinannya adalah:
1/3: {1/2 win (total 1/6). 1/2 kalah (total 1/6). }
1/3 imbang
1/3 menang
jadi: 1/3 kesempatan untuk seri, 1/6 peluang dari kerugian, 1/2 peluang untuk menang.
ini mungkin menunjukkan bahwa Anda perlu melakukan banyak permainan dari beberapa babak
ini terutama untuk mendapatkan tantangan bergulir
sumber
Reaktor
Buat drama yang akan memenangkan putaran sebelumnya.
sumber
opp_history[len(opp_history)-1]
denganopp_history[-1]
.Anak Berseni
Bot ini bertindak seperti anak kecil yang bermain seni dan kerajinan, akan mulai dengan kertas dan menggunakan kertas atau gunting baik secara acak, tetapi tidak akan menggunakan gunting setelah batu atau gunting karena dia perlu menggunakan gunting di atas kertas. Akan melempar batu kembali pada siapa pun yang melempar batu padanya.
sumber
Berikut tiga Bot yang saya buat untuk pengujian:
RandomBot
Serakah
Cukup pilih opsi yang paling banyak dimuatnya.
Antigreedy
Diasumsikan lawan akan bermain serakah dan memainkan alternatif yang menang.
sumber
Tidak lapar
Ini benar-benar kebalikan dari Greedy, ia memilih opsi poin terendah yang tersedia.
sumber
Gunakan Favorit Lawan
Untuk belokan pertama, pilih item acak. Untuk setiap belokan lainnya, gunakan pilihan lawan yang paling umum. Jika ada dasi, itu default ke pilihan paling umum paling awal.
// Aku mencuri kode dari sini
Menang itu Bagus
Mengembalikan pilihan pemenang babak sebelumnya. Jika ronde sebelumnya adalah seri, periksa ronde sebelumnya secara rekursif. Jika itu hanya ikatan, atau itu adalah babak pertama, mengembalikan pilihan acak.
sumber
Terbaik dari Kedua Dunia
Bot ini pada dasarnya menggabungkan Anti-Serakah dan Serakah (karenanya namanya).
sumber
find
untuk string.my_loaded
danopp_loaded
keduanya daftar.index
harus baik untuk apa yang Anda inginkan.NashBot
Secara acak memilih antara tiga opsi sedemikian rupa sehingga lawan secara statistik tidak memiliki preferensi antara gerakan berkaitan dengan berapa banyak skornya; dengan kata lain, Greedy dan Not Hungry harus memiliki skor rata-rata yang diharapkan yang sama dengannya.
sumber
Perkiraan waktu
Sunting: Peringkat yang Diperbarui
Ini adalah peringkat teratas baru setelah dimasukkannya Expectedbayes:
Penjelasan
(NB: pengajuan pos 05/06/2017)
Bot ini mencoba memaksimalkan nilai yang diharapkan dari langkah selanjutnya dengan:
Peluang diperbarui setiap sepuluh langkah. Jumlah gerakan terakhir yang digunakan untuk menghitung probabilitas telah ditetapkan ke 10 untuk setiap bot (jadi 20 fitur secara keseluruhan). Ini mungkin overfitting data, tetapi saya tidak mencoba untuk memeriksa lebih jauh.
Itu bergantung pada pustaka scikit untuk menghitung probabilitas gerakan lawan (saya katakan kalau-kalau saya salah membaca aturan dan itu sebenarnya tidak diizinkan).
Dengan mudah menang melawan bot yang selalu membuat pilihan yang sama. Anehnya, ini cukup efektif terhadap bot acak dengan tingkat kemenangan 93% (saya percaya ini karena fakta bahwa itu membatasi jumlah poin yang bisa didapatkan lawannya sambil memaksimalkan jumlah poin yang memungkinkan untuk setiap putaran).
Saya melakukan percobaan cepat dengan 100 putaran dan hanya sejumlah bot, dan inilah yang saya dapat dari result_standing:
Yang tidak seburuk itu!
sumber
Pengendara sepeda
0
sumber
Ansambel
Beberapa algoritma yang bersaing memberikan suara untuk solusi terbaik.
Menukar
Apakah langkah acak, tetapi tanpa mengulangi langkah terakhir itu.
sumber
blodsocer
socery
Saya memberikannya perbaikan, jadi mungkin seharusnya berfungsi sekarang saya harap
Saya mengacaukan sesuatu lagi sehingga saya menghapus dan membatalkan penghapusan. Saya membuat banyak kekacauan.
sumber
if opp_history[1] == "S": return "R" elif opp_history[1] == "R": return "R" else: return "P"
jenis socery apa ini?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]
tetapi terlihat di luar jangkauan (dan begitu juga garis selanjutnya).Acak tertimbang
Seperti RandomBot, tetapi hanya mengambil 2 untuk membuang setiap kali dipanggil. Terkadang akan mengalahkan Rockstar atau Assassin, tetapi akan memompa skor yang lain (misalnya, jika mengalahkan Rockstar, itu memberi Assassin poin peningkatan).
sumber
Psikolog serakah
Dinamakan demikian karena default untuk serakah, tetapi jika tidak bisa memutuskan, itu melawan apa pun yang lawan lakukan jika mereka menggunakan strategi serakah. Jika masih belum bisa memutuskan, ia pergi secara acak.
sumber