Son sonuç
Rekabet bitti. Tebrikler hard_coded
!
Bazı ilginç gerçekler:
40920 açık artırmanın 31600'ünde (% 77.2), ilk turun galibi bu açık artırmada en fazla turu kazandı.
Örnek botlar yarışmaya dahil edilirse, ilk dokuz yer bunun dışında değişmez
AverageMine
ve yerlerini değiştirirheurist
.Bir açık artırmada en iyi 10 sonuç:
[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 sayımı (i-inci turda olduğu ihalelerin sayısı hiçbir kazananı vardı):
[719, 126, 25, 36, 15, 58, 10, 7, 19, 38]
.İ-inci turun ortalaması kazanan teklif:
[449.4, 855.6, 1100.8, 1166.8, 1290.6, 1386.3, 1500.2, 1526.5, 1639.3, 3227.1]
.
sayı tahtası
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
Bu oyunda, kapalı teklif açık artırmasını taklit edeceğiz.
Her müzayede, 4 turdan oluşuyor ve 10 turdan oluşuyor. Başlangıçta, oyuncuların parası yok. Her turun başlangıcında, her oyuncu 500 $ kazanacak ve sonra kendi teklifini yapacaktır. Teklif, sahip oldukları miktardan daha az veya eşit olmayan negatif olmayan bir tam sayı olabilir. Genellikle, en yüksek teklifi veren, raundu kazanır. Bununla birlikte, işleri daha ilginç hale getirmek için, eğer birkaç oyuncu aynı fiyatı teklif ederse, teklifleri dikkate alınmaz (bu yüzden turu kazanamaz). Örneğin, dört oyuncu 400 400 300 200 teklif ederse, 300 teklif verilir; 400 400 300 300 teklif ederlerse kimse kazanamaz. Kazanan teklif ettiklerini öder.
Bir "mühürlü teklif" açık artırması olduğu için, teklif hakkında bilecek tek bilgi sahibi kazanandır ve bir sonraki tur başladığında ne kadar ödedikleri (oyuncu ne kadar herkesin sahip olduğunu bilebilir).
puanlama
Her 4 oyuncu kombinasyonu için bir açık artırma yapılacaktır. Yani, toplamda N bot varsa, N C 4 açık artırması olacaktır. En çok turu kazanan bot, final galibi olur. Beraberlik olması durumunda, toplamda en az ödeyen bot kazanacaktır. Hala bir kravat varsa, teklifle aynı şekilde bu bağlar kaldırılır.
Kodlama
Bir Python 3 sınıfını bir üye işleviyle play_round
(ve __init__
gerekirse diğerlerine) uygulamalısınız. play_round
3 argüman almalı (ben dahil). İkinci ve üçüncü argüman sırayla olacaktır: önceki turun galibi, ardından ne kadar ödediklerini. Kimse kazanmazsa veya ilk tursa, ikisi de -1 olur. Kimliğiniz her zaman 0 olacak ve kimliği 1–3 yalnızca bu yazıdaki konum tarafından belirlenen bir sırada diğer oyuncular olacak
Ek kurallar
1. Deterministik:
İşlevinizin davranışı yalnızca bir açık artırmadaki girdi argümanlarına bağlı olmalıdır. Diğer bir deyişle, dosyalara, zamana, genel değişkenlere veya farklı açık artırmalar veya botlar arasında durumları depolayacak hiçbir şeye erişemezsiniz . Bir sözderandom üreteci kullanmak istiyorsanız, kendiniz yazmak daha iyidir (başkalarının random
Python lib'deki programlarını etkilemesini önlemek için ) ve __init__
ilk turda veya içinde sabit bir tohumla sıfırladığınızdan emin olun .
2. Kişi Başına Üç Bot: En fazla 3 bot göndermenize izin verilir, böylece botlarınızın bir şekilde "işbirliği yapması" için bir strateji geliştirebilirsiniz.
3. Çok Yavaş Değil: Çok fazla açık artırma olacağından botlarınızın çok yavaş çalışmamasına dikkat edin. Botlarınız bir saniyede en az 1000 açık artırmayı bitirebilmelidir.
kontrolör
İşte kullandığım denetleyici. Tüm botlar bot_list
bu yazıdaki sıraya göre ithal edilecek ve eklenecektir .
# 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))
Örnekler
Bir takma ad jeneratörü gerekiyorsa, işte basit.
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
Sonuç
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
Kazanır all_in_bot
. Bunu zero_bot
ve fortytwo_bot
toplam puanın aynı olduğunu ve toplamının kaldırıldığını unutmayın.
Bu botlar yarışmaya dahil edilmeyecek. Harika olduklarını düşünüyorsanız bunları kullanabilirsiniz.
Final yarışması 2017/11/23 14:00 (UTC) 'de yapılacak . Bundan önce botlarınızda herhangi bir değişiklik yapabilirsiniz.