ELSではなく、TrueSkillアルゴリズムを使用しています。 TrueSkillには、スキル評価を更新するための別の方法があります。 ELOはゼロサムシステムですが、TrueSkillはスキルレーティングを調整するための不確実性パラメータ(ゲームの数と結果によって決まります)に依存します。したがって、TrueSkillは、一致する2人のプレイヤーが等しい不確実性値を持つ場合に限り、ゼロ合計になります。
実行したシミュレーションでは、プレイヤーが大きく異なる不確実性パラメータを持つ状況が発生します。これは、あなたが高い評価を得たプレーヤーがより頻繁に勝つという仮定を破っているという事実と相まって、いくつかの奇妙な行動につながります。より良いシミュレーションは、いくつかのラウンドロビンスケジュールを持つことです。このようにして、試合の量は試合ごとにより似ています。あなたは以下のコードを実行した場合、平均格付けはまた、それはTrueSkillが0で囲まれていないことに注意することが重要ですので、あなたがそれを実行した場合、あなたのシミュレーションは負のスコアにつながる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))
の近くに滞在します十分な長さ。しかし、なぜそれが常に負のドリフトを生成するのかを完全には説明できません。直観的に、私はそれが等確率で正または負にランダムにドリフトすると思うでしょう。私の推測によれば、ある種のダンピング要因があるため、プレーヤーが不条理に高いスキル評価で無作為に逃げる可能性は低くなります。