INK WAVE システム構築秘話 ~第1話~



「個性の波をぶつけろ!INK WAVE」

1年半ぶりにノートを書きます。
みなさまご存じでしょうか、INK WAVE。
9月から始まった Re:Productions(リプロ) が運営する Splatoon3 の非公式リーグで、私が今携わっているリーグでもあります。

今回このノートではINK WAVEのシステムについて、開発秘話的なものをつらつらと書いていこうと思います。
まずはINK WAVEのシステム構築をする少し以前の話から書いていきますのでお付き合いください。

途中レーティングの話をするので、よければ以前書いたこちらの記事も併せて読んでいただくとより楽しめるかと思います。(第一回ではそこまで深堀しないので読まなくても大丈夫です。)

0. プロローグ

「Xパワーについて解説」をノートに書いてから半年後に Splatoon3 が発売され、そこからさらに1年経ちました。

気が向いたら「 Splatoon3 の内部レートやXマッチに関する解説(個人的見解)」を書こうかなーと思いつつ、気づけばはや1年。
気が向く気配はいまだありません。

記事を書く気力が湧かない一方、Splatoon3 のレーティングやそれに伴う対抗戦環境や制限大会の流れをみて、モヤモヤする気持ちが積り積もった結果、行動することにしました。

「レーティングシステムを自分で作って広めたい」

実は、以前からお世話になっている コミュニティで、プラベ bot という名の対抗戦形式プラベのための自動チーム分け BOTを、作成し運用していました。
これは限られたコミュニティ内で楽しく遊ぶためのツールでしかなかったのですが、作ってみると参加者は楽しんでくれていたこともあり、もっといろんな人に使ってもらってコミュニティを盛り上げられないかと考えるようになりました。

一方、今までレーティング的なものはいくつか存在したのは知っており、システムの完成度とは別の観点でハードルが存在しているであろうこともわかっていました。(この話はまた別の機会があれば話します)

私もこのまま一人でなにかを始めようとしても、そのハードルを越える力は自分には今はないと感じていました。
そこで、協力者を募るべく何人かにアポをとり、「こういうことがしたい」、「スプラ界隈はこうなっていけばより良くなるんじゃないか」というプレゼンをさせていただきました。

その中の一人が「れどるふうぉーかー」さんでした。

ここから私の INK WAVE の物語が始まりました。

1. INK WAVE のはじまり

実は私はもともと直接的に「INK WAVEをやるよ」という形でリプロに加入したわけではなく、「なにかできないか一緒に模索しよう」というところが始まりでした。

2023年6月のある日、「今通話できる?」と連絡が届きリプロ鯖の通話へ参加すると、そこにはれどるふさんとあらごしだいこん。さんがいました。

「リーグを作ろうと思ってるんだよね。」

その日の会話は正直ほとんど覚えていません。
その日はおそらく「こんな感じのリーグにしようか」みたいなざっくりとした話をした気がします。私が関係する話は「レーティングを使ってリーグができないか」という話だったような気がしますが、それもはっきりとは覚えていません。

とにもかくにも、これが INK WAVE の始まりでした。

ここにあかずきんさん、Antariska* さんが加わり本格始動していくことになりますが、その話はまた今度。

2. 初期構想

INK WAVE の初期構想ではリーグ名はもちろん、現在とは全く違う形でした。

  • レーティングはマッチングに使う

  • リーグの順位は勝ち点制

  • 結果報告は Google Forms を使う

など。

他にもやりたいことはたくさんあったのですが、どれだけの人が参加してどこまでうまくいくのかが全く不透明ということもあり、最初はできる限り簡単な構想にして、まずは形を作ろうというところでスタートしました。

私自身が最初に取り掛かったのはマッチングシステムの作成でした。
順位に使おうが使わまいが、各チームのレートを出して、実力の近いチームどうしを対戦させるという仕組みは必要でした。

3. レーティングに関する課題

レーティングシステムについては具体的なアルゴリズムや実装方法は次シーズン以降のことも考えて今は公開を控えますが、以前記事を書いた際に勉強したり、プラベbot を作った際にある程度知見を得ていたので、実装自体はそれほど苦労しませんでした。

ただし課題もありました。
全ルールのリーグ制ということで、同じチーム同士が違うルールで連続で対戦(当初は2先にするか3セット制にするかなどは確定してませんでした)することが基本となります。
その際に、レートの変動については、同じチームと対戦した結果を考慮しつつある程度の試合数で収束するような形を模索する必要がありました。

これがどういう話か簡単に説明すると

たとえば
Aチーム:XP平均が3,000越えのチーム
Bチーム:XP平均が2,600前後のチーム
Cチーム:XP平均が2,400前後のチーム
Dチーム:XP平均が2,000前後のチーム
が初戦で当たったとします。

1試合目
A vs B:3 - 0 
C vs D:3 - 0

だった場合、

  • この結果をそのまま 3-0 で処理してよいのだろうか?

  • 3-0 で計算するとして、BがCと 後で逆転不可能な状態にならないだろうか?

など考慮すべきことがあるというお話です。
当然、XPを基準としないリーグのため、どのチームも初戦は未知数であり、どう頑張っても最初はレートがぐちゃぐちゃになってしまうこと自体は避けることはできません。
ただし、例えば、3セット1マッチではなく、バンカラマッチのように1セットごとに対戦相手を変えることができればこの影響を軽減することは可能です。

