見出し画像

【STEP】ソーダを1本も使わず一瞬で10万回「試走」できるようになった話【Python】

2023/09/19追記:マスタリー上限の仕様を変更し、通常得られるポイントとを分けて計算し表示するようにしました。

2022/09/08追記:シミュレータに絆、体力、タルト、付箋に関する仕様を変更し、エクセレントの計算方法を変更したv3を配布開始したため命令部(3つ目)の書き方が少し変わりました。この記事はv3を基準とします。

2022/09/08追記:シミュレータのテンション、ファン数、シーズン目標に関する仕様を変更したv2を配布開始したため命令部(3つ目)の書き方が少し変わりました。
この記事はv2を基準とします。

ワザップではないです。

このnoteは、私が製作したSTEPの育成シミュレータについて、基本的な使い方や細かい仕様を解説するものです。
Pythonとかプログラミングのことなんもわからん!wって方にもこれを読めば動かすことはできるようになることと自己満足を主目的として書きます。
途中でオーディションとサポのリストがあるとはいえ長いので全部理解しようとすると多分休日溶けます。

これがv3

これがv2

これがv1


v1を使って色々計算した結果について書き直し、新しくv3を用いて色々計算した結果をまとめたnoteがこちら。
どうぞよろしく。



使い方

早速使い方の説明です。
まず今回用いたgoogle colaboratoryというサイトは、Pythonという言語の.ipynbというファイル形式を、ネット環境さえあれば事前準備無しで誰でも動かせる大変優れものなのですが、これにはいくつかの特徴があります。

①プログラム全体が「セル」という単位で区切られていて、セルを「実行」するとそのセル単位で実行される
②コード自体はドライブに半永久保存されるが、それを実行した結果はセッションごとに一時保存されるのみで、一回ページを閉じたりある程度の時間放置すると全部実行し直す必要がある(そこまで手間ではないと思いますが混乱を避けるため一応)

演算や各種変数の定義部(1つ目のセル)

リンクを開くと、このような画面になると思います。

