최종 결과
경쟁은 끝났습니다. 축하합니다 hard_coded
!
몇 가지 흥미로운 사실 :
40920 개 경매 중 31600 개 (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
동점 수 (i 번째 라운드에서 우승자가없는 경매 수) :
[719, 126, 25, 36, 15, 58, 10, 7, 19, 38]
.i 번째 라운드의 평균 낙찰가 :
[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를 받고 자신의 입찰을합니다. 입찰가는 음수보다 작거나 같은 음수가 아닌 정수일 수 있습니다. 일반적으로 가장 높은 가격으로 입찰 한 사람이 라운드에서 승리합니다. 그러나 더 흥미로운 점은 여러 플레이어가 같은 가격으로 입찰하면 입찰이 고려되지 않으므로 라운드에서 이길 수 없다는 것입니다. 예를 들어 4 명의 플레이어가 400400300200을 입찰하면 300 명이 이깁니다. 그들이 400 400 300 300을 입찰하면 아무도 이길 수 없습니다. 승자는 입찰 한 금액을 지불해야합니다.
"밀봉 된 입찰"경매이기 때문에 입찰에 대해 유일하게 정보 플레이어는 입찰자가 승자와 다음 라운드가 시작될 때 지불 한 금액을 알 수 있습니다.
채점
가능한 모든 4 인 조합마다 한 번의 경매가 진행됩니다. 즉, 총 N 개의 봇이 있으면 N C 4 경매가 이루어집니다. 가장 많은 라운드에서이기는 봇이 최종 우승자가됩니다. 동점이있는 경우, 가장 적은 금액을 지불 한 봇이 승리합니다. 입찰과 같은 방식으로 동점 인 경우 해당 동점은 제거됩니다.
코딩
멤버 함수 ( 필요한 경우 다른 클래스)로 Python 3 클래스를 구현 해야합니다. 3 가지 주장을 취해야한다 (자기 포함). 두 번째 및 세 번째 인수는 순서대로 진행됩니다. 이전 라운드의 승자 ID, 지불 금액. 아무도 이기지 않거나 첫 번째 라운드이면 모두 -1이됩니다. 귀하의 ID는 항상 0이며, ID 1–3은이 게시물의 위치에 따라 결정된 순서대로 다른 플레이어가됩니다.play_round
__init__
play_round
추가 규칙
1. 결정 론적 :
함수의 동작은 경매 내의 입력 인수에만 의존해야합니다. 즉, 파일, 시간, 전역 변수 또는 다른 경매 또는 봇간에 상태 를 저장하는 모든 항목에 액세스 할 수 없습니다 . 의사 난수 생성기를 사용하려면 직접 작성하여 ( random
파이썬 lib 와 같은 다른 사람의 프로그램에 영향을주지 않도록 ) 고정 된 시드 __init__
또는 첫 번째 라운드로 재설정해야합니다 .
2. 1 인당 3 개의 봇 : 최대 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)에 개최됩니다 . 그 전에 봇을 변경할 수 있습니다.