2017-11-21 18 views
0

のようにドリフトしているのはなぜですか?ランダムな勝者を持つランダムな人口では、スコアが0にゆっくりとドリフトするのですが、スコアはランダムですが、Python Trueskill(ELO)のスコアが

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)) 

答えて

1

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)) 

の近くに滞在します十分な長さ。しかし、なぜそれが常に負のドリフトを生成するのかを完全には説明できません。直観的に、私はそれが等確率で正または負にランダムにドリフトすると思うでしょう。私の推測によれば、ある種のダンピング要因があるため、プレーヤーが不条理に高いスキル評価で無作為に逃げる可能性は低くなります。

関連する問題