YONのドバトブログ

YONの土鳩ブログ

ゲーム好きの鳩"YON"がツイッターでは言い切れないことについて書き連ねるブログ

スマメイト方式でプレイヤーランキングやシードポイントを計算する

この記事では、大会順位や大会規模ではなく、大会で対戦した相手の強さを考慮してシードやランキングを計算する方法と、その結果を紹介する。どのような大会にも適用できるが、この記事ではスマブラの競技コミュニティを取り扱う。

なお、この記事は寝椅子氏の企画であるスマブラAdventCalendar2022に参加している。企画に参加している他のブログ記事も是非読んでみてほしい。

 

スマメイト方式_レート&試合データ - Google スプレッドシート

△手っ取り早く結果を見たい人向け

 

 

従来の手法の問題点

スマブラプレイヤーの既存のランキングにはたとえばJPR, JJPR, ESPRがある。また、国内最大規模のスマブラ大会篝火のシードポイント計算はJPRをベースとしている。これらはどれも異なるアルゴリズムを採用しているが、おおよその方針は以下で一致している。*1

  1. 一定の基準に従い、ポイントを算入する大会を選ぶ
  2. 各大会の大会ポイントを計算する。大会の参加人数が多いほど、また開催日が近いほど、高い大会ポイントを与える
  3. 大会ポイントを、順位に従って参加プレイヤーに分配する
  4. 分配された大会ポイントの合計に従ってプレイヤーを順位付けする。ただし、プレイヤー1人に対し算入できる大会の数には制限を設ける

 

早い話が、直近の大規模大会で上位を何度か取ったプレイヤーが高く評価される。この方針は明快で合理的であるが、各プレイヤーが大会で実際に誰と対戦したかが考慮されないため、具体的に以下のような問題を招いてしまう。

  • 予選ブロックやトーナメントの組合せ運の影響を強く受ける *2
  • 小規模なハイレベル大会より大規模な地方大会を高く評価してしまう *3 *4
  • プレイヤーの棄権を正しく反映できない

f:id:YON_4:20220116123158p:plain
△開催直前の感染拡大を受け、エントリー768名のうち200名以上のプレイヤーが参加を辞退した篝火#6の穴だらけ予選ブロックの例(辞退者は"DQ"で表示)。一方で、同大会でもほとんど棄権者が出なかった予選ブロックもある。同数の棄権でも、それが有力プレイヤーのものであったか、同じ予選ブロックに固まっていたかどうかで影響は大きく変わるため、大会参加者数の変化を反映するだけでは不十分と言える

 

スマメイトのように「誰と対戦したか」を考慮する

上記のような問題を緩和・解決する方法として、大会で誰と対戦したかを考慮するアルゴリズムを検討する。つまり、スマメイトSmashFreaksのように、強さを示す数値として各プレイヤーにレートを与え、対戦相手のレートと勝敗によってレートを更新し、最終的なレートをシードやランキングの基準とする。この手法を本記事では「スマメイト方式」と呼ぶことにする。

スマメイト方式では、大会で好順位を沢山取ったプレイヤーではなく、強いプレイヤーに大会で沢山勝ったプレイヤーを評価する。実際に対戦した相手の強さが考慮されるため、予選ブロックやトーナメントの組合せ運の影響が小さくなる。もちろんハイレベルな小規模大会を正しく評価できるし、プレイヤーの棄権を正確に考慮することもできる。

スマメイト方式を採用した場合、大会順位それ自体はランキングやシードの計算に影響しなくなる。大会で勝ち上がる意味は「より多くの対戦をすること」「より強いプレイヤーと対戦する機会を得ること」となる。


△スマメイト方式で計算した、あcola選手のレート遷移例。上から下に読む(1952+5=1957, 1957+10=1967, ,,,)。初期レートやレート遷移の計算式は後述

 

「いいとこ取り」手法を取り入れる

単純にレートを導入するだけでは、レートを下げないために大会参加を控えるプレイヤーを出したり、多くの大会に参加したプレイヤーを有利にしすぎる恐れがある。

従来のアルゴリズムではこうした問題を防ぐため、参加した大会ごとにポイントを計算し、そのうち上位何件かだけを考慮する「いいとこ取り」手法を採用している。つまり、ある程度大会に参加すれば、あとはポイントが上がるかキープかの2択となる。こうすれば大会参加で不利になることも、大会に多く参加した人が極端に有利になることもない。 

この長所を取り入れ、最終レート計算時だけ、レート収支上位の何試合かだけを考慮する。つまり、レート更新は各試合ごとに行うが、最終レートは初期レート+(レート収支上位試合のレート変化値合計)で計算される。こうすれば、ある程度試合を行えば最終レートは上昇するかそのままかの2択となり、大会参加のモチベーションを削ぐことがなく、試合数を単純に稼ぐ意味もなくなる。ただし、レートがインフレしていくので、長期運用する場合はリセット処理が必須となる。


