Tạo một bot để chọn số duy nhất nhỏ nhất.
(Dựa trên một thí nghiệm tâm lý học mà tôi đã nghe về nhiều năm trước nhưng không thể theo dõi lại được.)
Quy tắc
- Mỗi trò chơi sẽ bao gồm 10 bot được chọn ngẫu nhiên chơi 1000 vòng.
- Mỗi vòng, tất cả các bot chọn một số nguyên từ 1 đến 10 (đã bao gồm). Bất kỳ bot nào chọn cùng một giá trị sẽ bị loại trừ và bot còn lại có giá trị nhỏ nhất sẽ nhận được điểm.
- Trong trường hợp không có bot chọn một giá trị duy nhất, sẽ không có điểm nào được trao.
- Kết thúc 1000 vòng, bot có nhiều điểm nhất (hoặc tất cả các bot được gắn nhiều điểm nhất) sẽ thắng trò chơi.
- Giải đấu sẽ kéo dài 200 * (số lượng người chơi) trò chơi.
- Bot có tỷ lệ thắng cao nhất sẽ thắng giải đấu.
Thông số kỹ thuật
Bots phải là lớp Python 3 và phải thực hiện hai phương thức: select
và update
.
Bots sẽ được xây dựng với một chỉ mục.
select
được thông qua không có đối số và trả về lựa chọn của bot cho vòng hiện tại.
update
được thông qua một danh sách các lựa chọn được thực hiện bởi mỗi bot trong vòng trước.
Thí dụ
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
Bộ điều khiển
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]))
Thông tin thêm
- Không có bot sẽ chơi trong một trò chơi chống lại chính nó.
- Trong trường hợp không thể có bot được bao gồm trong ít hơn 100 trò chơi, giải đấu sẽ được chạy lại.
- Bots có thể lưu trữ trạng thái giữa các vòng, nhưng không phải giữa các trò chơi.
- Truy cập bộ điều khiển hoặc các bot khác không được phép.
- Số lượng trò chơi và số vòng cho mỗi trò chơi có thể tăng nếu kết quả quá thay đổi.
- Bất kỳ bot nào gây ra lỗi hoặc đưa ra phản hồi không hợp lệ (không phải int, giá trị bên ngoài [1, 10], v.v.) sẽ bị loại và giải đấu sẽ được chạy lại mà không có chúng.
- Không có giới hạn thời gian cho các vòng, nhưng tôi có thể thực hiện một vòng nếu các bot mất quá nhiều thời gian để suy nghĩ.
- Không có giới hạn về số lượng gửi cho mỗi người dùng.
Hạn chót để gửi là 23:59:59 UTC vào thứ Sáu, ngày 28 tháng 9.Giải đấu hiện đã đóng cửa để gửi.
Các kết quả
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)