Post Details Page

サブステ最適化の試み ~ ツール紹介編 ~

Translate

皆さんはキャラクターのビルドを考える時、いつもどうやって決めていますか?



「とりあえず危局で1ブレイク終わりまでのダメージスコアを見て比較」


「各ステータスをバランスよく伸ばす」


「立ち回りから逆算して必要なステータスを決める」


「確定会心しか勝たん」



など、色んなスタイルがあると思いますし、どれも間違ってません。



中には ダメージ計算式(非公式解析式) を踏まえた、独自のダメージ計算ツールを持っている戦闘狂の方も少なくないのではないでしょうか?



私もその一人です



しかしダメージ計算ツールを使用しても、ビルドの最適解を模索する作業は結構たいへんです。



いじる変数も多く、特にCDは効果・メインの選択・サブステのヒット比率の全てを模索するのはとても時間がかかります。



その課題を解決するため、フレンドさんの先行事例/アイディアをお借りして



「ディスクのサブステの理想比率を推定する最適化ツール」を作成しました



実際に動いているデモ動画です。


こちらのツールは、GoogleスプレッドシートとGoogle Apps Script(エクセルマクロ/VBAみたいなもの)だけを使っているので、GoogleアカウントとパソコンとWebブラウザがあれば誰でも使うことが出来ます。



もし興味がある方はこのリンクからシートとスクリプトのセットをコピーして使えるので、使ってみてください

※ ウイルスとか入れていないのでご安心をw

※ 継続的なメンテナンスを保証するものではありません(ただの趣味です)


リンクを開いてGoogle認証を済ませるとこんな画面になって、シートとスクリプトをまるっとコピーして使えるようになります。

不安な人はApps Scriptファイルを表示してウイルスが無いかどうかをAIに聞いてみてください


内包物としては以下です


  • ダメージ計算シート
  • サブステ最適化ツール
  • 各種マニュアル
  • 開発者向けの案内



ダメージ計算シートだけであれば、スマホとGoogleアカウントだけでも使えはしますが、使いにくいのでPC推奨です。


また休日に突貫で作ったものなので、バグがあるかもしれませんがその時は教えて下さい



ダメージ計算シート


ダメージ計算式に基づいて、各種情報を入力すると、想定されるダメージ基礎値を算出するスプレッドシートです。


ダメージ基礎値とはスキルダメージ倍率などをかける前の値を自分が勝手に呼んでいるものです。

ダメージ計算シートの全体像

青字の部分を変更して、色んなビルド・編成・バフのパターンに応じてビルドの比較ができるようになります。


このシートは特筆すべき点はなく、ダメージ計算式とエクセル操作が多少わかれば誰でも作れる平凡なものです。


足りない機能や仕様は適宜追加・変更してもらって良いかなと思います。



あと、「エージェントの防御力」という概念がこのシートには存在しないなど、シンプルな怠慢があります。必要な人は足してください。



後述しますが、仮にシートを全部破壊して全く別のフォーマットに再構築しても、最適化ツールを動かせるように調整しているのでご安心を。



新しいロールなどが出て、計算シート自体のまとまった変更があればV2を共有するかもしれません。



サブステ最適化ツール


※ 小難しい事を多少書いているので、実践派の方はスルー推奨


本記事の主題です。


デモ動画を見ていただければ、どんなツールか何となくわかると思います。


サブステヒット数を指定すると、その数値に達するまでサブステヒット数を最適化アルゴリズムに従って自動的にゴニョゴニョするというものです。


元々はフレンドさんが作ったサブステ最適化ツールのアイディアを拝借し、自分用に再構築したものです。


最適化アルゴリズムの基本的な発想としては、指定した数だけ以下の操作を行うというものです。


「サブステ1ヒットした時のダメージ増加量を全て比較し、最も優秀なものを採用してヒット数を1増やす」