△前述のレート遷移を、レート収支降順に並び替えたもの。上位10試合だけ考慮する場合、あcola選手のレート変化は19+17+17+17+16+16+13+12+12+11 = 150となる

 

スマメイト方式で実際にシード順位を計算する

では、スマメイト方式によるシード計算を実際に試してみよう。比較対象はデータが公開されていた篝火JPDBシード(2022/12/18時点のもの)とし、計算対象となっている178大会の試合データを取得する。*5

start.ggのAPIを用いたところ、DQ(棄権や失格)除く34036試合の結果を取得できた。なお、計算に用いたプログラムやデータは以下で公開している。

 

初期レートを設定する

どんな手法を使ったとしても、初期値だけは適当に決めるか、別の手法で計算しなければならない。今回は篝火のJPDBシードポイント上位から順に、スマメイト第16.5期サブシーズン初期レート分布と同じ割合になるように初期レートを割り当てていく。こうすると、スマメイトのようなレート分布を維持しながら各期終了時ほどは分散していない初期値を設定できる。なお、篝火シードポイントデータに存在しない人は初期レート1400(下位20%点)を割り当てている。*6 *7 *8 *9


△上記手法によって計算した初期レートヒストグラム。横軸がレート、縦軸が人数。スマメイトレート特有の右に歪んだ分布を横方向に縮めた分布になる

時系列順にレートを更新する

全試合を古い試合から順に処理し、各プレイヤーのレートを更新していく。レート更新にはスマメイトと同様のイロレーティングを用いる。ただし、スマメイトとは異なりレート変化最小値を1とし、最大値の制限は設けない。*10

△プレイヤーAがプレイヤーBの勝利したときのレート更新値。R_A, R_BはそれぞれプレイヤーA,Bのレート。同じレートのプレイヤーを倒すと自分のレートが16増え、相手のレートが16減る


△初期レート(赤)と更新後レート(青)のヒストグラム。横軸がレート、縦軸が人数。更新後のレートは収支上位だけを考慮した最終レートとは異なることに注意

 

レート収支上位の試合だけ用いて最終レートを計算する

プレイヤーごとに、レート収支の上位から何試合かだけ合計して初期レートからの変化量を決定する。何件合計するかが問題になるが、数が少なすぎると番狂わせを起こしたかどうかに過度に依存してしまうし、数が多すぎると試合数が多いプレイヤーや、高い勝率を維持しやすい環境にいるプレイヤーが有利になりすぎてしまう。

ここでは、全プレイヤーの試合数の中央値(6試合)より大きく、第3四分位点(13試合)よりは小さい10試合だけ算入することにしよう。つまり、最終レート = 初期レート + (レート収支上位10試合のレート変化値合計)となる。約68%のプレイヤーは10試合未満しか対戦していないので不利になるが、5大会ほど参加すれば毎回最速敗退でも埋められる試合数ではある。*11


△描画範囲を1-20試合に絞ったときの、各プレイヤーの試合数グラフ。横軸が試合数、縦軸が人数

 


△レート収支降順にソートしたあcola選手のレート遷移例再掲。あcola選手の初期レートは1950なので、最終レートは1950+(19+17+17+17+16+16+13+12+12+11) = 2100となる

 

結果を吟味する

結果は以下のようになった。ただし、篝火シードデータの関係で、一部プレイヤーは除かれている。*12

篝火シード由来の初期値と大会を使用しているので、結果の差異は主に計算過程によるものだと推測される。「大会で強いプレイヤーに沢山勝ったプレイヤー」が高く評価されているか確認しよう。

 

スマメイト方式_レート&試合データ - Google スプレッドシート

 


△更新後レート(青)と最終レート(黄)のヒストグラム。横軸がレート、縦軸が人数

 

スマメイト方式で高く評価されるようになるプレイヤー例

まさし選手は篝火シードでは133位だったが、スマメイト方式では66位となった。計算対象となった試合には、自分よりレートが上の相手を倒した試合が多く、そこには参加者数十名の小規模大会の試合も含まれている


△まさし選手のレート収支上位10試合。どの試合も+16以上であり、自分以上のレートの相手を倒している。なお、赤枠で囲ったtournament_entrantsは大会参加人数であり、ここにあるような参加者数十名の小規模大会の戦績は、従来の手法では低く評価されてしまう

 

スマメイト方式で低く評価されるようになるプレイヤー例

おがとう選手は北海道の大会に出場しているプレイヤーであり、篝火シードでは58位だがスマメイト方式では146位となった。詳細を見てみると、今回の算入大会においては自分より高いレートの相手に勝った試合が無いことが分かる。なお、算入された試合は北海道の大規模大会HSTSPのものであり、参加人数が多いため従来の手法では高く評価される。


△おがとう選手のレート収支上位10試合。どの試合も+16以下であり、自分以下のレートの相手に対する勝ち試合である

 