今回のシミュレータは3つのセルからなっていて、一つ目が各種変数や計算、グラフの表示の定義部分です。色々説明(#以降の緑文字。コメントアウトと言います)はつけていますが、内容はそこまで気にしなくて良いです。
説明は"理解者"と未来の自分に書いてるものです。魔法の呪文だと思ってください。ただしこれは計算そのものの話なので、「実行」はしてやる必要があります。
実行は、下のようにセルをクリックした状態でShiftとEnterキーを同時押しするか、左の再生ボタンみたいなやつを押すか、もしくはメニューバーの「ランタイム」にある「〇〇を実行」みたいなやつから好きなのを選んでください。一回は全部を実行する必要があるため、そのセッションで一回目の実行は「すべてのセルを実行」を押すと手間が若干省けます。二回目以降は変更したセルのみ実行すると、他の変わってないセルをわざわざ計算し直す時間が省けます。(特に二つ目のセルは数秒程度かかる)

オーディションとサポートの定義(2つ目のセル)

続いて2個目のセル。ここはオーディションとサポートのリストの定義部です。
オーディションについてごちゃごちゃ色々書いてありますが、一番理解して欲しいのは"2-10"という文字列が、S2残り10週にある「明日のアイドル一番星」というオーディションを指し、"2-7"という記号が、S2残り7週にある「アイドル十八番うた自慢」というオーディションを指すということです。

2022/09/08 オーディション成功によりテンションが上がるようにしたため
オーディションの中身が少し変わり、画像も差し替えました。

つまり一番左の文字列と、一番右に書いてあるコメントを読めれば最低限使えるようになっています。受けるオーディションのテンプレはこちらで用意してるので必ずしも理解していなくて良いですが、オーディション関連を弄ってみたい場合は以上のことを理解する必要があります。

2個目のセルにはサポートのリストも書いてあります。
まあ見て分かる通り、「デフォルト」の並びのうち、ある程度計算する価値のありそうなものを選んで載っけてます。

これも、"方程式"と打てば「【永遠の方程式】風野灯織」の完凸時のステータスやサポートスキルが自動で読み込まれるようにしてあるので、最低限必要なのは「これに定義してある名前」です。一々正式名称を入力するのが面倒なので略称で登録しているのですが、勿論Pythonくんはカードの正式名称なんて知ったこっちゃないので、"永遠の方程式"とでも入力すると普通にエラーになります。
もし正式名称/自分の使ってる呼称じゃないと不便、ということでしたらご自分で書き換えてください。例えば"海"の部分を"海灯織"に変えて「実行」すれば、"海灯織"というのがこのプログラム中での名前に書き変わります。

また3凸以下で計算したい場合は、ステータスやサポートスキルの入力規則を理解する必要がありますが、大体見れば分かるようになっていたりコード中にコメントを付けているので分からなければここのコメントか作者Twitter(@washington0706)までどうぞ。他の質問も勿論受け付けてます。


命令部(3つ目のセル)

最後に3つ目のセル。いよいよ自分の考える設定を入力します。ぶっちゃけ詳しい内容はここだけ理解していればOKです、

これがサンプル。

編成→サポート名をlistで入力
ex_status→サポートに貼るステータス系の合計値を配列で入力。Vo5人分、Da5人分、Vi5人分、Me5人分の順番です。
ex_stay→ex滞在率の値を配列で入力
ex_perf→exパフェの合計値を入力(%表記ではない)
audition→受けるオーディションとライブをlistで入力
p_unit→Pアイドルのユニットを数字で入力
init_point→調整用のオフセット。今のところ使ったことがない。
exhibition→エキシビに負ける場合は0(1以外であればなんでもいい)入力、今のところ使ったことがないその2。
init_tens→テンション初期値を入力。デフォルトで50、金ex1で80、虹や緑アロマで100
init_bond→タオルなどのアイテムやexによる絆値の上昇量を配列で入力。
tarte→持ち込むタルトの個数をlistで入力。左から黄色、青、黒。
sticky→持ち込む付箋の個数を入力。

上のサンプルに設定できるものを全て書いたので物々しいですが、実際に計算するときは次の画像のようにシンプル(当社比)になります。

このcase1というのが計算に使う設定で、produce(N,case1)というのが「case1の設定でN回計算した結果を知りたいよ教えてね(見せる方法がproduceという関数で、1個目のセルで定義した)」という意味です。
case1については、
case1={ 内容 } が大枠で、その中にカンマで区切られた構成要素が入ってます。大体はサンプルの所に書いてある説明で分かっていただけると思うので、ここでは3点取り上げます。

全体に言えることですが、引用符(" "←これ)だったりカンマなどの記号は機械が理解するために必要な記号なので消したりせず、数字や文字列だけを書き換えてください。

"ex_stay"はサポの滞在率のことですが、これはnp.array()という呪文の中に滞在exの数値のリスト[45,30,30,45,55]が入っているという形です。この隅付き括弧[]は丸括弧()でも良いです。この例だとかわいい咲耶とノー墨に金滞在3枚、キュン甜よしよしに銀滞在3枚、スペンサーに金滞在1枚と金滞在2枚を貼っている格好ですね。
ただし、全ての滞在が同じであれば[45]*5という表記をすると、これは[45,45,45,45,45]と同じ意味になり、画数が少なくて楽です。虹滞在3枚と金滞在3枚を比べる時などに便利。

"audition"は行くオーディションとライブのリストで、上で説明したように"3-10"などオーディションを書き並べるのですが、どうせ行くオーディションなんてたかが知れてるので、minimumなどのテンプレを用意しました。詳しくはexサポ考察noteに書いてありますが、これは主に特化ポジ担当育成用のオーディションリストで、他2つが脇育成用のものです。


これも実行すると、結果が出力されて嬉しい。やったね!

あとは、育成比較用の関数としてshow_difference()という関数も用意しました。
例えばshow_difference(N,case1,case2)というのを実行すると、まずcase1でproduce()した結果が表示され、次にcase2でproduce()した結果が表示され、最後に(case1の結果-case2の結果)という差が表示されます。
件のnoteを書くときに重宝しました。

あと試行回数やマスタリー上限の価値、表示する点(上位何%を表示するか)などはここの数値をいじります。

仕様などについて

最後に細かい仕様の話をば。
当然と言えば当然ですが、シミュレータというのはあくまで現実の模造な訳なので多少の誤差や単純化が必要です。
意図的に単純化した部分は計算時間の都合や私の腕の問題などもあるため、もし今後方法を思いついたら改善はしていきたいと思います。

(ほぼ)正確に実装できてる部分
・サポのステータス
・各種レッスンマスタリー
・ユニマス
・パーフェクト、パフェマスの効果
・施設マスタリーの効果
・エクセレントブースト
・オデを受けるとその勝利報酬のポイントが自動的に計算される
・滞在率
・体力
・絆値

シミュレータ作成にあたり自力で集計した部分
・パフェマス、施設マスタリーの発動確率
・絆赤ゲージの場合のエクセレント確率

・エクセレント確率

単純化した部分
・絆の初期値は赤のみ(実際は普通の完凸SSR+タオルだと黄、シャツだと赤)
・体力については未実装(「休む」なら予めターンを入力する必要がある)
最初から常に赤テン←↑仕様変更により自動的に計算するようにしました。
マスタリー上限は対応するポイントに還元分けて計算するようにしました
テンマス(無印)、トークマスタリー、雑誌マスタリーは未実装
・サポートイベントやアイドルイベントは初期値として与えるしかない(特にイベブは自分で計算するしかない)
・New Face!3種(上限100アビリティが解放できるライブ)を一括にまとめた代わりに、特化レッスン以外のポイント(Vi極に対するVoDa)を見ようとすると22余計に多くなっている
・滞在状況に応じてオデを変えることができない←強いて言うならこれが一番影響大きそう
2022/09/08追記
・0週目(初ターン)のテンションの扱いが雑
・現状ハシルウマのみ対象だが、テンマス無印をテンマス+のレベル0.2倍分に近似(根拠)
2022/11/03追記
・トラブル発生はないものとして考えます。

あとこのシミュレータの範囲外の内容ですが、能力上昇やアビリティなどに使うポイントなどはご自分で計算するなりしないなりしてください。あくまでこのシミュレータは「どれだけポイントを稼げるか?」を可視化するためのものです。

今、高山祐介になる

このシミュレータは、勿論ゲームにある制約などはありません。
ex&サポnoteでもやったように仮想上のサポートを作ったりもできますし、美琴の育成にLATEが使えないバグも解消されています。
つまり放クラの育成に兜果穂*5を使うなんて芸当ができます。
ただの戯れですがちょっと面白い。


ユニマスについて

今回の実装でダントツで苦労したユニマスについて、割とややこしい処理を行なったので少し説明をば。(この項は読まなくてもまっっっったく支障ありません。)最速ではないと思いますが速度求めるならそもそもPython使うなって話なので。

Pとサポの間に発動するユニマスは簡単なのですが、if文などを使った条件分岐は処理速度の関係で難しいため、サポ間で発生するユニマスの処理は頭を捻らざるを得ませんでした。
そこで思い付いたのがテンソル積の利用です。
詳しくは具体例を用いて説明します。

具体例として、Pがあさひ、サポが[大吉、トリック、エンジョイパーティ、チョコ党、はるとあめ]だとし、ユニマスSPを考えます。
編成を読み込んで、まずユニットの一致表を作ります。
「同ユニットであれば1、違うユニットであれば0」とします。
完成形がこちら。

実績:「シャニマスnoteをLaTeXを用いて書く」達成

対角成分(左上から右下にかけて斜めに(0,1,1,0,0)となるやつ)は、「Pとサポが一致するか」の表です。今回はトリックとエンジョイパーティですね。

これを作るために、ベクトルのテンソル積という計算を使っています。
例えば「ストレイのサポート一覧」はこのようなベクトルになりますが、

これ同士のテンソル積を取るとこのような行列ができます。

これをアンティーカ、ノクチルについても同じことをして足し合わせるとこのようになります。

このとき対角成分は必ず全て1になります。

ここでPとの一致ユニマスを考えるため、対角成分を利用します。Pとユニットが一致しているものを1のままに、不一致を0にします。

さいかつ

これの縦方向(列ベクトルといいます)にユニマスの値をかけるとこのようになります。

これで準備はできたので、あとは実際の滞在に掛け合わせるだけです。
例えば滞在するのがトリック、チョコ党、はるとあめだとします。
これは滞在表が(0,1,0,1,1)になるのですが、これを縦方向と横方向にかけます。

その結果がこちら。

今回はあさひ-トリック間のユニマスと、チョコ党-はるとあめ間のユニマスが発動し、トリック-エンジョイパーティ間のユニマスは、愛依がいないので発動しません。

あとはこの成分の合計をとれば、ユニマスの効果が28であると求まるわけです。

これは配列同士の積しか扱ってないのでnumpyによって簡単に速く処理することができます。


おわり。
「ここもっと説明して!」などあればコメントかTwitter(@washington0706)まで。

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