これは、「貪欲法(Greedy Algorithm)」と呼ばれる近似アルゴリズムの一種で、最適化問題に広く使われる手法です。


おそらくダメージ計算ツールを使ってる人も、これに近い考え方でサブステ最適解をポチポチしながら調べていたのではないでしょうか?



今回私が作成したツールは、このアルゴリズムの考え方を踏襲し、以下の2つの変更を加えています


  1. アルゴリズムにダメージ計算式の知識を入れない
  2. 計算速度と精度を両立するアルゴリズムの調整


元々フレンドさんのツールは、アルゴリズムにダメージ計算式の一部の知識が含まれており、これによって高速に最適化計算が出来るという非常に優れた方針を取っていました。



最初はこのまま使おうと思っていたのですが、今後新しいダメージ体系が現れたり、特殊対応の乗算係数などが増えてくると、アルゴリズムのメンテナンスが大変になりそうだなと思いました。



そのため、私は自分が作ったダメージ計算シートに計算ロジックは任せて、アルゴリズムはサブステの内訳の最適化問題だけに集中して作り直すことにしました。


これにより、シート構造の変更や、ダメージ計算式に新しい概念が登場しても、アルゴリズム自体は調整が不要。


という事を狙っています。


しかしその副作用として、貪欲法で全てのパターンを検証すると時間がかかりすぎるという別の問題が発生しました。

(1回につき3分ぐらいかかる)


その解決のため、計算速度と精度を両立させるアルゴリズムの再構築を行い、結果として30-40秒ぐらいで最適化が完了し、なおかつ貪欲法よりも精度向上に成功しました。


このアルゴリズムの戦略やアーキテクチャについては、アルゴ/ソフト屋さんしか興味ないと思うので、別の記事で興味がある人向けに書こうと思っています。


またサブステの列やダメージ計算結果のセルの指定位置を設定変更する機能もつけてるので、スキルダメージ・異常ダメージ・透徹ダメージ向けの最適化を切り替えたり、シート自体を破壊して好きな構成に変えられるようにもしています。


久しぶりにちゃんとアルゴリズム考えてツール作れたので普通に面白かったです




おわりに


ゼンゼロはアクションゲームなので、ぶっちゃけサブステ最適化よりもPS最適化の方が時間対効果が高い場合が多いです



しかし、突き詰めていくとやはり理論値というものは知りたくなるものですよね〜



だんだん投稿する内容がおかしくなってきている自覚がありますが、趣味は深めてなんぼだと思っているので、クレームが来ない限りこんな感じでやっていこうと思います



ちなみに、この最適化ツールを使って一番興味深かった事例を紹介します。



シード・トリガーの餅完凸、シード完凸、5, 6番ディスク攻撃力%、4番会心ダメージ

という条件で、危局ボス相手にシードのサブステ最適解を調べた結果がこちら。

突如現れる貫通値くん

直感に反しすぎる結果になりました



貫通値は重ねれば重ねるほど伸びが良くなるが、他のサブステは逆なので、均衡点を超えると一気に逆転するのです。


私がしつこい位「貫通値」は侮れないよ〜と言っている事を、アルゴリズムが証明してくれました。



そして、シンプルな貪欲法だと実はこの最適化は必ず失敗します。

貪欲法だと41ヒットの時に攻撃力%か会心ダメしか絶対に選びませんし、そもそも会心ダメを減らすことはしません。


貪欲法は優秀なアルゴリズムで、殆どのケースで最適な結果を出してくれますが、特定条件下で部分最適に陥りやすいという弱点を持っているのです。


アルゴリズムの改善ではこの貪欲法の欠点を補いつつ計算効率を高める工夫をしています。


最適化アルゴリズムの深淵ですね。理論編の記事でこの辺りにも触れようと思います。




それではまた!

Zenless Zone Zero • Discussions & Sharing
Repost prohibited
37
3
24
21
40
1
All comments 24

Loading...

All Tools

Recommended Users