とはいえ、非公式リーグということでプラベのヘヤタテや結果報告の手間を考えると1セットごとに対戦相手を変えるような仕組みを作るのは非現実的です。

そういった中で同じ相手と連続で対戦するのは何回まで許容できそうか、その場合レートの更新はどうすればよいのか、などについて良い方法を模索したというお話です。

4. マッチングに関する課題

レートの算出方法が決まった後、最初にして最大の関門が待ち受けていました。

マッチング をどうするか問題です。
当然こちらについても具体的なアルゴリズムや実装方法は書くことはできませんが、何が難しいのかというのをできる限りわかりやすく書いてみます。

(補足)
マッチングは専門的に言うと最適化問題というもので考えることができます。最適化については奥が深いのでここでは深く言及しませんが、「最も良いものを探す問題の定式化の方法」や「その良いものを探す方法」について研究されている分野です。

課題1 組合せ数

まず最初の課題は組合せ候補の多さです。

参加チーム数をN(偶数)とすると、その対戦の組み合わせ総数は

$${\frac{\dbinom{N}{2}×\dbinom{N-2}{2}×\dbinom{N-4}{2}×⋯×\dbinom{2}{2}​}{(N/2)!}}$$

で、例えば 20 チームの参加の場合であっても、約6億5000万通り存在するようです。(計算間違ってたらすみません。)
チーム数が増えればさらに爆発的に組合せ数は増加し、各チームにとって良い対戦相手を探すのが難しくなっていきます。

実際、この課題には先人たちの知恵を借りながら効率の良い計算方法を実現しました。
どうすれば効率よくできるかという話は今回は飛ばしますが、もし興味があれば個人的に聞いてください。

課題2 最適とは?

難しいのはこれだけではありません。
たとえば

Aチーム:レートが3.000のチーム
Bチーム:レートが2,750のチーム
Cチーム:レートが2,700のチーム
Dチーム:レートが2,350のチーム
Eチーム:レートが2,300のチーム
Fチーム:レートが1,800のチーム

がいたとしましょう。

パッと見たところBチームにとって良さそうな相手はCチームではないでしょうか。
同様にDチームにとってはEチームがよさそうです。
ではあまったAチームとFチームで対戦で

Bチーム (レート2750) vs Cチーム (レート2700)
Dチーム (レート2350) vs Eチーム (レート2300)
Aチーム (レート3000) vs  Fチーム (レート1800)

・・・とはならないですよね。

では仕方がないので上から順番に当てていきましょう。

Aチーム (レート3000) vs Bチーム (レート2750)
Cチーム (レート2700) vs Dチーム (レート2350)
Eチーム (レート2300) vs  Fチーム (レート1800)

さて、これで本当に良いのでしょうか・・・?

誰かにとって良い組合せでもほかの人にとっては良くないみたいな話は存在しうることで、この例みたいに何かを犠牲にしなければならないことも起こりえます。

ここは本当に難しい問題でした。

課題3 対戦回数について

他にも考慮すべきことがありました。
一度対戦したチームとの再戦をどう考慮するのか問題です。

Splatoon シリーズをプレイ したことのある方なら経験があると思います。
リグマやオープンで連続で同じチームと対戦したことが。

もちろん、2回目だったら「リベンジだー!」って燃えることもあるとは思いますが、3回4回と続くと「もういいよ」ってなることもあったと思います。

何も考えずにレートだけを見てマッチングをすれば 当然 INK WAVE でもこの現象は起こりえます。
特にシステムを構築している段階では何チーム参加してくれるのか、さらに言えば、1つの時間枠で何チームエントリーするかは始まってみないとわからず、どこまで再戦を許すのかは非常に難しい問題でした。

課題2で言及したように、レートだけを見たときですらマッチングは難しいのですが、これにさらに対戦回数まで組み込むとなると、より複雑になってきます。(最適化の分野でいうと多目的最適化と呼ばれるものになります)

課題2と課題3に取り組むにあたり、まずは自動マッチングを実現することがスタートラインでした。そのために実力の近さや対戦回数を一つの軸に統合して、数式化する作業をしました。(詳細は公開できませんが大変でした・・・。)

そのうえで、課題2と課題3については、どう頑張っても参加者全員が完全に満足できるものというのは正直不可能に近く、何度も何度も微調整は重ねましたが、シーズン0が終わった今でもなお課題は山積みです。
そして、その中にはそもそもシステムで根本的に解決できない部分もあります。

ただ、私が今回取り組むにあたって大切にしていたのは、妥協するならどの部分にするのか、その選択ができるようにあらかじめシステムに組み込めるように最善を尽くすことでした。

5.次回予告

今回はここまでにします。
次回は

  • リーグ開催が近づいてきて構想がどう変わっていったのかの話

  • INK WAVE シミュレーションを作った話

  • BOTで進行ができるようにした話

このあたりをお話しようかなーと思っています。

もしよければ記事やINK WAVE に関する感想やコメントをいただけると励みになります。
INK WAVE 運営は有志で集まったメンバーです。
一切の金銭の受け取りもしておらず、その原動力はこの界隈の発展であり、みなさんの体験の満足度が我々のモチベーションです。
noteのコメントでも twitter でもマシュマロでも何でもOKですので皆さんの声を届けてもらえると嬉しいです。

最後まで読んでくださってありがとうございました。

この記事が気に入ったらサポートをしてみませんか?