gameServer/OfficialServer/updateRating.hs
changeset 11359 e6a9528f02f7
parent 11358 55360683db75
child 11380 ff0fa38bdb18
equal deleted inserted replaced
11358:55360683db75 11359:e6a9528f02f7
    22 ε = 0.000001
    22 ε = 0.000001
    23 
    23 
    24 g_φ :: Double -> Double
    24 g_φ :: Double -> Double
    25 g_φ φ = 1 / sqrt (1 + 3 * φ^2 / pi^2)
    25 g_φ φ = 1 / sqrt (1 + 3 * φ^2 / pi^2)
    26 
    26 
    27 calcE :: GameData -> (Double, Double)
    27 calcE :: GameData -> (Double, Double, Double)
    28 calcE (GameData oldRating oppRating s) = (
    28 calcE (GameData oldRating oppRating s) = (
    29     1 / (1 + exp (g_φᵢ * (μᵢ - μ)))
    29     1 / (1 + exp (g_φᵢ * (μᵢ - μ)))
    30     , g_φᵢ
    30     , g_φᵢ
       
    31     , s
    31     )
    32     )
    32     where
    33     where
    33         μ = (ratingValue oldRating - 1500) / 173.7178
    34         μ = (ratingValue oldRating - 1500) / 173.7178
    34         φ = rD oldRating / 173.7178
    35         φ = rD oldRating / 173.7178
    35         μᵢ = (ratingValue oppRating - 1500) / 173.7178
    36         μᵢ = (ratingValue oppRating - 1500) / 173.7178
    37         g_φᵢ = g_φ φᵢ
    38         g_φᵢ = g_φ φᵢ
    38 
    39 
    39 
    40 
    40 calcNewRating :: [GameData] -> RatingData
    41 calcNewRating :: [GameData] -> RatingData
    41 calcNewRating [] = undefined
    42 calcNewRating [] = undefined
    42 calcNewRating games@(GameData oldRating _ _ : _) = undefined
    43 calcNewRating games@(GameData oldRating _ _ : _) = RatingData (173.7178 * μ' + 1500) (173.7178 * sqrt φ'sqr) σ'
    43     where
    44     where
    44         _Es = map calcE games
    45         _Es = map calcE games
    45         υ = 1 / sum (map υ_p _Es)
    46         υ = 1 / sum (map υ_p _Es)
    46         υ_p (_Eᵢ, g_φᵢ) = g_φᵢ ^ 2 * _Eᵢ * (1 - _Eᵢ)
    47         υ_p (_Eᵢ, g_φᵢ, _) = g_φᵢ ^ 2 * _Eᵢ * (1 - _Eᵢ)
    47         _Δ = υ * sum (map _Δ_p $ zip _Es (map gameScore games))
    48         _Δ = υ * part1
    48         _Δ_p ((_Eᵢ, g_φᵢ), sᵢ) = g_φᵢ * (sᵢ - _Eᵢ)
    49         part1 = sum (map _Δ_p _Es)
       
    50         _Δ_p (_Eᵢ, g_φᵢ, sᵢ) = g_φᵢ * (sᵢ - _Eᵢ)
    49 
    51 
    50         μ = (ratingValue oldRating - 1500) / 173.7178
    52         μ = (ratingValue oldRating - 1500) / 173.7178
    51         φ = rD oldRating / 173.7178
    53         φ = rD oldRating / 173.7178
    52         σ = volatility oldRating
    54         σ = volatility oldRating
    53 
    55 
    61         fB = f _B
    63         fB = f _B
    62         σ' = (\(_A, _, _, _) -> exp (_A / 2)) . head . dropWhile (\(_A, _, _B, _) -> abs (_B - _A) > ε) $ iterate step5 (_A, fA, _B, fB)
    64         σ' = (\(_A, _, _, _) -> exp (_A / 2)) . head . dropWhile (\(_A, _, _B, _) -> abs (_B - _A) > ε) $ iterate step5 (_A, fA, _B, fB)
    63         step5 (_A, fA, _B, fB) = let _C = _A + (_A - _B) * fA / (fB - fA); fC = f _C in
    65         step5 (_A, fA, _B, fB) = let _C = _A + (_A - _B) * fA / (fB - fA); fC = f _C in
    64                                      if fC * fB < 0 then (_B, fB, _C, fC) else (_A, fA / 2, _C, fC)
    66                                      if fC * fB < 0 then (_B, fB, _C, fC) else (_A, fA / 2, _C, fC)
    65 
    67 
       
    68         φ'sqr = 1 / (1 / (φ ^ 2 + σ' ^ 2) + 1 / υ)
       
    69         μ' = μ + φ'sqr * part1
    66 
    70 
    67 main = undefined
    71 main = undefined