Kết quả cuối cùng
Cuộc thi kết thúc. Xin chúc mừng hard_coded
!
Một số sự thật thú vị:
Trong 31600 trên tổng số 40920 phiên đấu giá (77,2%), người chiến thắng trong vòng đầu tiên đã giành được nhiều vòng nhất trong phiên đấu giá đó.
Nếu các bot mẫu được đưa vào thi đấu, chín vị trí hàng đầu sẽ không thay đổi ngoại trừ điều đó
AverageMine
vàheurist
sẽ hoán đổi vị trí của họ.Top 10 kết quả trong một cuộc đấu giá:
[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
Số lượng tie (số phiên đấu giá mà vòng thứ i không có người chiến thắng) :
[719, 126, 25, 36, 15, 58, 10, 7, 19, 38]
.Giá thầu trung bình của vòng thứ i :
[449.4, 855.6, 1100.8, 1166.8, 1290.6, 1386.3, 1500.2, 1526.5, 1639.3, 3227.1]
.
Bảng điểm
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
Trong trò chơi này, chúng tôi sẽ mô phỏng một phiên đấu giá thầu kín.
Mỗi phiên đấu giá là một trò chơi 4 người, bao gồm 10 vòng. Ban đầu, người chơi không có tiền. Khi bắt đầu mỗi vòng, mỗi người chơi sẽ nhận được 500 đô la, và sau đó đưa ra giá thầu của riêng họ. Giá thầu có thể là bất kỳ số nguyên không âm nào nhỏ hơn hoặc bằng số tiền họ có. Thông thường, một người trả giá cao nhất sẽ giành chiến thắng trong vòng này. Tuy nhiên, để làm cho mọi thứ thú vị hơn, nếu một số người chơi trả giá như nhau, giá thầu của họ sẽ không được tính đến (do đó không thể giành chiến thắng trong vòng này). Ví dụ: nếu bốn người chơi trả giá 400 400 300 200, thì một người trả giá 300 thắng; nếu họ trả giá 400 400 300 300, không ai thắng. Người chiến thắng nên trả những gì họ trả giá.
Vì đây là phiên đấu giá "niêm phong giá thầu", người chơi thông tin duy nhất sẽ biết về đấu thầu là người chiến thắng và họ đã trả bao nhiêu khi vòng tiếp theo bắt đầu (để người chơi có thể biết mọi người có bao nhiêu).
Chấm điểm
Một phiên đấu giá sẽ được tổ chức cho mọi kết hợp 4 người chơi có thể. Nghĩa là, nếu có tổng cộng N bot, sẽ có đấu giá N C 4 . Bot chiến thắng nhiều vòng nhất sẽ là người chiến thắng cuối cùng. Trong trường hợp có hòa, bot nào trả ít nhất trong tổng số sẽ thắng. Nếu vẫn còn một ràng buộc, giống như cách đấu thầu, các mối quan hệ đó sẽ bị xóa.
Mã hóa
Bạn nên triển khai lớp Python 3 với hàm thành viên play_round
(và các lớp __init__
khác nếu bạn cần). play_round
nên lấy 3 đối số (bao gồm cả bản thân). Đối số thứ hai và thứ ba sẽ theo thứ tự: id của người chiến thắng của vòng trước, theo sau là số tiền họ đã trả. Nếu không ai thắng hoặc đó là vòng đầu tiên, cả hai sẽ là -1. Id của bạn sẽ luôn là 0 và id 1 Ném3 sẽ là những người chơi khác theo thứ tự chỉ được xác định bởi vị trí trên bài đăng này.
Quy tắc bổ sung
1. Xác định:
Hành vi của chức năng của bạn chỉ nên phụ thuộc vào các đối số đầu vào trong phiên đấu giá. Đó là, bạn không thể truy cập các tệp, thời gian, biến toàn cục hoặc bất cứ thứ gì sẽ lưu trữ trạng thái giữa các phiên đấu giá hoặc bot khác nhau . Nếu bạn muốn sử dụng trình tạo giả ngẫu nhiên, tốt hơn là bạn nên tự viết nó (để tránh ảnh hưởng đến các chương trình của người khác như random
trong Python lib) và đảm bảo rằng bạn đã đặt lại nó với một hạt giống cố định trong __init__
hoặc vòng đầu tiên.
2. Ba Bots mỗi người: Bạn được phép gửi tối đa 3 bot, vì vậy bạn có thể phát triển một chiến lược để làm cho bot của bạn "hợp tác" theo một cách nào đó.
3. Không quá chậm: Vì sẽ có nhiều phiên đấu giá, hãy đảm bảo rằng các bot của bạn sẽ không chạy quá chậm. Các bot của bạn sẽ có thể hoàn thành ít nhất 1.000 phiên đấu giá trong một giây.
Bộ điều khiển
Đây là bộ điều khiển tôi đang sử dụng. Tất cả các bot sẽ được nhập khẩu và thêm bot_list
vào theo thứ tự trên bài đăng này.
# 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))
Ví dụ
Nếu bạn cần một trình tạo giả ngẫu nhiên, đây là một cách đơn giản.
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
Kết quả
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
Người chiến thắng là all_in_bot
. Lưu ý rằng zero_bot
và fortytwo_bot
có cùng số điểm và tổng số, vì vậy chúng bị xóa.
Những bot này sẽ không được đưa vào cuộc thi. Bạn có thể sử dụng chúng nếu bạn nghĩ rằng chúng là tuyệt vời.
Cuộc thi cuối cùng sẽ được tổ chức vào 2017/11/23 14:00 (UTC) . Bạn có thể thực hiện bất kỳ thay đổi cho bot của bạn trước đó.