Endergebnis
Der Wettbewerb ist vorbei. Glückwunsch an hard_coded
!
Einige interessante Fakten:
In 31600 von 40920 Auktionen (77,2%) hat der Gewinner der ersten Runde die meisten Runden in dieser Auktion gewonnen.
Wenn Beispiel-Bots in den Wettbewerb aufgenommen werden, ändern sich die ersten neun Plätze nicht
AverageMine
undheurist
tauschen ihre Positionen.Top 10 Ergebnisse einer Auktion:
[2, 2, 3, 3] 16637
[0, 3, 3, 4] 7186
[1, 3, 3, 3] 6217
[1, 2, 3, 4] 4561
[0, 1, 4, 5] 1148
[0, 2, 4, 4] 1111
[2, 2, 2, 4] 765
[0, 2, 3, 5] 593
[1, 1, 4, 4] 471
[0, 0, 5, 5] 462
Tie Zahl (Anzahl der Auktionen , dass der i-ten Runde hatte keinen Sieger):
[719, 126, 25, 36, 15, 58, 10, 7, 19, 38]
.Durchschnittliches Höchstgebot des i-ten Runde:
[449.4, 855.6, 1100.8, 1166.8, 1290.6, 1386.3, 1500.2, 1526.5, 1639.3, 3227.1]
.
Anzeigetafel
Bot count: 33
hard_coded Score: 16141 Total: 20075170
eenie_meanie_more Score: 15633 Total: 18513346
minus_one Score: 15288 Total: 19862540
AverageMine Score: 15287 Total: 19389331
heurist Score: 15270 Total: 19442892
blacklist_mod Score: 15199 Total: 19572326
Swapper Score: 15155 Total: 19730832
Almost_All_In Score: 15001 Total: 19731428
HighHorse Score: 14976 Total: 19740760
bid_higher Score: 14950 Total: 18545549
Graylist Score: 14936 Total: 17823051
above_average Score: 14936 Total: 19712477
below_average Score: 14813 Total: 19819816
Wingman_1 Score: 14456 Total: 18480040
wingman_2 Score: 14047 Total: 18482699
simple_bot Score: 13855 Total: 20935527
I_Dont_Even Score: 13505 Total: 20062500
AntiMaxer Score: 13260 Total: 16528523
Showoff Score: 13208 Total: 20941233
average_joe Score: 13066 Total: 18712157
BeatTheWinner Score: 12991 Total: 15859037
escalating Score: 12914 Total: 18832696
one_upper Score: 12618 Total: 18613875
half_in Score: 12605 Total: 19592760
distributer Score: 12581 Total: 18680641
copycat_or_sad Score: 11573 Total: 19026290
slow_starter Score: 11132 Total: 20458100
meanie Score: 10559 Total: 12185779
FiveFiveFive Score: 7110 Total: 24144915
patient_bot Score: 7088 Total: 22967773
forgetful_bot Score: 2943 Total: 1471500
bob_hater Score: 650 Total: 1300
one_dollar_bob Score: 401 Total: 401
In diesem Spiel simulieren wir eine Auktion mit Siegelgebot.
Jede Auktion ist ein 4-Spieler-Spiel, das aus 10 Runden besteht. Anfangs haben die Spieler kein Geld. Zu Beginn jeder Runde erhält jeder Spieler 500 US-Dollar und macht dann seine eigenen Gebote. Das Gebot kann eine nicht negative ganze Zahl sein, die kleiner oder gleich dem Betrag ist, den sie haben. Gewöhnlich gewinnt einer, der das höchste Gebot abgibt, die Runde. Wenn jedoch mehrere Spieler den gleichen Preis bieten, wird ihr Gebot nicht berücksichtigt (daher kann die Runde nicht gewonnen werden), um die Sache interessanter zu machen. Wenn zum Beispiel vier Spieler 400 400 300 200 bieten, gewinnt der eine 300; Wenn sie 400 400 300 300 bieten, gewinnt niemand. Der Gewinner muss bezahlen, was er geboten hat.
Da es sich um eine Auktion mit versiegeltem Gebot handelt, ist die einzige Information, die der Spieler über das Bieten erhält, der Gewinner und wie viel er zu Beginn der nächsten Runde gezahlt hat (damit der Spieler wissen kann, wie viel jeder hat).
Wertung
Für jede mögliche 4-Spieler-Kombination findet eine Auktion statt. Das heißt, wenn es insgesamt N Bots gibt, wird es eine N C 4 Auktion geben. Der Bot, der die meisten Runden gewinnt, ist der endgültige Gewinner. Bei einem Gleichstand gewinnt der Bot, der insgesamt am wenigsten bezahlt hat. Wenn es wie beim Bieten immer noch ein Unentschieden gibt, werden diese Unentschieden entfernt.
Codierung
Sie sollten eine Python 3- Klasse mit einer Member-Funktion implementieren play_round
(und __init__
bei Bedarf mit anderen). play_round
sollte 3 Argumente nehmen (einschließlich Selbst). Das zweite und dritte Argument lauten in der Reihenfolge: die ID des Gewinners der vorherigen Runde, gefolgt von der Höhe der Auszahlung. Wenn niemand gewinnt oder es die erste Runde ist, sind beide -1. Ihre ID ist immer 0, und ID 1–3 sind die anderen Spieler in einer Reihenfolge, die nur durch die Position in diesem Beitrag bestimmt wird.
Zusätzliche Regeln
1. Deterministisch:
Das Verhalten Ihrer Funktion sollte nur von den Eingabeargumenten innerhalb einer Auktion abhängen. Das heißt, Sie können nicht auf Dateien, Zeit, globale Variablen oder irgendetwas zugreifen, das Zustände zwischen verschiedenen Auktionen oder Bots speichert . Wenn Sie einen Pseudozufallsgenerator verwenden möchten, ist es besser, ihn selbst zu schreiben (um zu verhindern, dass die Programme anderer wie random
in Python lib beeinflusst werden) und ihn mit einem festen Startwert in __init__
oder in der ersten Runde zurückzusetzen.
2. Drei Bots pro Person: Sie dürfen höchstens drei Bots einsenden, damit Sie eine Strategie entwickeln können, mit der Ihre Bots auf irgendeine Weise "kooperieren".
3. Nicht zu langsam: Da es viele Auktionen geben wird, stellen Sie sicher, dass Ihre Bots nicht zu langsam laufen. Ihre Bots sollten in der Lage sein, mindestens 1.000 Auktionen in einer Sekunde abzuschließen.
Regler
Hier ist der Controller, den ich verwende. Alle Bots werden importiert und bot_list
in der Reihenfolge in diesem Beitrag hinzugefügt .
# from some_bots import some_bots
bot_list = [
#one_bot, another_bot,
]
import hashlib
def decide_order(ls):
hash = int(hashlib.sha1(str(ls).encode()).hexdigest(), 16) % 24
nls = []
for i in range(4, 0, -1):
nls.append(ls[hash % i])
del ls[hash % i]
hash //= i
return nls
N = len(bot_list)
score = [0] * N
total = [0] * N
def auction(ls):
global score, total
pl = decide_order(sorted(ls))
bots = [bot_list[i]() for i in pl]
dollar = [0] * 4
prev_win, prev_bid = -1, -1
for rounds in range(10):
bids = []
for i in range(4): dollar[i] += 500
for i in range(4):
tmp_win = prev_win
if prev_win == i: tmp_win = 0
elif prev_win != -1 and prev_win < i: tmp_win += 1
bid = int(bots[i].play_round(tmp_win, prev_bid))
if bid < 0 or bid > dollar[i]: raise ValueError(pl[i])
bids.append((bid, i))
bids.sort(reverse = True)
winner = 0
if bids[0][0] == bids[1][0]:
if bids[2][0] == bids[3][0]: winner = -1
elif bids[1][0] == bids[2][0]: winner = 3
else: winner = 2
if winner == -1:
prev_win, prev_bid = -1, -1
else:
prev_bid, prev_win = bids[winner]
score[pl[prev_win]] += 1
total[pl[prev_win]] += prev_bid
dollar[prev_win] -= prev_bid
for a in range(N - 3):
for b in range(a + 1, N - 2):
for c in range(b + 1, N - 1):
for d in range(c + 1, N): auction([a, b, c, d])
res = sorted(map(list, zip(score, total, bot_list)), key = lambda k: (-k[0], k[1]))
class TIE_REMOVED: pass
for i in range(N - 1):
if (res[i][0], res[i][1]) == (res[i + 1][0], res[i + 1][1]):
res[i][2] = res[i + 1][2] = TIE_REMOVED
for sc, t, tp in res:
print('%-20s Score: %-6d Total: %d' % (tp.__name__, sc, t))
Beispiele
Wenn Sie einen Pseudozufallsgenerator benötigen, finden Sie hier einen einfachen.
class myrand:
def __init__(self, seed): self.val = seed
def randint(self, a, b):
self.val = (self.val * 6364136223846793005 + 1) % (1 << 64)
return (self.val >> 32) % (b - a + 1) + a
class zero_bot:
def play_round(self, i_dont, care): return 0
class all_in_bot:
def __init__(self): self.dollar = 0
def play_round(self, winner, win_amount):
self.dollar += 500
if winner == 0: self.dollar -= win_amount
return self.dollar
class random_bot:
def __init__(self):
self.dollar = 0
self.random = myrand(1)
def play_round(self, winner, win_amount):
self.dollar += 500
if winner == 0: self.dollar -= win_amount
return self.random.randint(0, self.dollar)
class average_bot:
def __init__(self):
self.dollar = 0
self.round = 11
def play_round(self, winner, win_amount):
self.dollar += 500
self.round -= 1
if winner == 0: self.dollar -= win_amount
return self.dollar / self.round
class fortytwo_bot:
def play_round(self, i_dont, care): return 42
Ergebnis
all_in_bot Score: 20 Total: 15500
random_bot Score: 15 Total: 14264
average_bot Score: 15 Total: 20000
TIE_REMOVED Score: 0 Total: 0
TIE_REMOVED Score: 0 Total: 0
Der Gewinner ist all_in_bot
. Beachten Sie, dass zero_bot
und fortytwo_bot
haben die gleiche Punktzahl und Summe, so dass sie entfernt werden.
Diese Bots werden nicht in den Wettbewerb aufgenommen. Sie können sie verwenden, wenn Sie denken, dass sie großartig sind.
Die Endrunde findet am 23.11.2017 um 14:00 Uhr (UTC) statt . Sie können Ihre Bots vorher beliebig ändern.