スクフェス日記-「パターンC」の自分なりの理解から近似式を導出したかった
この記事は,「パターンC」について私が理解したことをメモとして残しつつ,もしかしたらどなたかのお役に立てたらよいなと思い書きました.ご一読いただければ幸いです.
1. 「パターンC」の出自と概要
2019年4月23日,浦の星女学院パソコン部 (@devsifmatch)さんより,以下の超重要なツイートがありました.
マニアックですが超重要なネタです。高レベルのCOMBO FEVERを使うと画像のような状況が起きます。この場合、最も確からしい挙動はA〜Cのどれだと思いますか?実機のスコアと比較した結果、最も近いのはCでした。SIF Matchは現在Bなので、近い内にCに変更しようと思います。Aで計算すると壊れます😇 pic.twitter.com/oIL0mTvIbJ
— 浦の星女学院パソコン部 (@devsifmatch) 2019年4月23日
このツイートを起点として,多くの方がその検証を行い,この指摘はユーザ間では正しいと考えられるようになりました.そして「パターンC」という言葉が,上記の仕様を指す新しい言葉として一部のユーザの間で市民権を得たように思います.
「パターンC」の仕様については,上記の浦の星女学院パソコン部さんのツイートや,下記のおくーや(@Octilleryo)さんのツイート(ブログ)がこれ以上ない分かりやすさですので,是非一読をおすすめします.
おくーやさんがブログを更新しました。
— おくーや (@Octilleryo) 2019年5月1日
今話題の判定強化の発動に関する仕様と、簡単な判定URの性能比較について書きました。https://t.co/D12WJhKZXc
私なりには「パターンC」とは次のような仕様であると理解しています.
- 効果時間がある特技に関する仕様のこと(○秒間効果を受ける,といった説明の特技.タイマー系は除外)
- 特技の効果時間中に発動機会が訪れた場合の抽選方法に関する特殊な仕様のこと(特技発動から○秒の間にリズムアイコン○個が流れる場合)
- 効果時間中に発動機会が複数回あっても,抽選は効果時間終了後に1回だけ行われる仕様のこと(従来は複数回分の抽選が行われていると考えられていた?)
「効果時間がある特技」とは,具体的には「判定強化」「PERFECT SCOREアップ」「COMBO FEVER」「パラメータアップ」等のことです.
最後の項について,「特技が連続して発動する場合,前の特技の効果時間中ではなく,効果時間が終了した直後に発動する」という仕様は,以前から知られていたようです(私は知りませんでした…).これについては以下の通り自分でも確認ができました.
今更知ったのでメモとして…
— siratama (@siratama_z) 2019年4月29日
同じ部員が判定強化を2回連続で発動させるとき、2回目の発動は1回目の効果時間が切れた直後になることの検証(つまり効果時間は重複しない) #スクフェス pic.twitter.com/LAPokIZN2y
「曲が終わっているのになぜか特技が発動した」といった現象は,この仕様に起因していると考えられます.この仕様は言い換えると「1回の特技発動による効果時間(≒効果を受けるアイコン数)が保障される」となり,一見良心的に見えます.
「パターンC」は一部のユーザにとっては大変衝撃的な仕様でした.その理由を端的に表すならば「特技レベルを上げることで特技が弱くなる」ことが起こり得ることです.ここで特技が「強い/弱い」とは,特技によって獲得できるスコアの期待値が「高い/低い」という意味です.「パターンC」に関わる特技としては「特技の効果を受けるアイコン数の期待値」と換言することができます.つまり「特技レベルを上げることで期待値が下がる」という,極めて不自然な現象が起こり得ることが,大きなインパクトを与えました.
2. 効果時間系特技の期待値計算の難しさ
スクフェスの楽しさの一つとして,ユニット編成を考える楽しみがあります.良いかどうかはともかく,ユニット編成の際に多くの方が考えるのは「どのような編成がより高いスコアを出せるか」ということであり,そのために特技の期待値は一つの関心事となっています.
実は「パターンC」の発見云々にかかわらず,効果時間系の特技の期待値(以下アイコンカバー率と言うこともあります.効果を受けるアイコン数の期待値÷総アイコン数)を求めることは一般的に難しいと考えられます.例えばスコアURの期待値計算はシンプルで,1アイコンあたりのスコア期待値は次の式で求められます.
- スコア特技の1アイコンあたりの期待値=獲得スコア量×2.5×発動確率÷発動機会間隔
ここではチャーム装備を前提としています.例えば俗にいうプーほの(最強スコアUR)の場合,期待値は3700×2.5×0.59÷21=259.9となります.スコアURの特技レベル8の1アイコンあたりのスコア期待値は概ね250前後となるように調整されています.
これに対して,効果時間系特技の期待値計算は,スコア特技のような立式を行うことは困難です.その理由として以下が挙げられます.
- 効果時間中に効果を受けるアイコン数は楽曲のアイコン密度(1秒あたりのアイコン数)によって変わる
- 特技が発動するタイミングはリズムアイコンの倍数とは限らない(前の特技発動状況によって変わる)
- 特技の発動によって効果を受けるアイコン数は,発動したタイミングによって変わる(曲の終わりに発動しても効果を受けるアイコンは増えない)
特定の条件を仮定すれば,効果時間系特技の期待値(アイコンカバー率)を式によって表現することが可能な場合がありますが,一般的な立式は極めて困難か,あるいは非常に見づらい式となります.
ではどのようにして期待値を求めるのかというと,「プログラミングによるシミュレーション」または「実機によるプレイ」からの「平均値の算出」が主流と思われます.先述の浦の星女学院パソコン部さんやおくーやさんをはじめとして,多くの知見ある方は独自に検証を行っておられます(尊敬します).「パターンC」の発見は,シミュレーション(=理論)と実機プレイ(=現実)の結果が合わないことがきっかけとなりました.
「パターンC」が発見されたことで,効果時間系の特技の期待値は,これまで考えられていた値よりも低くなることが分かりました.しかし多くの方が検証した結果,性能劣化の程度は特技や条件よって変わることが分かり,それが「パターンC」の複雑さを表しているように思います.
3. それでも期待値を立式したいという感情
知見ある方によって検証された結果は非常に貴重です.多くの人にとって分かりやすいように,特技の期待値を一覧にまとめておられる方もいます.私を含めて多くの人は,その結果を自身のユニット編成や育成計画の参考にしていると思います.
しかし,これは少数派かもしれませんが,いわゆる標本平均としての期待値を見て「どうにかしてこれを計算で求めることができないか」と考える人々がいます.私はその一人ですが,このような欲求の源泉は以下のようなものであると思います.
- 立式ができれば各変数が期待値に与える影響を知ることができる(知りたい)
- 立式することは難しい定理の証明と同じくらい気持ちいい
- 立式できないのは悔しい
要するに気持ちの問題なのですが,「パターンC」に関して言えば「どのような条件の時に特技性能が下がるのか,その本質的な問題は何か」ということはとても気になります.そしてそれを説明できるならば,「パターンC」の本質を理解した,と言えるのではないかと思うのです.
とはいえ,厳密な立式は難しそうで,しかもそれはあまりに複雑な形になりそうなことは容易に想像がつきます.そこで,次の自然な欲求として「できるだけ簡単かつ誤差の小さい近似式を導出できないか」という発想が生まれます.そしてそれを実際にやってしまった方がおられるのです.
4. 実際に近似式を導出してしまった方が近くにいた
令和元年5月3日,レン@凛ちゃん推し(@SnowhaRinchan)さん(以下レンさんと呼びます)がしれっと次のブログを投稿しました.
はてなブログに投稿しました
— レン@凛ちゃん推し (@SnowhaRinchan) 2019年5月3日
スクフェスの「パターンC」に関するマルコフ過程を用いた理論解析と特技性能の近似式 - Snow Ha凛ちゃん! https://t.co/V5ZnZwTz5c #はてなブログ
判定強化等の特技に影響のあるパターンCについて、「何がどれくらい、なぜ強さの変化に寄与しているのか」を解析しました。
実はレンさんはなぜか私と相互フォローの関係だったのですが,世間が10連休を満喫している中で突如投稿された記事の内容は,私の想像を遥かに超えるものでした.その内容を一言で表すと「近似式作りました」なのですが,私は導出された近似式そのものよりも,むしろその導出過程と結果の検証の素晴らしさに感動を覚えました.まだご覧になっていない方は是非ご一読をおすすめします.私は半分も理解できていませんが,それでも読み進めることができるのは,文章力と論理展開の素晴らしさに他ならないと思います.
レンさんの導出した近似式については上記ブログもとい論文を参照していただくとして,近似式の導出方法は唯一絶対のものではないはずです.レンさんはマルコフ過程を用いたモデルを構築しましたが,それが最上級に美しいとしても,別のモデルがあるのであればそれを見てみたい,と思うのが自然な欲求です.仮に同じ近似式を得るものだったとしても,それは2つの異なるモデルが本質的に同値であることを示すことになり,それはそれでひとつの結果です.
そこで,私でも何かできるのではないかと思い,自分なりのモデルを構築して近似式を導出してみようと思い立ちました.
5. (適当な)試行錯誤の末何の成果も得られませんでした…
※ここから先は正真正銘の駄文ですのでご了承ください.
結論から言えばよい結果は得られなかったのですが,いろいろと考える中で当たらずとも遠からず的なものがいくつか得られたので,記録として残しておきます.
- パターンCに対応したアイコンカバー率のシミュレーションプログラムの試作(これが間違っている可能性あり)
https://siratama-z.github.io/my-pages/ - 上記ツールを用いて変数をいろいろ動かして遊んでみる
- 得られた結果を眺めて考えてみる
- 特定条件下におけるアイコンカバー率の算出
- 特技効果時間(秒)÷発動機会間隔(秒)が1以上2未満の場合の近似式の導出(失敗)
5.1. パターンCに対応したアイコンカバー率のシミュレーションプログラムの試作
私はプログラミングが得意ではありません.これだけははっきりと真実を伝えたかった.
自分なりに正しそうだと思って組んでみたのですが,この結果が正しいかどうかを自分では検証できないことが致命的でした.なので先人の結果(特に先述のおくーやさんのブログ)を頼りに結果の比較を行ったのですが,この誤差が概ね±1%程度だったので,多少間違っているが大きく外れているわけではなさそうだからまあいいだろう,と判断しました.
githubのWEBサイトはjavascriptで実装しているのですが,元々はjavaで作っていて,後述する結果等も全てjavaによって得たものです(ロジックは同じはず).
5.2. 自作ツールを用いて変数をいろいろ動かして遊んでみる
これ以降,変数を記号で表した方が何かと便利なため,以下のように記号を定義します.
- 楽曲の総アイコン数: (個)
- 楽曲の長さ: (秒)
- 発動機会間隔: (個)
- 発動確率:
- 効果時間: (秒)
- 効果時間中に流れるアイコン数: (秒)※ は より大きい最小の整数を表す(要するに切り上げ)
- 定常状態におけるアイコンカバー率:
- 実アイコンカバー率:
上記以外の記号も用いることがありますが,基本的なものは上記で十分です.楽曲ではアイコンが等間隔に出現すると仮定します.このときアイコンカバー率の期待値は,,,,, によって決まります.つまり文章で言えば次のようになります.
リズムアイコン 個ごとに の確率で 秒間効果を受ける特技の,アイコン数 個,長さ 秒の楽曲におけるアイコンカバー率の期待値を表す近似式を導出したい
さて,「変数をいろいろ動かして」といきたいところなのですが,変数が5つあるため,どのように動かしたものかと考えました.その結果,「定常状態を考える」ことにしました.
「定常状態」については,先述のレンさんの論文からヒントを得たものですが,ここでは「楽曲が常に同一のアイコン密度で無限に続く場合にアイコンカバー率が収束する」ことを証明なしに用いることとします.つまり (アイコン密度)を固定したとき, を十分大きくとれば,アイコンカバー率は一定の値に近づきます.この収束先が となりますが,これを他の変数を用いて近似することが当面の目標となります.
は具体的には ,, によって決まります.これで説明変数を2つ減らして3つとすることができます.実はさらに と はその比の値 (つまり効果時間と発動機会間隔の比)が重要なので,最終的には と の2変数で を表せると考えていました.
定常状態におけるアイコンカバー率を求めることは,実アイコンカバー率の近似式を導出することと何の関係があるのでしょうか? 私は で を近似できると予想しました.この式の意味するところは,楽曲中の最初の 個のアイコンは100%効果を受けないため,定常状態におけるアイコンカバー率よりも実アイコン率の方が低い値となり,それは を 倍して近似できる,と考えました.
仮にこの近似の精度が悪かった場合, 番目から 番目までのリズムアイコンが効果を受ける確率が定まっていることを用いて近似式を修正すればなんとかなると考えていました.
そんなわけで,,, の3変数をいろいろ動かして, がどのように変化するかを調べました.具体的には ,, として全てのパターンのシミュレーションを行いました( は0.01刻み).シミュレーション結果が正しいことを祈りつつ,Excelにぺたぺた貼り付けて適当にグラフ化する等しました.
5.3. 得られた結果を眺めて考えてみる
※ 以下の記述は「パターンC」というよりは「効果時間系特技」の仕様に関する考察です.紛らわしくて申し訳ありません.
結局何が分かったのかというと,最も大きな発見(と個人的に思っているもの)は次のグラフです.
横軸は ,縦軸は です. を固定して,数パターンの についてグラフ化したものです.基本的には が増える(つまり効果時間が延びる)ごとに は増加するように見えます.この傾向は任意の , に対して同様に確認されます.しかしすぐに気付くように,特定の では が減少しています.これこそが効果時間系特技の本質であると理解しています.
上記のグラフにおいて が目立って減少するのは, のときです.つまり が の倍数のとき, は減少しているように見えます(この言い方は正確ではないため後に修正します).この現象をどう解釈すればよいでしょうか.
この問題はレンさんの論文でも触れられていますが,これは効果時間中に何回発動機会が訪れるかに関係しています.私の表現では,例えば は効果時間中にギリギリ2回目の発動機会が訪れないことを意味します. のとき,特技が発動したアイコンから数えて21番目に1回目の特技発動機会が訪れます.この次の発動機会は41番目のアイコンですが,効果を受けるアイコンは40個なので,ギリギリ届かないというわけです.ではなぜ :39→40 でガクンと下がるのでしょうか.次のシーケンスを見て下さい.
の場合:★○○○○○○○○○○○○○○○○○○○|☆○○○○○○○○○○○○○○○○○●■|☆○○○…
の場合:★○○○○○○○○○○○○○○○○○○○|☆○○○○○○○○○○○○○○○○○○●|■○○○…
★:特技発動
☆:特技発動機会
○:リズムアイコン
●:特技効果が切れるアイコン
■:効果時間中に発動機会が訪れた場合に抽選が行われるアイコン
|:20個ごとの区切り
★~●までのアイコン数が 個となっています.この違いこそが効果時間系特技の期待値が減少する現象(激ウマギャグ)の説明になっています.どちらの場合も効果時間中に☆を通過しているため,■で発動抽選が行われます.確率は ですが,抽選に外れた場合に大きな違いが生まれます.
のとき,■の直後は☆です.つまり,■で発動しなくても,次のアイコンで再び抽選が行われます.一方 のとき,■で特技が発動しないと,次の発動機会は20個先のアイコンとなります.よって多少乱暴な表現をすると, の場合は抽選を2回行っているような状態となっています.例えば のとき,抽選1回で当たる確率は50%ですが,抽選2回では75%となります.この圧倒的な差が, の微差によって引き起こされています.スクフェスの言葉で表現すると,特技の効果時間と曲のアイコン密度の相性によって,アイコンカバー率が大きく変動する可能性がある,と言えると思います.
一般に特技レベルが上がると, と (すなわち )が上昇します. が増えると も増えますが, が増えても曲によっては が増えるとは限らない,ということが分かります.
現実には,アイコン密度は楽曲によって異なる他,楽曲中も譜面によって変動します.そのためここまで顕著な差は出ないと思いますが,これに近いことは起こりえます.
実は,上記の例は「パターンC」の条件を満たしていません.つまり今までの想定仕様でもこの問題は発生しており,「パターンC」で期待値が減少する現象とは別の問題です.ここまで長々と書いてやっと気付きましたごめんなさい.
「パターンC」はこの問題の延長として考えると,効果時間が切れた後の抽選確率が ( の場合)だと考えられていたが実際は だった,という仕様だと換言できます.例えば のとき,効果時間が切れた後の抽選確率は75%だと思われていたが実際には50%だった,となります.先述の現象との合わせ技によって,より大きな差を生み出していることは間違いありません.
グラフをもう一度見てみると, 以外にも, で少し減少しています.この現象も先述と同様の説明ができます.例えば のとき,特技が2回連続で発動すると,2回目の効果時間が切れた後の抽選確率は となります.の場合は効果時間が切れた後のアイコンは特技発動から59番目のアイコンとなるため,この抽選に外れても2個先で再度発動機会を得ることになります.2回連続で特技発動した場合の挙動のため,期待値への影響は が の倍数であるときよりも小さくなっています.
の近似式を導出するということは,このグラフを数式で表すことを意味していますが,正直無謀です.ですがもう少しだけ粘ってみました.
5.4. 特定条件下における の算出
先述の通り,一般的に を近似式で表すのは難しそうだと判断しました(それをやってしまったのがレンさんの論文です). が の倍数になるところでは大きく変化しますが,それ以外の部分は緩やかな線形の変化であるように見えます.要するに であれば,少なくとも直線近似ができるだろうと考え,そのために必要な考察を行いました(失敗しました).
実は においては, は簡単な計算で求まります. です. とはスクフェスの言葉で表すと「発動機会間隔よりも効果時間が短いか同じである場合」であり,効果時間が極端に短いか,EASYなどアイコン密度が極端に低い状況を表します.発動機会間隔が効果時間中に訪れないため,単純な計算で求まります.特に のとき, となります.
次に のとき, は比較的簡単な確率漸化式の極限となります.計算結果は省略しますが, となります.例えば のとき, となりますが,先述のグラフの の線(緑色)は点 を通っているように見えると思います.よって数学的にも実測値としても正しいように見えます.
この記事は元々「パターンC」について何かを書きたいと思って書き始めており,そうなると の場合の考察が最も書きたかったことのはずなのですが,難しそうなので後回しにしてしまいました,すみません!
5.5. の場合の の近似式の導出(失敗)
「パターンC」関係ねーじゃん!というツッコミはおいといて(多少は関係します),前述した直線近似を一旦やってみます.そのための準備として,横軸の変数として ではなく を採用します. の値が等しい2つのグラフは, と の値が違っていてもほぼ同じグラフを描くように見えるため,このようにおきました.
直線の方程式を求める場合,2点の座標が具体的に分かれば,式が自ずと定まります.そして1点は既に求めており, となります.ではもう1点はどの点を採用すべきか,自然な発想は なのですが,これは問題があります.なぜならば は が大きく減少した点であり,この2点を結んでも近似とは程遠い式ができてしまいます(下図).
つまり,近似式を導出するためには の直前の点を採用すればよいのですが,これは実測値であるため,計算によって算出することができていません.つまり「実測値で近似する」というよく分からないことになるため,「 の手前の点」は採用できません.
ではどうするのかというと, としたときの の左極限を求めればよいことになります.これを求めるための一つのアイデアは 5.3. で考えています. が2に限りなく近いとき,抽選をダブルで行っているような状態となりました.よって の の左極限は,次の確率漸化式を解くことで得られると考えました(それでいいという証明はありません).
を正の整数として,次のように文字を定義する.
であることに注意すると,次が成り立つ. ,, より,帰納的に が求まり,したがって を求めることができる. 具体的な方法としては,この確率漸化式を行列で表現して,変換行列( とおく)の固有値と固有ベクトルを求めて を求めることができる. 途中計算は省くが,固有値が となり, が求まる. |
…いやあ地獄のような途中計算でしたが,結果はとても綺麗です.もっと簡単な計算方法があったのではないかとも思います(2019/5/13追記 極限だけを考えることで固有値を求めるまでもなくもっと簡単に計算できました.).このようにして求めた値を前述のグラフにプロットしたものが以下の図です.
これはかなり話がうまくいっているのではないでしょうか!この結果から, の近似直線を求めることができそうです.求める方程式は,2点 を通る直線なので,以下が成り立ちます.
これを整理して, を得ます.
この近似式の誤差を調べると,RMSE(平均平方二乗誤差)は0.023となり,2.3ポイントの誤差があります.誤差の理由は,実際には は の一次式で表せないことに起因するのですが, で小さくない減少が発生することと,実は が大きい場合は 付近の増加量が他の定義域よりも大きい(つまり直線ではなく上に凸の曲線の方が近い)ことが主因と考えています.
以下は 別の誤差の一覧ですが, では予測値が実測値よりも小さい標本が多く,逆に では予測値が実測値よりも大きくなっています.
というわけで,非常に残念な結果となってしまいました…ここまでご覧いただいた方には本当に申し訳ないのですが,読んでいただいてありがとうございます.
一応ですが,ここまで求めた近似は定常状態におけるアイコンカバー率 でしたので,実際の楽曲における近似を求めます. という予測を立てていたため,最終的に以下の近似式を得たことになります.
- 楽曲の総アイコン数: (個)
- 楽曲の長さ: (秒)
- 発動機会間隔: (個)
- 発動確率:
- 効果時間: (秒)
- 実アイコンカバー率:
最後に,実測値との誤差を確認します.実測値は前述のおくーやさんのモンテカルト法による結果の一部を拝借させていただきました.勝手にパクってしまい申し訳ありません.私のシミュレーション結果と誤差があることを確認しており,正しい結果と比較するためにお借りしました.
RMSE(平均平方二乗誤差)は0.028です.やはり では誤差が大きくなってしまいました.この誤差を修正する案は思いつきませんでした.
6. 結局「パターンC」とは何なのか
以上の検証から,私なりの「パターンC」の結論を列挙します.
- 「パターンC」は,部分的に見ればアイコンカバー率を効果時間に比例させる効果を与えている(つまり緩やかに上昇させている)
- 「パターンC」は,効果時間が発動機会間隔の2~2.6倍程度となるときに目立って性能が劣化する
- 「パターンC」は,発動確率が低いほど性能劣化の影響が大きくなる発動確率が50-60%のときが最も性能劣化の影響が大きくなる(2019/5/13訂正)
「パターンC」と「パターンB」を比べると,効果時間が発動機会間隔より長い場合の発動確率に差が出ます.「パターンB」の場合,効果時間が長くなると確率が高くなりすぎてしまいます.「パターンC」とはアイコンカバー率の上昇速度を抑えるための仕様であると考えます.直接的に言うと,意図された仕様ではないかと思います.ただ、2~2.5倍では効果が下がりすぎのように感じます.これが気持ちがもやっとする原因です.発動確率が高ければ倍数での劣化を抑えられるため,発動確率が低い特技よりも安定感がありそうな気がします.
の左極限と右極限の差が性能劣化の程度を表すのですが,これは と表すことができます.これをグラフで表すと, 付近で最大となることが分かります(以下のリンクも参照して下さい).
https://www.wolframalpha.com/input/?i=plot+2p%5E2(1-p)%5E2%2F(1-p%5E4)+from+p%3D0+to+1
この最大値が0.13程度なので,すなわち を境界として,アイコンカバー率にして最大13%程度の性能劣化が生まれていることになります.特技レベル8の部員だと,発動確率は50-80%程度に分布していると思うので,発動確率が低めの部員はこの影響を受けやすいと言えます.
現実的には楽曲のアイコンは等間隔ではなく,またbpmやタップのタイミングとの関係もあるので、シミュレーション結果ほど性能劣化を感じることはないように思います.気にしすぎるのはよくないかもしれません.でももやっとします.
「パターンC」は,実は であればその影響があります.しかし 程度ではその影響は小さく,つまり「パターンB」に近い仕様です.この付近でのアイコンカバー率の上昇速度が,発動確率が高ければ高いほど速くなるため,私の導出した近似式は精度が低いものとなりました.おそらく で近似式を導出すれば,今度はそこそこ精度の高いものができるはずです(やるとは言ってない).
7. 終わりに
結局何の成果も得られていないのですが,最後までお読みいただきありがとうございました.