为什么随机人群随机获胜,分数慢慢漂移到0.我得知分数可能是随机的,但为什么总是消极地漂移?
import trueskill as ts
from random import choice
r = []
for i in range(10):
r.append(ts.Rating())
def avg(r):
ratings = [(a.mu, a.sigma) for a in r]
mus = list(zip(*ratings))[0]
sigmas = list(zip(*ratings))[1]
avg_mu = sum(mus) / float(len(mus))
avg_sigma = sum(sigmas) / float(len(sigmas))
return avg_mu, avg_sigma
for j in range(20000):
p1_ix = choice(range(len(r)))
p2_ix = choice(range(len(r)))
p1 = r[p1_ix]
p2 = r[p2_ix]
r[p1_ix], r[p2_ix] = ts.rate_1vs1(p1, p2)
if not j % 1000:
print(avg(r))
答案 0 :(得分:2)
您使用的是TrueSkill算法,而不是ELO。 TrueSkill有一种更新技能等级的不同方法。虽然ELO是一个零和系统,但TrueSkill依赖于不确定性参数(由游戏数量及其结果决定)来调整技能等级。因此,如果比赛中的两名球员具有相等的不确定性值,则TrueSkill仅为零和。
您运行的模拟会产生玩家将拥有截然不同的不确定性参数的情况。这一点,再加上你违反了更高等级的球员将更频繁获胜的假设,这将导致一些奇怪的行为。更好的模拟是有几个循环计划。这样,在每场比赛中,比赛的数量将更加相似。如果您运行以下代码,平均评分将接近25。
import trueskill as ts
from random import choice, shuffle
import numpy as np
r = []
for i in range(10):
r.append(ts.Rating())
def avg(r):
ratings = [(a.mu, a.sigma) for a in r]
mus = list(zip(*ratings))[0]
sigmas = list(zip(*ratings))[1]
avg_mu = sum(mus) / float(len(mus))
avg_sigma = sum(sigmas) / float(len(sigmas))
return avg_mu, avg_sigma
for j in range(4444):
# Create array of all possible matchup combinations
possible_matches = np.array(list(itertools.combinations(list(range(len(r))), 2)))
# Shuffle the matches to create a random-order round-robin schedule
np.random.shuffle(possible_matches)
for match in possible_matches:
# Shuffle the order of the players in each match to randomize the result
np.random.shuffle(match)
p1_ix = match[0]
p2_ix = match[1]
p1 = r[p1_ix]
p2 = r[p2_ix]
r[p1_ix], r[p2_ix] = ts.rate_1vs1(p1, p2)
if j % 222 == 0:
print(avg(r))
另外,重要的是要注意TrueSkill不受0限制,因此如果运行时间过长,模拟将导致负分数。但是,我无法完全解释为什么它总会产生负漂移。直观地说,我认为它会以相等的概率随机地或者负地漂移。我的猜测是,某种阻尼系数会让玩家以较低的技能等级随机逃跑的可能性降低。