ผลสุดท้าย
การแข่งขันสิ้นสุดแล้ว ขอแสดงความยินดีด้วยhard_coded
!
ข้อเท็จจริงที่น่าสนใจ:
ในการประมูล 31600 จาก 40920 การประมูล (77.2%) ผู้ชนะรอบแรกชนะการประมูลมากที่สุดในรอบนั้น
หากบอทตัวอย่างถูกรวมอยู่ในการแข่งขันเก้าอันดับแรกจะไม่เปลี่ยนแปลงยกเว้นว่า
AverageMine
และheurist
จะสลับตำแหน่งของพวกเขาผลลัพธ์ 10 อันดับแรกของการประมูล:
[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 (จำนวนการประมูลที่ i-TH
[719, 126, 25, 36, 15, 58, 10, 7, 19, 38]
รอบไม่มีชนะ):ชนะประมูลเฉลี่ยของ i-TH
[449.4, 855.6, 1100.8, 1166.8, 1290.6, 1386.3, 1500.2, 1526.5, 1639.3, 3227.1]
รอบ:
ป้ายบอกคะแนน
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
ในเกมนี้เราจะจำลองการประมูลที่ปิดผนึก
การประมูลแต่ละครั้งเป็นเกมที่มีผู้เล่น 4 คนประกอบด้วย 10 รอบ เริ่มแรกผู้เล่นไม่มีเงิน ในตอนเริ่มต้นของแต่ละรอบผู้เล่นแต่ละคนจะได้รับ $ 500 จากนั้นทำการประมูลของตนเอง การเสนอราคาสามารถเป็นจำนวนเต็มแบบไม่ลบใด ๆ น้อยกว่าหรือเท่ากับจำนวนเงินที่มี โดยปกติคนที่เสนอราคาสูงสุดจะเป็นผู้ชนะในรอบนั้น อย่างไรก็ตามเพื่อให้สิ่งที่น่าสนใจยิ่งขึ้นหากผู้เล่นหลายคนเสนอราคาเดียวกันการเสนอราคาของพวกเขาจะไม่ถูกนำมาพิจารณา ตัวอย่างเช่นหากผู้เล่นสี่คนเสนอราคา 400 400 300 200 ผู้ชนะการประมูลคนหนึ่งจะชนะ 300 หากพวกเขาเสนอราคา 400 400 300 300 ไม่มีใครชนะ ผู้ชนะควรจ่ายในสิ่งที่เสนอราคา
เนื่องจากเป็นการประมูลแบบ "ผนึกราคาประมูล" ผู้เล่นข้อมูลเพียงคนเดียวเท่านั้นที่รู้เกี่ยวกับการเสนอราคานั้นคือผู้ชนะและจำนวนเงินที่จ่ายเมื่อรอบต่อไปเริ่มต้น
เกณฑ์การให้คะแนน
การประมูลหนึ่งครั้งจะจัดขึ้นสำหรับการรวมกันของผู้เล่น 4 คนที่เป็นไปได้ นั่นคือหากมีบอททั้งหมดที่NจะมีการประมูลN C 4 บอทที่ชนะรอบมากที่สุดจะเป็นผู้ชนะรอบสุดท้าย ในกรณีที่มีเน็คไทบอทที่จ่ายน้อยที่สุดจะชนะ หากยังมีเน็คไทเช่นเดียวกับการประมูลความสัมพันธ์เหล่านั้นจะถูกลบออก
การเข้ารหัส
คุณควรนำคลาสPython 3ไปใช้กับฟังก์ชั่นสมาชิกplay_round
(และ__init__
อื่น ๆ หากคุณต้องการ) play_round
ควรใช้ 3 ข้อโต้แย้ง (รวมถึงตัวเอง) อาร์กิวเมนต์ที่สองและสามจะเป็นไปตามลำดับ: id ของผู้ชนะของรอบก่อนหน้าตามด้วยจำนวนเงินที่จ่าย หากไม่มีใครชนะหรือเป็นรอบแรกพวกเขาทั้งคู่จะเป็น -1 ID ของคุณจะเป็น 0 เสมอและ id 1–3 จะเป็นผู้เล่นคนอื่นตามลำดับที่กำหนดโดยตำแหน่งในโพสต์นี้เท่านั้น
กฎเพิ่มเติม
1. กำหนด:
พฤติกรรมของฟังก์ชั่นของคุณควรขึ้นอยู่กับการโต้แย้งการป้อนข้อมูลภายในการประมูล นั่นคือคุณสามารถเข้าถึงไฟล์ไม่ได้เวลาตัวแปรทั่วโลกหรือสิ่งที่จะเก็บรัฐระหว่างการประมูลที่แตกต่างกันหรือบอท หากคุณต้องการใช้เครื่องกำเนิดไฟฟ้าเทียมหลอกคุณควรเขียนด้วยตัวเอง (เพื่อป้องกันไม่ให้เกิดผลกระทบต่อโปรแกรมของผู้อื่นเช่นrandom
ใน Python lib) และตรวจสอบให้แน่ใจว่าคุณได้รีเซ็ตเมล็ดพันธุ์ที่กำหนดไว้แล้ว__init__
หรือรอบแรกแล้ว
2. สามบอทต่อคน: คุณได้รับอนุญาตให้ส่งได้ไม่เกิน 3 บอทดังนั้นคุณสามารถพัฒนากลยุทธ์เพื่อให้บอทของคุณ "ร่วมมือ" ในบางวิธี
3. ไม่ช้าเกินไป: เนื่องจากจะมีการประมูลจำนวนมากตรวจสอบให้แน่ใจว่าบ็อตของคุณจะไม่ทำงานช้าเกินไป บอทของคุณควรจะสามารถทำการประมูลอย่างน้อย 1,000 ครั้งในหนึ่งวินาที
ตัวควบคุม
นี่คือตัวควบคุมที่ฉันใช้ บอตทั้งหมดจะถูกนำเข้าและเพิ่มbot_list
ในการสั่งซื้อในโพสต์นี้
# 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))
ตัวอย่าง
หากคุณต้องการเครื่องกำเนิดไฟฟ้าเทียมเทียมนี่คือง่ายๆ
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
ผล
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
all_in_bot
ผู้ชนะคือ โปรดทราบว่าzero_bot
และfortytwo_bot
มีคะแนนและผลรวมเท่ากันดังนั้นมันจึงถูกลบออก
บอทเหล่านี้จะไม่รวมอยู่ในการแข่งขัน คุณสามารถใช้มันได้ถ้าคุณคิดว่ามันยอดเยี่ยม
การแข่งขันรอบสุดท้ายจะจัดขึ้นที่2017/11/23 14:00 (UTC) คุณสามารถเปลี่ยนแปลงบอทของคุณได้ก่อนหน้านั้น