Python(オセロ16_Eloレーティング)

■勝率の指標として。
Elo(イロ)レーティングは、Wikiでは平均的強さの相手と一対一対戦した際のオッズを対数変換して求めたレーティングとある。式としては下のRB、RAがEloレーティング。


レーティングを更新する場合は次の式で、SA、SBはAが勝った時にSA=1、SB=0で、K=32にする。


初期のRB、RAは1500にする。

コードが下。1回目の更新を計算すると勝った方が+16、負けた方が-16となっている。

def update_elo(rating_a, rating_b, result_a, k=32):
    """
    rating_a : プレイヤーAのレーティング
    rating_b : プレイヤーBのレーティング

    result_a :
        A勝ち -> 1.0
        引分 -> 0.5
        A負け -> 0.0

    k : K係数
    """

    # 期待勝率
    expected_a = 1 / (1 + 10 ** ((rating_b - rating_a) / 400))
    expected_b = 1 / (1 + 10 ** ((rating_a - rating_b) / 400))

    # レーティング更新
    new_rating_a = rating_a + k * (result_a - expected_a)
    new_rating_b = rating_b + k * ((1 - result_a) - expected_b)

    return new_rating_a, new_rating_b

オセロのロジックとして、ランダム、四隅を優先、3手先までをサーチするものの3つでEloレーティングを求めてみた。やり方としては、3つのロジックの組み合わせをランダムで決め、交互に白、黒を先手にする。これを300回繰り返す。

勝敗の結果が下。横が勝った方。四隅が一番勝率が高く、ランダムに73回、サーチに55回勝っている。

この300回に対して、初期値を1500としてEloレーティングを求めた結果が次。

300回行った後の結果を見れば、レーティングも四隅(corner)、サーチ(search)、ランダム(random)の順で、勝率の結果と一致している。ただ、260回あたりでは、四隅とサーチが逆転する場面もあるので、さらに試行の回数を増やせば別の結果になるかも。何回ぐらい行ってどの程度の信頼性が得られるものか。

もう少しEloレーティングを見てみたい。