STATUS TANTANGAN: BUKA
Komentari, buka PR, atau berteriak pada saya jika saya kehilangan bot Anda.
Dilema tahanan ... dengan tiga pilihan. Gila, ya?
Inilah matriks hasil kami. Pemain A di sebelah kiri, B di atas
A,B| C | N | D
---|---|---|---
C |3,3|4,1|0,5
N |1,4|2,2|3,2
D |5,0|2,3|1,1
Matriks hasil direkayasa sehingga yang terbaik bagi kedua pemain untuk selalu bekerja sama, tetapi Anda bisa mendapatkan (biasanya) dengan memilih Netral atau Defection.
Inilah beberapa bot contoh (yang bersaing).
# turns out if you don't actually have to implement __init__(). TIL!
class AllC:
def round(self, _): return "C"
class AllN:
def round(self, _): return "N"
class AllD:
def round(self, _): return "D"
class RandomBot:
def round(self, _): return random.choice(["C", "N", "D"])
# Actually using an identically-behaving "FastGrudger".
class Grudger:
def __init__(self):
self.history = []
def round(self, last):
if(last):
self.history.append(last)
if(self.history.count("D") > 0):
return "D"
return "C"
class TitForTat:
def round(self, last):
if(last == "D"):
return "D"
return "C"
Bot Anda adalah kelas Python3. Sebuah instance baru dibuat untuk setiap pertandingan, dan round()
disebut setiap putaran, dengan pilihan lawan Anda dari babak terakhir (atau Tidak ada, jika itu babak pertama)
Ada hadiah 50 rep untuk pemenang dalam waktu sebulan.
Spesifik
- Setiap bot memainkan setiap bot lainnya (1v1), termasuk dirinya sendiri, dalam putaran [DIURANGI].
- Celah standar tidak diijinkan.
- Jangan main-main dengan apa pun di luar kelas Anda atau alasan buruk lainnya.
- Anda dapat mengirim hingga lima bot.
- Ya, Anda dapat menerapkan jabat tangan.
- Tanggapan selain
C
,N
atauD
akan diam-diam diambil sebagaiN
. - Setiap poin bot dari setiap pertandingan yang mereka mainkan akan dijumlahkan dan dibandingkan.
Pengendali
Bahasa lainnya
Saya akan mengumpulkan API jika ada yang membutuhkannya.
Skor: 2018-11-27
27 bots, 729 games.
name | avg. score/round
----------------|-------------------
PatternFinder | 3.152
DirichletDice2 | 3.019
EvaluaterBot | 2.971
Ensemble | 2.800
DirichletDice | 2.763
Shifting | 2.737
FastGrudger | 2.632
Nash2 | 2.574
HistoricAverage | 2.552
LastOptimalBot | 2.532
Number6 | 2.531
HandshakeBot | 2.458
OldTitForTat | 2.411
WeightedAverage | 2.403
TitForTat | 2.328
AllD | 2.272
Tetragram | 2.256
Nash | 2.193
Jade | 2.186
Useless | 2.140
RandomBot | 2.018
CopyCat | 1.902
TatForTit | 1.891
NeverCOOP | 1.710
AllC | 1.565
AllN | 1.446
Kevin | 1.322
king-of-the-hill
python
SIGSTACKFAULT
sumber
sumber
while len(botlist) > 1:
denganbotlist.remove(lowest_scoring_bot)
di bagian bawah loop, Anda mendapatkan turnamen eliminasi dengan hasil yang menarik.Jawaban:
EvaluaterBot
Menangkan semua bot yang sebelumnya dikirim kecuali (mungkin) bot acak (tetapi bot itu bisa memiliki keuntungan, karena mengambil D dalam hasil imbang dan D harus optimal) dan memainkan imbang konstan melawan diri mereka sendiri.
sumber
NashEquilibrium
Bot ini telah mengambil kelas teori permainan di perguruan tinggi tetapi malas dan tidak pergi ke kelas tempat mereka membahas permainan yang diulang. Jadi dia hanya memainkan game tunggal nash equilibrium campuran. Ternyata 1/5 2/5 2/5 adalah NE campuran untuk imbalan.
Constant Nash Penyalahgunaan Keseimbangan
Bot ini mengambil satu atau dua pelajaran dari saudaranya yang malas. Masalah saudara laki-lakinya yang malas adalah dia tidak memanfaatkan strategi tetap. Versi ini memeriksa apakah lawannya adalah pemain konstan atau titfortat dan bermain sesuai, selain itu ia memainkan keseimbangan nash biasa.
Satu-satunya downside adalah bahwa rata-rata 2,2 poin per giliran bermain melawan dirinya sendiri.
sumber
class NashEquilibrium: def round(self, _): a = random.random() for k, v in [(0.2, "C"), (0.6, "N"), (1, "D")]: if a <= k: return v
TatForTit
Bot ini akan bergantian memilih DNDN sementara TitForTat alternatif CDCD, untuk keuntungan bersih rata-rata 3 poin per putaran jika saya telah membaca matriks pembayaran dengan benar. Saya pikir ini mungkin optimal terhadap TitForTat. Jelas itu dapat ditingkatkan untuk mendeteksi lawan non-TFT dan mengadopsi strategi lain, tetapi saya hanya bertujuan untuk karunia asli.
sumber
PatternFinder
Bot ini mencari kejadian sebelumnya dari kondisi permainan terakhir untuk melihat bagaimana lawan merespons kejadian itu, dengan preferensi untuk pertandingan pola yang lebih lama dan pertandingan yang lebih baru, kemudian memainkan gerakan yang akan "mengalahkan" gerakan yang diprediksi lawan. Ada banyak ruang untuk menjadi lebih pintar dengan semua data yang dilacaknya, tetapi saya kehabisan waktu untuk mengerjakannya.
sumber
Giok
Mulailah dengan optimis, tetapi semakin pahit karena lawan tidak mau bekerja sama. Banyak konstanta ajaib yang mungkin bisa diubah, tetapi ini mungkin tidak cukup baik untuk membenarkan waktu.
sumber
Ansambel
Ini menjalankan ansambel model terkait. Masing-masing model mempertimbangkan jumlah riwayat yang berbeda, dan memiliki opsi untuk selalu memilih langkah yang akan mengoptimalkan perbedaan pembayaran yang diharapkan, atau akan secara acak memilih langkah dalam proporsi terhadap perbedaan pembayaran yang diharapkan.
Setiap anggota ensemble kemudian memberikan suara pada langkah yang mereka sukai. Mereka mendapatkan jumlah suara yang sama dengan berapa banyak yang telah mereka menangkan daripada lawan (yang berarti bahwa model yang buruk akan mendapatkan suara negatif). Langkah mana pun yang memenangkan suara kemudian dipilih.
(Mereka mungkin harus membagi suara mereka di antara gerakan sesuai dengan seberapa besar mereka menyukai masing-masing, tapi saya tidak cukup peduli untuk melakukan itu sekarang.)
Itu mengalahkan semua yang diposting sejauh ini kecuali EvaluaterBot dan PatternFinder. (Satu-satu, itu mengalahkan EvaluaterBot dan kehilangan ke PatternFinder).
Kerangka Uji
Jika ada orang lain yang merasakan manfaatnya, inilah kerangka uji coba untuk melihat pertarungan individu. Python2. Masukkan saja semua lawan yang Anda minati di dalam oposisi.py, dan ubah referensi ke Ensemble menjadi milik Anda.
sumber
OldTitForTat
Pemain sekolah lama terlalu malas untuk memperbarui aturan baru.
sumber
NeverCOOP
Jika bot lawan yang berlawanan cacat atau netral, pilih cacat. Kalau tidak, jika ini giliran pertama atau bot lawan bekerja sama, pilih netral. Saya tidak yakin seberapa bagus ini akan bekerja ...
sumber
if(last):
di bot Grudger Anda, mendeteksi apakah ada putaran sebelumnya.None in "ND"
kesalahan.if last and last in "ND":
terlalu rumit?LastOptimalBot
Diasumsikan bahwa bot lawan akan selalu memainkan gerakan yang sama lagi, dan memilih bot yang memiliki hasil terbaik melawannya.
Rata-rata:
sumber
return last
.return last
, LOB akan pergi 18-9 lebih dari 6 putaran daripada 13-10 lebih dari 5 putaran itu saat ini. Saya pikir tidak apa-apa - jangan khawatir tentang mengoptimalkan bot contoh.return last
akan menjadi T4T yang lebih baik untuk tantangan ini, saya pikirif(last): return last; else: return "C"
lebih buruk.Peniru
Menyalin gerakan terakhir lawan.
Saya tidak berharap ini bekerja dengan baik, tetapi belum ada yang mengimplementasikan klasik ini.
sumber
Peningkatan Dirichlet Dice
Ini adalah versi yang lebih baik dari Dirichlet Dice. Alih-alih mengambil distribusi multinomial yang diharapkan dari distribusi Dirichlet, ia mengambil distribusi Multinomial secara acak dari distribusi Dirichlet. Kemudian, alih-alih menggambar dari Multinomial dan memberikan respons optimal untuk itu, itu memberikan respons yang diharapkan optimal untuk Multinomial yang diberikan menggunakan titik-titik. Jadi keacakan pada dasarnya telah bergeser dari undian Multinomial ke undian Dirichlet. Juga, prior sekarang lebih datar, untuk mendorong eksplorasi.
Ini "ditingkatkan" karena sekarang memperhitungkan sistem poin dengan memberikan nilai terbaik yang diharapkan terhadap probabilitas, sambil mempertahankan keacakannya dengan menggambar probabilitas itu sendiri. Sebelumnya, saya mencoba melakukan hasil terbaik yang diharapkan dari probabilitas yang diharapkan, tetapi itu sangat buruk karena macet, dan tidak cukup mengeksplorasi untuk memperbarui dadu. Juga lebih mudah diprediksi dan dieksploitasi.
Pengajuan asli:
Dadu Dirichlet
Pada dasarnya saya berasumsi bahwa respons lawan terhadap output terakhir saya adalah variabel multinomial (dadu berbobot), satu untuk setiap output saya, jadi ada dadu untuk "C", satu untuk "N", dan satu untuk "D" . Jadi jika gulungan terakhir saya, misalnya, "N" maka saya melempar "N-dadu" untuk menebak apa tanggapan mereka terhadap "N" saya. Saya mulai dengan Dirichlet sebelum yang mengasumsikan bahwa lawan saya agak "pintar" (lebih cenderung memainkan yang dengan hasil terbaik melawan daftar terakhir saya, paling tidak bermain dengan yang dengan hasil terburuk). Saya menghasilkan distribusi Multinomial "yang diharapkan" dari Dirichlet yang sesuai sebelumnya (ini adalah nilai yang diharapkan dari distribusi probabilitas di atas bobot dadu mereka). Saya melempar dadu berbobot dari hasil terakhir saya,
Mulai di babak ketiga, saya melakukan pembaruan Bayesian tentang Dirichlet yang sesuai sebelum tanggapan terakhir lawan saya untuk hal yang saya mainkan dua putaran lalu. Saya mencoba secara iteratif mempelajari bobot dadu mereka.
Saya bisa saja memilih respons dengan hasil "terbaik" yang diharapkan setelah membuat dadu, daripada hanya menggulirkan dadu dan merespons hasilnya. Namun, saya ingin menjaga keacakan, sehingga bot saya kurang rentan terhadap yang mencoba memprediksi suatu pola.
sumber
Kevin
Pilihan pilihan terburuk. Bot terburuk dibuat.
Tak berguna
Itu terlihat pada dua gerakan terakhir yang dilakukan oleh lawan dan mengambil yang paling tidak dilakukan selain itu mengambil sesuatu secara acak. Mungkin ada cara yang lebih baik untuk melakukan ini.
sumber
Rata-rata Bersejarah
Lihatlah sejarah dan temukan tindakan yang seharusnya menjadi yang terbaik. Mulai kooperatif.
sumber
Rata-rata tertimbang
Perilaku lawan dimodelkan sebagai segitiga siku-siku dengan sudut untuk CND masing-masing sebesar 0,0 0,1 1,0. Setiap gerakan lawan menggeser titik di dalam segitiga itu ke sudut itu, dan kami bermain untuk mengalahkan langkah yang ditunjukkan oleh titik tersebut (dengan C diberi irisan kecil segitiga yang dapat disesuaikan). Secara teori saya ingin ini memiliki memori yang lebih panjang dengan bobot lebih untuk pergerakan sebelumnya, tetapi dalam praktiknya meta saat ini lebih menyukai bot yang berubah dengan cepat, jadi ini berubah menjadi perkiraan LastOptimalBot terhadap sebagian besar musuh. Posting untuk anak cucu; mungkin seseorang akan terinspirasi.
sumber
Tetragram
Cobalah untuk menemukan pola dalam gerakan lawan, dengan asumsi mereka juga mengawasi langkah terakhir kami.
sumber
Jabatan tangan
Mengakui saat bermain melawan dirinya sendiri, lalu bekerja sama. Kalau tidak, meniru LastOptimalBot yang tampaknya seperti strategi satu baris terbaik. Berkinerja lebih buruk daripada LastOptimalBot, dengan jumlah yang berbanding terbalik dengan jumlah putaran. Jelas akan lebih baik jika ada lebih banyak salinan di bidang * batuk ** wink *.
sumber
ShiftingOptimalBot
Bot ini menggunakan algoritma LastOptimalBot selama itu menang. Namun, jika bot lain mulai memprediksikannya, ia akan mulai memainkan gerakan yang dimainkan lawannya yang terakhir (yang merupakan langkah yang mengalahkan langkah yang akan mengalahkan LastOptimalBot). Itu siklus melalui transposisi sederhana dari algoritma tersebut selama itu terus hilang (atau ketika bosan dengan menggambar banyak).
Jujur, saya terkejut bahwa LastOptimalBot duduk di posisi ke 5 saat saya memposting ini. Saya cukup yakin ini akan lebih baik, dengan asumsi saya menulis python ini dengan benar.
sumber
HandshakePatternMatch
Mengapa pola cocok dengan diri Anda sendiri? Berjabat tangan dan bekerja sama.
sumber
import PatternFinder
curang di buku saya.Hardcoded
Putar saja urutan gerakan yang dioptimalkan untuk mengalahkan beberapa bot deterministik teratas.
sumber