Share
Embed
kamakura.go_5__kamakura.pdf
ikeda-masashi
June 22, 2019
Transcript
15 slides
-
勢いで Glicko-2 Ratingの go実装書いてみたが イマイチ使い道を 思いつかない件について in kamakura.go#5 @鎌倉 2019/06/22(土)
The Go gopher was designed by Renée French. The gopher stickers made by Takuya Ueda. Licensed under the Creative Commons 3.0 Attributions license. Which one is stronger? -
自己紹介 漫画 実写 所属:面白法人カヤック GC事業部 サーバーサイド 入社2年目超(+半年くらい?) (自称) データエンジニア。 よく使う言語はSQL/Python/Per
もともとはPython/MATLAB書捨て解析マンl なにかGoで書きたい病罹患中。 https://github.com/mashiike github icon 名前: 池田 将士 (ikeda-masashi) Github name: mahiike OSS的なものは初挑戦! -
なにかGoで書きたい病罹患中!!! 春なので(ボソ 大事なことなので (ry そこで、 勢いで 『Glicko-2 Ratingのgo実装書いてみた』 が、しかし...
(自分の中で)『イマイチ使い道が思いつかなかったので、宣伝しに来ました』 Usecaseとツッコミウェルカム!! -
そもそもRatingって? - 概要 By Wikipedia ここでいうRatingは、チェスとか、ボドゲとか、スマホゲーとかスマホゲーとかで使われる 数値化された強さの意味合い。 ELO Rating, Glicko
Rating, Glicko2 Ratingなどなどアルゴリズムはた くさん存在している。 レーティング(Rating)とは、対象となる物事に対して、ある基準に基づ き、等級分けや数値化を行ったものである。 -
そもそもRatingって? - 使われ方 https://wiki.guildwars2.com/wiki/PvP_Matchmaking_Algorithm Guild Wars 2 のPvPのマッチングでは MMR(MatchMaking Rating) という形で
Glicko2 Ratingが使われていた。 シャドウバースというゲームでは『 Ratings for シャドウバース』というアプリが存在してい て、プレイヤー同士で強さを可視化している スプラトゥーン2の『ガチエリアパワー』は多分 Glicko2 Ratingベースだと思う。(多分) http://shiokarasokuhou.blomaga.jp/articles/29220.html -
そもそもRatingって? - Gliko2って? • Glicko2 Ratingは最初期に登場した ELO Rating の改良版であるGlicko Ratingの更にその改良版
• 1500という値が中心で、強ければ数値が大きく低ければ数値が小さいという特徴 • ELOのときから引き継いで Ratingの数値に200差あればだいたい高いほうが 76%で勝つ • 実際に発揮される強さはブレがあるとして、 RD(Rating Devition)という数値がある。 • 更新には実際の勝敗情報が必要 etc... 要するに 『実際の勝敗から、強さを推定するすっ ごい便利なアルゴリズム』 -
github.com/mashiike/ratingの宣伝 https://github.com/mashiike/rating 特徴 • シンプル! • ヘルパーをたくさん実装(したい) • time.Time をインスパイア(したい)
モチベーション • そもそも何かGoで書いてみたかった。 • 既存のGlicko2 Ratingの実装はシンプルすぎて、 Ratingに対する理解がないと使いづらいのでなんとかしたい。 (例えば、どうやって推定勝率だすの?とか どうやってTeam型で適用するの?とか) -
github.com/mashiike/ratingの宣伝 package main import ( "fmt" "math" "github.com/mashiike/comb" "github.com/mashiike/rating" )
func main() { ratings := []rating.Rating{ rating.New(1500.0, 50, 0.06), rating.New(1730.0, 200, 0.06), rating.New(1600.0, 10, 0.06), rating.New(1470.0, 250, 0.06), rating.New(1550.0, 45, 0.06), rating.New(1620.0, 80, 0.06), } inds := comb.Slice(ratings, 2, func(teamInd [][]int) float64 { team0 := make([]rating.Rating, 0, 3) for _, ind := range teamInd[0] { team0 = append(team0, ratings[ind]) } team1 := make([]rating.Rating, 0, 3) for _, ind := range teamInd[1] { team1 = append(team1, ratings[ind]) } //それぞれのチームのRatingを求めて、その勝率が50%に近ければ小さくなる2次関数 return math.Pow(rating.Average(team0).WinProb(rating.Average(team1))-0.5, 2) }) fmt.Println("-- team1 --") for _, ind := range inds[0] { fmt.Println(ratings[ind]) } fmt.Println("") fmt.Println("-- team2 --") for _, ind := range inds[1] { fmt.Println(ratings[ind]) } } feature/v0.6.0 いい感じにチーム分けしてくれる機能 $ go run . -- team1 -- 1500.0 (1400.0-1600.0 v=0.06) 1600.0 (1580.0-1620.0 v=0.06) 1620.0 (1460.0-1780.0 v=0.06) -- team2 -- 1730.0 (1330.0-2130.0 v=0.06) 1470.0 (970.0-1970.0 v=0.06) 1550.0 (1460.0-1640.0 v=0.06) -
今後の展望的ななにか version up 予定(妄想) v0.5.0 : チームRating対応 (PlayerとTeamの実装) Glicko2-rating特有のパラメータUtils (初期Volatilityやシステム定数Tauの決定とか)
v0.6.0 : Matchmakeing ? v0.7.0 : ???(他に必要な機能あるだろうか?機能要望募集中) ︙ v1.0.0 : (夏には・・・)