19/7/24 あれ、別に乱数生成するんじゃなくて全ての組み合わせを試せばよいのでは…?あと自機撃墜は敵機撃墜と異なり2つの乱数で撃墜数が決まる検証結果を見つけた、実装できていない。
はじめに・目的
本記事は4年ぶりに艦これに復帰した筆者が6-5を攻略するに当たりぶち当たった「基地航空隊を使った制空値調整によるボスマス航空優勢の確保」という壁を、Pythonを用いたシミュレーションと、数時間で得た統計学知識を以って乗り越える的なアレです。尚、専ブラによる隠れパラメータの取得が含まれますので、予めご承知おきください。また、艦これにおける航空戦や基地航空隊のややこしい内容を取り扱うので、適宜艦これwikiをご覧ください。
基地航空隊による敵機撃墜とそのランダム性
本記事は基地航空隊によって多くの敵航空戦力を削ぎつつ敵本隊に多くの損害を与え、また本艦隊決戦で自軍航空優勢を取ることを目的とします。自軍必要制空値とのコスパを考え、本記事では基地航空隊を航空劣勢で当てる状況を仮定します。ここで考察対象となるのが、基地航空隊がどれだけ相手の艦載機を撃墜してくれるか、ひいては自軍本艦隊の航空戦力をどれだけ少なくし、他にリソースを割けるか、です。艦これwiki"航空戦"によると、敵機迎撃割合は
・航空劣勢で0%~40%
とあります。このランダム性が考察を難しくしている原因であることは明らかです。ある記事では敵機撃墜を20%として見積もったり、またある記事では経験則に基づいたり、ありがたやツールを使ったり…といった中で筆者は頭がこんがりました。こんがられました。そこで筆者は(おそらくツール様も同じことをやっているのであろうが、使い方が全くわからないので自作した)シミュレーションコードで考察することにしました。
コード(Python3.6)
# In[1]:
import numpy as np
import seaborn as sns
import collections
from tqdm import tqdm_notebook as tqdm
# In[2]:
class AircraftCarrier:
def __init__(self,*args,**kwargs):
self.taiku = np.array(args[1::2])
self.equip = np.array(args[ ::2])
def seiku(self):
return int(np.sum(np.trunc(self.taiku * np.sqrt(self.equip))))
# In[3]:
def seiku(x):
return x.seiku()
seiku = np.frompyfunc(seiku, 1, 1)
# In[4]:
def init():
global kubo1,kubo2,kubo3,kubos
kubo1 = AircraftCarrier(60,10,56,4)
kubo2 = AircraftCarrier(32,12,27,5,5,5)
kubo3 = AircraftCarrier(32,12,27,5,5,5)
kubos = np.array([kubo1,kubo2,kubo3])
# In[5]:
limit = 100000
li = []
for iters in tqdm(range(limit)):
init()
for j in range(4):
for kubo in kubos:
for i in range(len(kubo.equip)):
n = np.random.randint(0,40)
drop = int(kubo.equip[i] * (n/100))
kubo.equip[i] -= drop
num = np.sum(seiku(kubos))
li.append(num)
# In[6]:
sns.distplot(li)
# In[7]:
print(f"中央値 :{np.median(li)}")
print(f"平均値 :{np.mean(li) }")
print(f"標準偏差 :{np.std(li) }")
print(f"95.4%優勢ボーダーライン:{( np.mean(li) + 2 * np.std(li) ) /2 * 3}")
print(f"99.7%優勢ボーダーライン:{( np.mean(li) + 3 * np.std(li) ) /2 * 3}")
結果
中央値 :212.0
平均値 :212.47028
標準偏差 :12.225370207956894
95.4%優勢ボーダーライン:355.38153062387073
99.7%優勢ボーダーライン:373.719585935806
説明
博識なQiitaユーザーには恐れ多いですが、軽く説明します。
In[4]で空母インスタンス変数を生成します。記法はIn[2]のクラスで定義した通りですが、"搭載数"と"対空値"(順序大事)のセットを繰り返すことで、複数のスロットを表現できます。ここでは6-5ボスマス最終編成である
・空母棲姫(艦載機白)
60スロ深海猫艦戦(対空+10)
56スロ深海復讐艦攻(対空+4)
・空母ヲ級flagship(艦載機赤?)
32スロ深海猫艦戦改(対空+12)
27スロ深海復讐艦攻改(対空+5)
5スロ深海復讐艦攻改(対空+5)
・空母ヲ級flagship(艦載機赤?)
同上
の3隻のデータを用いています。データがあれば引数だけいじって他の状況に対応できますが、艦数を増減するときはglobal宣言とkubosリストの部分も変えてあげます。またこのデータを用いてseikuクラス関数で各艦の時々の制空値を計算できます。式はwikiの
制空値 = [(艦載機の対空値) × √(搭載数) + 熟練度補正] の総計 ([]は端数切り捨て)
に従っています。熟練度補正はなしでいい…よね。
In[5]はメイン計算部分で、基地航空隊を集中させて計4回(変数j)あてる仮定です。こちらの制空戦力は1回ごとに全回復するのに対し、敵はそうでないので、一方的に数を減らしていけます。また実際問題基地航空隊の制空値をかなり多めにするときは複数回目で航空均衡以上になることもありえますが、今回はそのような状況を想定しません(変数n、撃墜割合の乱数生成)。また艦これwikiの内容に即し、撃墜数を端数切り捨ててから搭載数を減らしています。
考察
こうして積み上がったシミュレート結果はIn[6]の通り正規分布となり(ちなみにシミュレート10000回程度では収束しません)、その特徴はIn[7]の値で表現されます。即ち、基地航空隊がぶつかったあとの敵制空値の平均は212.47028です。ある提督がこの値の3/2倍の制空値319(ボス突入時)を持った艦隊で挑むとすれば、ボスマスでは50%の確率で航空優勢となります。筆者はフィーネが倒せないのでそんな値は信用に足りません。敵制空値が平均値より"+2標準偏差"だけ大きかったとします。この時自軍航空優勢のために必要な制空値は356(ボス突入時)で、優勢期待度は95.4%です(統計学のありがたや公式より)。"+3標準偏差"だけ大きかったとすると必要なのは374(ボス突入時)で、優勢期待度は99.7%です。表にまとめます。
自軍制空値(ボス突入時) | 優勢期待度 |
---|---|
319 | 50% |
356 | 95.4% |
374 | 99.7% |
基地航空隊を使用しなければ航空優勢に468の制空値が必要なことを鑑みると、基地航空隊のありがたみがわかりますね。 | |
ちなみにぜかましねっとさんの6-5記事では |
本隊の出撃時制空値制空値350~程度で航空優勢を目指せるようになります。
と言及されています。本記事の結果との関係については読者に考察を委ねます。
おわりに
他にも"道中での自軍被迎撃・被対空砲火"という検討事項が残りますが、疲れたのでここまで。
ここまできて、期待度いくらでいくのか、どのくらい余分に積んでいくのか~~、この結果を信じるか信じないか~~…などは全て提督の裁量次第というところに、このゲームの良さが感じられます。
参考
・正規分布の分かりやすいまとめ
https://to-kei.net/distribution/normal-distribution/#i-7
・艦これwiki「航空戦」「基地航空隊」
https://wikiwiki.jp/kancolle/