HoI4の生産の最適化を考える その2

HoI4の生産について、前回どういうものかを明らかにできたので、今回は前回得られた式の実証から。

前回:HoI4の生産の最適化を考える その1


スポンサーリンク

今回の結論

生産効率の上昇を加味する場合、期間(T)の間の総生産出力(P)は、基本出力(p)、出力補正(m)、生産効率上限(\bar{e})、初期生産効率(e)、生産効率上昇率(i)としたとき、生産効率が上限に達する期間t

\[ t = \frac{\bar{e}-e}{i} \]

として、

\[ P = \begin{cases} pmT(e+\frac{i(T-1)}{2}) & (1\leqq T\leqq t) \\ pm\left\{\bar{e}T-\frac{1}{2i}(\bar{e}-e)^2\right\} & (t\leqq T) \end{cases} \]

となることになるらしいということは突き止めましたが、実際にゲーム中で実験してみると数値が合いません……。

2016/12/28追記:コメントにて設定ファイルでは生産効率上昇率(i)は0.25%に設定されているとご指摘いただき、これで再計算するとゲーム中の動作と一致する結果が出ました。詳しくはページ下部。

概要

前回数式をこねくり回した結果として、HoI4の生産は以下の等式によって表現できるという結論が出ました。

生産効率の上昇も加味すると、生産出力は基本出力(p)、出力補正(m)、生産効率上限(\bar{e})と初期生産効率(e)の差の2乗、生産効率上昇率(i)、期間(T)によって決まるということがわかりました。式にすると以下のとおり。

\[ P = pm\left\{\bar{e}T-\frac{1}{2i}(\bar{e}-e)^2\right\} \]

今回はこの等式が詳しいのかを実証するところから考えます。

実験

1936年シナリオのスイスで生産を行う実験をやってみます。基本出力(p)は5、出力補正(m)は経済法が輸出重視で+10%されるので1.1、生産効率上限(\bar{e})は50%なので0.5、初期生産効率(e)は10%なので0.1、生産効率上昇率(i)は\frac{1.7}{7}%なので\frac{1.7}{700}、代入すると

\[ 5\times1.1\left\{0.5T-\frac{1}{2\times\frac{1.7}{700}}(0.5-0.1)^2\right\}\fallingdotseq2.75T-181.1765 \]

あらら……。期間(T)が小さいと生産出力がマイナスになってしまいますね。T=1だとしたらPは0.55とならなければならないはずなのに、計算結果からは-178.4265となってしまいます。

これは明らかにおかしいので、なにか他にも条件がありそうです。

再度考える

よく考えてみると、当初この式を考える際に、生産効率が上限に達するまでの期間をtと置いて、

\[ t = \frac{\bar{e}-e}{i} \]

としており、また0<t<Tとなることを無意識のうちに条件としていたのではないでしょうか。つまり、上の式は計算する期間が少なくとも生産効率上限に達することを前提とした式だということになりそうです。

ということは、計算期間が生産効率上限に到達する前に設定される(つまり0<T\leqq tとなる)場合は、別の計算式が必要ということになるはずです。ではその式はというと、前回の1つ目のアプローチから

\[ P = \int_0^Tpm(e+iT)\mathrm{d}T=pmT(e+\frac{iT}{2}) \]

であると考えられます。

2016/12/28追記:Tは日数であるため、変数が連続であることを前提とする積分は数学的には本当は使えないので、数列の和から計算するのが正確な計算のはずですが、結論として出てくる数式は同じでした。

T=1として各変数を代入すると0.5567とそれらしい数値になりましたが、これだと生産効率の上昇が1日目から付加されてしまうので、TT \geqq1の整数として、

\[ P = pmT(e+\frac{i(T-1)}{2}) \]

としてやればT=1P=0.55となり、計算結果と合致しそうです。

ここまでのまとめ

ここまでの内容をまとめると、

生産効率の上昇を加味する場合、期間(T)の間の総生産出力(P)は、基本出力(p)、出力補正(m)、生産効率上限(\bar{e})、初期生産効率(e)、生産効率上昇率(i)としたとき、生産効率が上限に達する期間t

\[ t = \frac{\bar{e}-e}{i} \]

として、

\[ P = \begin{cases} pmT(e+\frac{i(T-1)}{2}) & (1\leqq T\leqq t) \\ pm\left\{\bar{e}T-\frac{1}{2i}(\bar{e}-e)^2\right\} & (t\leqq T) \end{cases} \]

となることになります。

再び実験

再び実験に戻りましょう。さきほどの輸送機の生産に合わせて変数を代入していくと、まずt

\[ t = \frac{0.4}{\frac{1.7}{700}}\fallingdotseq165 \]

となり、生産効率が上限に達するまで実に165日かかる計算。したがって総生産出力P

\[ P = \begin{cases} 5.5T(0.1+\frac{\frac{1.7}{700}(T-1)}{2})=\frac{768.3}{1400}T-\frac{1.7}{1400} & (1\leqq T<165) \\ 5.5\left\{0.5T-\frac{1}{2\frac{1.7}{700}}(0.4)^2\right\}=2.75T-\frac{308}{1.7} & (165<T) \end{cases} \]

となります。かなりそれらしい感じではないでしょうか。

では、実験として30日間でどれくらいの総生産出力が出るのかを計算してみましょう。

期間は30日なので上の計算式を使います。T=30を代入すると

\[ P = \frac{768.3}{1400}30-\frac{1.7}{1400}\fallingdotseq16.4623 \]

となります。出力16というのは、必要出力4の支援装備を4つ生産できる出力ですから、支援装備を4つ生産できるか見てみることにします。

現在の総需要量は168個ですから、30日経過した段階で164個になっていれば概ね成功と言ってよいでしょう。

そして30日後の結果がこちら。……合いませんね。5個半生産しているので、およそ22以上の生産出力が出ていることになっています。なぜだ……。

2016/12/28追記:コメントにて「common/defines/00_defines.luaでは "BASE_FACTORY_EFFICIENCY_GAIN = 0.25" となっているので、生産効率上昇率は1日あたり0.25%なのではないか」というご指摘をいただきました。

i=0.25として再計算すると、こちらもコメントでいただいたように22.48...とゲーム中の動作とほぼ一致する結果となり、無事に解決できました。ここが突破できずに本当に悩んでいたので本当に助かりました。まことにありがとうございました。


今日はここまでにしておきます。かなりそれらしい結果が出たので実地でもうまくいくと思ったのですが、まだなにか見落としているようです……。ここまでご覧いただいてここがおかしいのではないかというところがありましたら、コメントをいただければ幸いです。

次回:HoI4の生産の最適化を考える その3

『HoI4の生産の最適化を考える その2』へのコメント

  1. 名前:a 投稿日:2016/12/28(水) 14:34:11 ID:e93848a7e

    defines見ると
    BASE_FACTORY_EFFICIENCY_GAIN = 0.25
    でたぶん日毎の獲得efficiencyが0.25%だからそこが違うとか?
    30日で適当に計算してみると22.481となり実際の生産とおおよそ合っているのではないかと
    ゲーム上の週17%が謎ですけどね・・・

  2. 名前:管理人 投稿日:2016/12/28(水) 15:22:34 ID:134d4c687

    あああああ……ホントですね、たぶんそこですね……。それなら「1日あたり0.25%」って書いてくれればいいのに……。
    まずゲームデータを見とけばよかったですね。ほぼ丸一日がかりで計算し直しちゃいました……。
    ありがとうございます。たぶんこれで無事に解決できます。