スマメイト方式の問題点

ここまでスマメイト方式の利点や特徴のみ扱ってきたが、ここで欠点について整理しておく。

大規模大会に参加するメリットが減る

レートを上げるには「強いプレイヤーに何度も勝つ」ことが最も効率的であり、それさえ出来れば大会規模は関係ない。そのため、特に上位勢にとってはわざわざ大規模大会に行くよりも上位勢だけの小規模大会で何度も対戦する方が効率が良くなってしまう

これを抑止するには、たとえば「参加者30名未満の大会における試合は、3試合までしか最終レート計算に含められない」や、「同一のプレイヤーとの試合は、1試合までしか最終レート計算に含められない」などの制限を設けることが考えられる。

総当り戦の対戦順序を考慮しきれない

対戦を時系列順にソートするとき、start.ggの試合IDや◯◯回戦の情報等をキーに使用している。これはトーナメント形式では問題なく機能するが、総当り形式では正確な試合順序がどこにも記録されていないため考慮できず、start.ggに戦績が入力された順に試合が行われた扱いになってしまう。最近は総当たり形式の予選は減ってきているが、注意が必要である。

わざと負けて最終レートを上げる工作が可能になる

最終レートが初期レート+(レート収支上位試合のレート変化値合計)で計算されるため、わざと負け続けてレートを下げた後に10試合勝つと、単に10試合勝つよりも最終レートを上げられる場合がある

このような工作を防ぐには、たとえばある時点のレートが初期レートより著しく下がった場合に最終レートに何らかのペナルティを与える、レートリセットをこまめに行うなどの対策が考えられる。

 

まとめ

従来のシードポイント計算・ランキング作成手法には、トーナメント・ブロックの組合せ運の影響を強く受ける、ハイレベル小規模大会や棄権を正しく考慮できない問題点があるが、スマメイト方式の導入によりこの問題を緩和できる。

どちらの手法も一長一短であり、シードやランキングを作成する人が好みの方を選べばよい。少々雑な話になるが、「◯◯さんは大規模大会で何度も上位に入っているから最強!」と考えるならば従来の方を、「◯◯さんはMkLeoやTweekを大会で倒しているから最強!」と考えるならばスマメイト方式を選ぶべきだ。

 

謝辞

本記事の草案作成にあたり、多数のアドバイスを頂いたアユハ氏しょーぐん氏に深謝する。

 

 

 

*1:開催日を考慮せず、算入大会数の上限を設けない積み上げ式のランキングSJPRもある

*2:スマブラのオフ大会では一般にダブルエリミネーションが採用されるが、シングルエリミネーションに比べ組み合わせ運の影響はあまり緩和されない。詳細はこちらの過去記事を参照

*3:実際、篝火#6のシードにおいては、予選を勝ち抜いた16名の強豪プレイヤーだけで構成されるSWT 2021 East Asia Regional Finalsで優勝しても、同時期に開催された沖縄大会Comic Con Okinawa 2021 Smash Ultimateで優勝した場合の1/4未満のシードポイントしか得られなかった。沖縄大会を貶めるわけではないが、事前予選のある東京大会よりレベルが高いとは考え辛い。どんなにハイレベルな大会だろうと少人数であれば評価は下がってしまうのだ

*4:海外ランキングPGRでは大会tierや「独自」のランカー重み付けが導入されており、この問題が緩和されていた

*5:エスマoffline feat.銭スマ・まめブラの試合のみ、start.ggから試合データを取得できなかったため、計算から除いている

*6:初期値を全員同じにしても最終分布は釣り鐘型になるが、最初の大会で全員同レートという無理のある仮定をおくことになる

*7:1000-3000の範囲にシードポイントを単純に正規化すると、ほとんどのプレイヤーが1000付近に密集した初期値になってしまう

*8:シードポイントの順位だけを考慮してポイント1,2,3,...位にレート3000,2999,2998,...と初期値を定めることもできるが、ポイント300位が1位に勝った場合と1300位が1000位に勝った場合のレート変動がほぼ同じになってしまう欠点がある

*9:集計対象の大会に全く出場していないプレイヤーが中央値付近にいるとは考えにくいため、JPDBシードポイント表に存在しない人の初期値は低めに設定した。また、こうすると偽名出場のメリットを抑えられる

*10:最小値を1としたのは、大会で試合数を稼ぐのは容易ではなく、どんな格下相手の勝利でも全くレートが変化しないのは酷と感じたため。最大値を設けなかったのは、試合数が少なく逆転の機会が少ないため

*11:ちなみに、レート収支黒字の試合数中央値は2だった。10試合全てを勝ち試合で埋めるのは容易ではない

*12:篝火シードデータにあるプレイヤーIDがstart.ggから取得したプレイヤーIDと一致せず、プレイヤー名による結合しかできなかった。そのため一部プレイヤーが漏れている