最后结果
比赛结束了。恭喜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,然后自行出价。出价可以是小于或等于它们的金额的任何非负整数。通常,出价最高的人会赢得一轮。但是,为了使事情变得更有趣,如果几个玩家出价相同的价格,则不会考虑他们的出价(因此无法赢得该回合)。例如,如果四名玩家出价400 400 300 200,则一者出价300获胜。如果他们出价400400300300,没有人赢。获胜者应支付他们的出价。
由于这是一次“密封竞价”拍卖,因此玩家唯一会知道出价的信息是中标者,以及下一轮开始时他们支付了多少钱(因此玩家可以知道每个人有多少)。
计分
每种可能的4人组合将举行一次拍卖。也就是说,如果总共有N个机器人,那么将有N C 4个拍卖。赢得最多回合的机器人将成为最终的获胜者。如果出现平局,则支付总额最少的机器人将获胜。如果仍然存在平局,则与出价相同,这些平局将被删除。
编码
您应该使用成员函数(和其他需要的成员函数)实现Python 3类。应该接受3个参数(包括self)。第二和第三个参数依次为:上一轮的获胜者ID,然后是他们支付了多少。如果没有人获胜,或者这是第一轮比赛,他们俩均为-1。您的ID将始终为0,而ID 1–3将是其他玩家,其顺序仅取决于此职位的位置。play_round
__init__
play_round
附加规则
1.确定性的:
函数的行为应仅取决于拍卖中的输入参数。也就是说,您无法访问文件,时间,全局变量或任何将在不同拍卖或漫游器之间存储状态的内容。如果要使用伪随机数生成器,最好自己编写(以防止影响其他程序,如random
Python lib),并确保__init__
在第一轮或第一轮中使用固定种子重置它。
2.每人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)举行。在此之前,您可以对机器人进行任何更改。