G2プロジェクト(2)

*)この記事は旧サイトのコンテンツを一部修正したものです。

前回の推論、測定結果に基づき、ゴーレムへのダメージを算出する準備ができました。

最適編成アルゴリズム

各兵種で、現在の兵数のダメージと兵士を1人増やした場合のダメージとの差分を取ることで、最もダメージの増える兵種が判ります。その兵種に1人追加し、進行数上限まで同じ操作を繰り返していけば、自然と最大ダメージの出せる編成となるはずです。これが最適な編成を組むためのアルゴリズムの基本になります。

ただし、ダメージ算出には兵力(兵数の平方根)の計算が必要です。一般的に平方根の計算は処理が重く、これを進行数の回数分繰り返すのはスマートではありません。それに、知りたいのはダメージそのものではなく、ダメージ増分が最も大きい兵種のはずです。

ここで、兵数をx、攻撃力×バフを定数A、ダメージをyとすると、ダメージ計算式は、y = A √x と表すことができます。 ゲーム内での兵士の最小単位は1人なので、兵数xからx+1へのダメージ増分を比較することになりますが、数式上ではもっと細かい範囲で比較することもできます。xからx+hへのy増分として考えた場合、hを限りなく0に近づけて行くと、 ある兵数xにおけるダメージ増分とは、xを通る接線の傾きに等しいとも言えます。 つまり、y = A √x を微分して得られる導関数 y‘ = A (1/2)(1/√x) を比較すれば良いということになります。

差分からダメージ増分を求めるよりも計算は簡略化できましたが、もう少し工夫できないか考えてみましょう。 上記の処理を繰り返して行くと、最もダメージ増分の高い兵種に兵士が足されていきます。兵数が増えると増分値は下がるため、そのうちに2番目にダメージ増分の高い兵種と等しくなります。1番目と2番目の兵種に兵士を追加して行くと、いずれ3番目の兵種と増分値は等しくなるでしょう。このようにして、最終的には全ての兵種でダメージ増分が等しくなるはずです。どの兵種に1人追加しても増えるダメージが変わらない、という状態が求める最適な編成ということです。

では、兵種1の攻撃力×バフをA1、最適な編成時の兵数をX1とします。同様に、兵種2をA2, X2とします。最適な編成時は、どの兵種もダメージ増分は等しいため、 A1(1/2)(1/√X1) = A2(1/2)(1/√X2) が成り立ちます。両辺を二乗して整理すると、 X1 = (A12 / A22) X2 となります。 これは、最適な編成時の兵数X1と兵数X2の比は、A12とA22、つまり、お互いの攻撃力×バフを二乗した比によって決まることを意味しています。 例えば、兵種1の攻撃力×バフは、兵種2に対し2倍であったとしましょう(A1 = 2A2)。 このとき、X1 = 4X2 つまり、兵数X1は兵数X2の4倍となります。

この結果は兵種が増えても同じで、3つの兵種の攻撃力×バフが、1:2:3であった場合、最適な編成時の兵数は、1:4:9の関係となります。 結局のところ、平方根の計算や繰り返し処理は必要なく、最適な編成を組むには、攻撃力×バフの二乗で兵数を配分すれば良いということが分かりました。 これなら実装は簡単そうです。

という訳で作ってみたのがこちら↓
ゴーレム最適編成シミュレータ(お試し版)

いかがでしたでしょうか。
ダメージは確かに上がりました。しかし、本当に、これが最適な編成なのでしょうか?

2 Replies to “G2プロジェクト(2)”

    1. I want to translate this article into English, but It will take time for me to write that in English.
      please wait, don’t expect too much.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です