सबसे छोटी अद्वितीय संख्या चुनने के लिए एक बॉट बनाएं।
(एक मनोविज्ञान प्रयोग के आधार पर मैंने कई साल पहले सुना था लेकिन फिर से ट्रैक नहीं कर पाया।)
नियम
- प्रत्येक गेम में 1000 राउंड खेलने वाले 10 बेतरतीब ढंग से चयनित बॉट शामिल होंगे।
- प्रत्येक दौर, सभी बॉट 1 से 10 (समावेशी) से पूर्णांक का चयन करते हैं। समान मूल्य चुनने वाले किसी भी बॉट को बाहर रखा जाएगा, और सबसे छोटे मूल्य वाले शेष बॉट को एक बिंदु प्राप्त होगा।
- इस घटना में कि कोई बॉट अद्वितीय मूल्य नहीं उठाता है, कोई अंक नहीं दिया जाएगा।
- 1000 राउंड के अंत में, सबसे अधिक अंक (या सभी बिंदुओं से बंधे सभी बॉट) वाले बॉट गेम जीतते हैं।
- टूर्नामेंट 200 * (खिलाड़ियों की संख्या) खेलों में चलेगा।
- सबसे अधिक जीत प्रतिशत वाला बॉट टूर्नामेंट जीतता है।
विशेष विवरण
बॉट्स को पायथन 3 वर्ग होना चाहिए और दो तरीकों को लागू करना चाहिए: selectऔर update।
एक इंडेक्स के साथ बॉट्स का निर्माण किया जाएगा।
selectकोई तर्क नहीं दिया गया है और मौजूदा दौर के लिए बॉट की पसंद को लौटाता है।
updateपिछले दौर में प्रत्येक बॉट द्वारा किए गए विकल्पों की एक सूची दी गई है।
उदाहरण
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
नियंत्रक
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]))
अतिरिक्त जानकारी
- कोई भी बॉट अपने खिलाफ खेल में नहीं खेलेगा।
- इस घटना की संभावना नहीं है कि एक बॉट 100 से कम खेलों में शामिल है, टूर्नामेंट फिर से खेला जाएगा।
- बॉट्स राउंड के बीच स्टेट स्टोर कर सकते हैं, लेकिन गेम्स के बीच नहीं।
- नियंत्रक या अन्य बॉट्स तक पहुंचने की अनुमति नहीं है।
- यदि परिणाम बहुत अधिक परिवर्तनशील हैं तो गेम की संख्या और प्रति गेम राउंड की संख्या बढ़ सकती है।
- कोई भी बॉट जो त्रुटियां उठाता है या अमान्य प्रतिक्रियाएं देता है (गैर-इन्ट्स, [1, 10], इत्यादि के बाहर के मान)) को अयोग्य घोषित किया जाएगा, और टूर्नामेंट उनके बिना फिर से शुरू हो जाएगा।
- राउंड के लिए कोई समय सीमा नहीं है, लेकिन मैं एक को लागू कर सकता हूं यदि बॉट्स को सोचने में बहुत लंबा समय लगता है।
- प्रति उपयोगकर्ता सबमिशन की संख्या पर कोई सीमा नहीं है।
सबमिशन की समय सीमा शुक्रवार, 28 सितंबर को 23:59:59 यूटीसी है। टूर्नामेंट अब सबमिशन के लिए बंद है।
परिणाम
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)