Buat bot untuk memilih nomor unik terkecil.
(Berdasarkan percobaan psikologi yang saya dengar bertahun-tahun yang lalu tetapi belum dapat melacak lagi.)
Aturan
- Setiap permainan akan terdiri dari 10 bot yang dipilih secara acak, bermain 1000 putaran.
- Setiap putaran, semua bot memilih bilangan bulat dari 1 hingga 10 (termasuk). Setiap bot yang memilih nilai yang sama akan dikeluarkan, dan bot yang tersisa dengan nilai terkecil akan menerima poin.
- Jika tidak ada bot yang mengambil nilai unik, tidak ada poin yang akan diberikan.
- Pada akhir 1000 putaran, bot dengan poin terbanyak (atau semua bot yang terikat dengan poin terbanyak) memenangkan permainan.
- Turnamen ini akan berlangsung 200 * (jumlah pemain) permainan.
- Bot dengan persentase kemenangan tertinggi memenangkan turnamen.
Spesifikasi
Bot harus kelas Python 3 dan harus menerapkan dua metode: select
dan update
.
Bot akan dibangun dengan indeks.
select
dilewatkan tanpa argumen dan mengembalikan pilihan bot untuk putaran saat ini.
update
disahkan daftar pilihan yang dibuat oleh masing-masing bot di babak sebelumnya.
Contoh
class Lowball(object):
def __init__(self, index):
# Initial setup happens here.
self.index = index
def select(self):
# Decision-making happens here.
return 1
def update(self, choices):
# Learning about opponents happens here.
# Note that choices[self.index] will be this bot's choice.
pass
Pengendali
import numpy as np
from bots import allBotConstructors
allIndices = range(len(allBotConstructors))
games = {i: 0 for i in allIndices}
wins = {i: 0 for i in allIndices}
for _ in range(200 * len(allBotConstructors)):
# Choose players.
playerIndices = np.random.choice(allIndices, 10, replace=False)
players = [allBotConstructors[j](i) for i, j in enumerate(playerIndices)]
scores = [0] * 10
for _ in range(1000):
# Let everyone choose a value.
choices = [bot.select() for bot in players]
for bot in players:
bot.update(choices[:])
# Find who picked the best.
unique = [x for x in choices if choices.count(x) == 1]
if unique:
scores[choices.index(min(unique))] += 1
# Update stats.
for i in playerIndices:
games[i] += 1
bestScore = max(scores)
for i, s in enumerate(scores):
if s == bestScore:
wins[playerIndices[i]] += 1
winRates = {i: wins[i] / games[i] for i in allIndices}
for i in sorted(winRates, key=lambda i: winRates[i], reverse=True):
print('{:>40}: {:.4f} ({}/{})'.format(allBotConstructors[i], winRates[i], wins[i], games[i]))
Informasi tambahan
- Bot tidak akan bermain dalam pertandingan melawan dirinya sendiri.
- Jika bot tidak termasuk dalam kurang dari 100 pertandingan, turnamen akan dijalankan kembali.
- Bot dapat menyimpan status di antara ronde, tetapi tidak di antara gim.
- Mengakses pengontrol atau bot lain tidak diperbolehkan.
- Jumlah game dan jumlah putaran per game dapat meningkat jika hasilnya terlalu bervariasi.
- Setiap bot yang menimbulkan kesalahan atau memberikan respons yang tidak valid (non-int, nilai di luar [1, 10], dll.) Akan didiskualifikasi, dan turnamen akan dijalankan kembali tanpa mereka.
- Tidak ada batasan waktu untuk putaran, tapi saya bisa menerapkannya jika bot terlalu lama untuk berpikir.
- Tidak ada batasan jumlah pengiriman per pengguna.
Batas waktu pengiriman adalah 23:59:59 UTC pada hari Jumat, 28 September.Turnamen ini sekarang ditutup untuk pengiriman.
Hasil
BayesBot: 0.3998 (796/1991)
WhoopDiScoopDiPoop: 0.3913 (752/1922)
PoopDiScoopty: 0.3216 (649/2018)
Water: 0.3213 (660/2054)
Lowball: 0.2743 (564/2056)
Saboteur: 0.2730 (553/2026)
OneUpper: 0.2640 (532/2015)
StupidGreedyOne: 0.2610 (516/1977)
SecondSaboteur: 0.2492 (492/1974)
T42T: 0.2407 (488/2027)
T4T: 0.2368 (476/2010)
OpportunityBot: 0.2322 (454/1955)
TheGeneral: 0.1932 (374/1936)
FindRepeats: 0.1433 (280/1954)
MinWin: 0.1398 (283/2025)
LazyStalker: 0.1130 (226/2000)
FollowBot: 0.1112 (229/2060)
Assassin: 0.1096 (219/1999)
MostlyAverage: 0.0958 (194/2024)
UnchosenBot: 0.0890 (174/1955)
Raccoon: 0.0868 (175/2015)
Equalizer: 0.0831 (166/1997)
AvoidConstantBots: 0.0798 (158/1980)
WeightedPreviousUnchosen: 0.0599 (122/2038)
BitterBot: 0.0581 (116/1996)
Profiteur: 0.0564 (114/2023)
HistoryBot: 0.0425 (84/1978)
ThreeFourSix: 0.0328 (65/1984)
Stalker: 0.0306 (61/1994)
Psychadelic: 0.0278 (54/1943)
Unpopulist: 0.0186 (37/1994)
PoissonsBot: 0.0177 (35/1978)
RaccoonTriangle: 0.0168 (33/1964)
LowHalfRNG: 0.0134 (27/2022)
VictoryPM1: 0.0109 (22/2016)
TimeWeighted: 0.0079 (16/2021)
TotallyLost: 0.0077 (15/1945)
OneTrackMind: 0.0065 (13/1985)
LuckySeven: 0.0053 (11/2063)
FinalCountdown: 0.0045 (9/2000)
Triangle: 0.0039 (8/2052)
LeastFrequent: 0.0019 (4/2067)
Fountain: 0.0015 (3/1951)
PlayerCycle: 0.0015 (3/1995)
Cycler: 0.0010 (2/1986)
SecureRNG: 0.0010 (2/2032)
SneakyNiner: 0.0005 (1/2030)
I_Like_Nines: 0.0000 (0/1973)
bots.py
di direktori yang sama yang berisi semua bot. Pada akhirnya, buat daftar konstruktor:allBotConstructors = [Lowball, BayesBot, ...]
Jawaban:
BayesBot
Berusaha membuat pilihan optimal menggunakan model statistik sederhana.
sumber
Hindari Bot Konstan
Catat bot mana yang selalu mengembalikan nilai yang sama, dan lewati nilai-nilai itu. Dari nilai yang tersisa, pilih secara acak, tetapi bias secara signifikan terhadap nilai yang lebih rendah.
sumber
WaitWhatBot
Bukan bot yang paling kompetitif dan jelas bukan GTO , tetapi akan menghambat skor setiap lawan "selalu 1" atau "hampir selalu 1" dalam permainan yang sama seperti dalam skenario seperti itu WaitWhatBot menjadi bot seperti itu juga.
Menggunakan probabilitas yang berkembang dengan bobot tertimbang baik dalam waktu (lebih baru - lebih besar -) dan nilai pilihan (titik lebih rendah -> bobot lebih besar).
Menggunakan kode yang agak dikaburkan untuk sedikit tawa.
sumber
Penguntit
Di awal permainan, bot ini secara acak memilih indeks tertentu sebagai targetnya. Itu kemudian menguntit yang menargetkan seluruh permainan, menyalin nomor yang dipilihnya di babak sebelumnya.
sumber
Bodoh Satu Serakah
Bot ini mengasumsikan bahwa bot lain tidak ingin mengikat.
Saya menyadari ini sama dengan contoh yang diberikan tetapi saya memiliki pemikiran sebelum saya membaca sejauh itu. Jika ini tidak sesuai dengan bagaimana tantangan KoTH dijalankan, beri tahu saya.
sumber
self.index
.HistoryBot
Implementasi dari komentar user2390246:
sumber
OneUpper
Bot orang lain bertujuan untuk 1 atau acak, jadi mengapa tidak membidik 2 saja?
sumber
Mengalir Seperti Air
Menghindari algoritma deteksi bot konstan dasar dengan menggandakan pada setiap nomor, perlahan-lahan maju menuju nilai yang lebih rendah jika tidak dihuni.
sumber
Benar-benar hilang
sumber
Hasil akhir
Cobalah online!
Mengembalikan 10 untuk 100 ronde pertama, 9 untuk 100 ronde berikutnya dan seterusnya.
sumber
Peluangbot
Bot ini melacak nomor terendah yang tidak dipilih oleh bot lain setiap putaran (jumlah terendah yang tersedia, atau peluang), dan memainkan nomor yang paling sering nomor itu.
sumber
PatterMatcher
Mencari bagian berulang dalam pengiriman bot, mencoba untuk memprediksi dan menghindari angka di sana.
Segi tiga
Peluang memilih n adalah
(10-n)/45
Waktu berat
Probabilitas bot memilih nomor sebanding dengan
(10-n)*Δt
. Babak pertama ini identik dengan segitiga.LeastFrequent
Menyerahkan nomor yang paling jarang terjadi, jika mereka sama, ambil yang terendah
Waktu terlama
Sama seperti dengan frekuensi tetapi dengan waktu terlama di antara pengiriman.
Penyabot
Menyerahkan angka terendah yang telah dikirimkan terakhir kali.
SecondSaboteur
Menyerahkan angka terendah kedua yang diajukan terakhir kali
Profiteur
Mengirimkan angka terendah yang tidak dikirimkan terakhir kali
Maaf saya agak terbawa suasana, mendapatkan ide untuk bot baru sambil menerapkan sebelumnya. Saya tidak yakin mana yang akan menjadi yang terbaik dan saya ingin tahu tentang kinerja masing-masing. Anda dapat menemukannya di sini: https://repl.it/@Fejfo/Lowest-Unique-Number
sumber
set(range(10)
.50% bot RNG teratas
Saya hendak memposting bot acak, tetapi hidefromkgb diposting sebelum saya (dengan memposting mereka menjadikan diri mereka target empuk KGB, bukan cara yang baik untuk menyembunyikan). Ini adalah jawaban KOTH pertamaku, hanya berharap bisa mengalahkan bot rng.
sumber
Pengendara sepeda
Bot ini cukup menggilir setiap angka pada putarannya. Hanya untuk bersenang-senang, ini menginisialisasi penghitung dengan indeksnya.
sumber
OneTrackMind
Bot ini secara acak memilih nomor dan tetap menggunakannya selama 50 putaran, lalu memilih yang lain dan mengulanginya.
sumber
Lucky Seven
Saya merasa beruntung hari ini! Saya membuang semuanya pada 7!
sumber
Ide saya adalah bahwa strategi lebih tergantung pada jumlah bot daripada pada evaluasi strategi yang sebenarnya.
Dengan sejumlah besar bot, opsinya adalah:
Robot "serakah" yang mengarah ke angka 1-3 yang lebih rendah 10 bot menjadi "pintar" dan bertujuan untuk mendapatkan angka 1-3 yang lebih rendah, yang terbaik adalah membiarkan bot itu mengganggu mereka.
Robot "pintar" yang, begitu mereka sadari 4 selalu diangkat, akan pergi ke tempat lain.
Robot "Acak" dan "konstan". Tidak banyak yang bisa dilakukan di sini.
Jadi, saya bertaruh di # 4.
sumber
Bot RNG esensial
sumber
Pembunuh
Tetap dalam bayangan, kemudian bertujuan untuk tebakan terendah saat ini. Menjalankan.
sumber
FollowBot
Salin pemenang dari babak terakhir, atau setidaknya pilihan terikat minimal terbaik jika tidak ada pemenang.
sumber
Psikadelik
Satu-satunya cara untuk memenangkan perang nuklir adalah membuat diri Anda gila. Jadi saya akan membuat setiap bot prediksi di turnamen menjadi gila.
sumber
UnchosenBot
Mengambil pilihan babak terakhir, dan memilih nomor yang belum dipilih yang terendah (mengabaikan pilihan UnchosenBot, tentu saja).
sumber
Whoop-di-scoop-di-poop
Kotoran-di-scoopty
Saya tidak pernah melihat atau menyentuh Python, apakah ini unpythonic?
sumber
<!-- language: lang-python -->
sebelum blok kode untuk mengaktifkan penyorotan sintakspython
tag pada pertanyaan dan berpikir itu akan otomatis tetapi saya menulis sesuatu yang buruk.others = [c for i, c in enumerate(choices) if i != self.index]
, atau, karena selanjutnya Anda hanya menggunakan variabel itu untuk tes keanggotaan,{ }
daripada[ ]
membangun sebuahset
daripada sebuahlist
.if (self.guess)
juga sangat unpythonic.self.guess
masuk ke sana! Pasti salah satu pembuat format.Air mancur
Bot sederhana, mengambil nomor terendah terlebih dahulu dan jika ada bot lain yang memilihnya, bot itu akan menambah penghitung - lantainya diisi dan air mengalir ke bawah. Ketika mencapai 11, itu restart ke 1 - air dipompa kembali ke atas.
sumber
target
ke 10?PoissonsBot
Pilih angka dari distribusi Poisson yang bias ke nilai yang lebih rendah. Sesuaikan parameter rata-rata distribusi ke atas jika kita berada dalam ikatan dan turun jika ada tebakan di bawah kita. Ukuran langkah semakin kecil secara progresif saat permainan berlangsung.
sumber
MinWin
Menyimpan hitungan berjalan dari nilai yang menang dan nilai minimum yang tidak dipilih (di mana nilai minimum yang tidak dipilih hanya dipertimbangkan jika kurang dari nilai yang menang). Ini secara acak memilih di antara nilai-nilai menang dan minimum ini.
sumber
PlayerCycle
Siklus melalui para pemain. Pilihan pemain saat ini (bisa mandiri) sekarang menjadi pilihan bot ini. Mulai mencetak 8, karena mengapa tidak. Maaf saya tidak bisa python, ini mungkin kode yang buruk.
Sunting: Terima kasih kepada Triggernometry untuk meningkatkan kode saya dengan itertools
sumber
Rakun
Pilih angka terendah yang tidak dipilih di babak sebelumnya, kecuali pilihan kita sebelumnya, yang bisa dipilih lagi kali ini. Di babak pertama, pilih 1. (Diberikan 9 lawan dan 10 pilihan, dijamin ada satu nilai yang tersedia.)
Saya datang dengan ini secara independen, tetapi sekarang melihat setidaknya 2 bot sebelumnya yang pada dasarnya sama.
Segitiga Rakun
Menggabungkan Raccoon dan Triangle: dari nilai yang tidak dipilih, pilih satu berdasarkan probabilitas segitiga terbalik.
sumber
AttributeError: 'RaccoonTriangle' object has no attribute 'boundaries'
Umum
General selalu berjuang perang terakhir (s) .
sumber
Tanpa-Ulangi Acak
Bot memilih secara acak, tetapi menghindari memilih nomor yang sama dengan yang dilakukan pada putaran sebelumnya.
sumber