Crea un bot per scegliere il numero univoco più piccolo.
(Basato su un esperimento di psicologia che ho sentito molti anni fa ma non sono stato in grado di rintracciare di nuovo.)
Regole
- Ogni gioco sarà composto da 10 robot selezionati casualmente che giocano 1000 round.
- Ad ogni round, tutti i robot selezionano un numero intero compreso tra 1 e 10 (incluso). Tutti i bot che scelgono lo stesso valore verranno esclusi e il bot rimanente con il valore più piccolo riceverà un punto.
- Nel caso in cui nessun bot scelga un valore unico, non verranno assegnati punti.
- Alla fine dei 1000 round, il bot con il maggior numero di punti (o tutti i robot con il maggior numero di punti) vince la partita.
- Il torneo durerà 200 * (numero di giocatori) partite.
- Il bot con la percentuale di vincita più alta vince il torneo.
specificazioni
I bot devono essere classi Python 3 e devono implementare due metodi: select
e update
.
I robot saranno costruiti con un indice.
select
non viene passato alcun argomento e restituisce la scelta del bot per il round corrente.
update
viene passato un elenco delle scelte fatte da ciascun bot nel round precedente.
Esempio
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
controllore
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]))
Informazioni aggiuntive
- Nessun bot giocherà in una partita contro se stesso.
- Nel caso improbabile che un bot sia incluso in meno di 100 partite, il torneo verrà rieseguito.
- I robot possono memorizzare lo stato tra i round, ma non tra i giochi.
- Non è consentito l'accesso al controller o ad altri robot.
- Il numero di partite e il numero di round per partita sono soggetti ad aumento se i risultati sono troppo variabili.
- Qualsiasi bot che genera errori o fornisce risposte non valide (non-ints, valori al di fuori di [1, 10], ecc.) Verrà squalificato e il torneo verrà rieseguito senza di essi.
- Non ci sono limiti di tempo per i round, ma potrei implementarne uno se i robot impiegano troppo tempo a pensare.
- Non vi è alcun limite al numero di invii per utente.
La scadenza per l'invio delle candidature è alle 23:59:59 UTC di venerdì 28 settembre.Il torneo è ora chiuso per le iscrizioni.
risultati
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)