1

ゲーム情報用の Google スプレッドシートがあります。モンスター情報用とチーム用の 2 枚のシートが含まれています。

モンスター情報シートには、モンスターの攻撃力、防御力、マナコストが記載されています。召喚できるモンスターのデータベースのようなものだ。

チーム シートは次のことを行います。

  1. 現在持っているマナの量を尋ねます。
  2. 召喚できる最大 5 体のモンスターのリストを計算します (5 体未満の場合もあります)。
  3. 各モンスターには独自のマナ コストがあるため、マナ コストの合計がポイント 1 で与えたマナの量を超えてはなりません。
  4. 集計されたリストから、合計攻撃値が最も高いチームが得られるはずです。モンスターは何体召喚しても構いません。ただし、各モンスターは2回召喚できない。

SQLステートメントを利用できるように、 query() 関数を使用することを考えていました。(表形式のリストを直接取得できることを願っています)

Sample: Monster Info
            A           B          C          D
1           Monster     Attack     Defense    Cost
2           MonA        1200       1200       35
3           MonB        1400       1300       50
... ...

Sample: Team
            A           B          C          D
1           Mana        120        
2
3                Attack Team
4           Monster     Attack     Cost      Total Attack
5           MonB        1400       50        1400
6           MonA        1200       35        2600
7           ... ...

「チーム」シートにこれらの式があります

  • A5: =query('Monster Info'!$A$:$D,"SELECT A,B,D ORDER BY B DESC LIMIT 5")
  • B5: =CONTINUE(A5, 1, 2)
  • C5: =CONTINUE(A5, 1, 3)
  • D5: =C5
  • A6: =CONTINUE(A5, 2, 1)
  • B6: =CONTINUE(A5, 2, 2)
  • C6: =CONTINUE(A5, 2, 3)
  • D6: =D5+C6

マナコストの考慮に関係なく、5つの最高の攻撃モンスターしか取得しません。攻撃値とマナ コスト値の両方を考慮するようにするにはどうすればよいですか? 次の例に示す別の問題があります。

Example: (simplified version, without defense value etc)
Monster        Attack     Cost
MonA           1400       50
MonB           1200       35
MonC           1100       30
MonD           900        25
MonE           500        20
MonF           400        15
MonG           350        10
MonH           250        5

マナが 160 の場合、明らかなチームは A+B+C+D+E (攻撃力 5100) です。

マナが150あればA+B+C+D+G(攻撃力4950)。

マナが140あればA+B+C+D(攻撃力4600)。

130 マナの場合、B+C+D+E+F (125 マナを使用して 4100 攻撃) または A+B+C+F (130 マナすべてを使用して 4100 攻撃) になります。

マナが120あればB+C+D+E+G(攻撃力4050)。

マナが110あればB+C+D+F+H(攻撃力3850)。

ご覧のとおり、結果には実際にはパターンはありません。

これに関する洞察を共有してくれる専門家はいますか?

4

1 に答える 1

0

私はこの問題を 1 時間試しましたが、回避策しかありません。あなたの問題は、「ソルバー」ソフトウェアで簡単に解決できる標準的な線形計画法タスクのようです。以前は、Google スプレッドシートにいわゆる「ソルバー」がありましたが、残念ながら最新バージョンから削除されました。Google のソリューションにこだわらない場合は、Solver がサポートするスプレッドシート マネージャー ソフトウェアのいずれかで試してみてください。

MS Office を試してみました (ソルバー アドイン、インストール ガイドがあります: http://office.microsoft.com/en-001/excel-help/load-the-solver-add-in-HP010342660.aspx )。

ソルバーを実行する前に、ヘルパー列とセルを使用して元のデータセットを少し準備する必要があります。

  1. 「コスト」列の隣に新しい列を追加し (列「D」としましょう)、その下に各行を 0 または 1 にします。この列は、モンスターが攻撃チームに選択されているかどうかを示します。 .

  2. さらに 2 つの列 (それぞれ「E」と「F」) を追加します。これらの列は、それぞれ攻撃とコストの積になります。したがって、E2 セルには =b2*d2、F2 セルには =c2*d2 という関数を記述する必要があります。このようにして、モンスターが選択された場合 (これは D 列で示されます)、適切な E セルと F セルはゼロ以外の値になり、それ以外の場合は 0 になります。

  3. 最後の行の下に SUM 行を作成し、それぞれ D、E、F 列の集計関数を作成します。私のスプレッドシートでは、D10 セルは =sum(d2:d9) などのように値を取得します。

これらの手順を示すスプレッドシートを作成しました: https://docs.google.com/spreadsheets/d/1_7XRlupEEwat3CthSSz8h_yJ44MysK9hMsj0ijPEn18/edit?usp=sharing

ソルバーを開始する前に、このワークシートを MS Office ワークシートにコピーすることを忘れないでください。

これで、Solver を開始する準備が整いました。(データ メニュー、MS Office のソルバー)。ソルバーの使用に関するビデオは、https: //www.youtube.com/watch?v=Oyc0k9kiD7oでご覧いただけます。

見た目ほど難しくはありませんが、この場合、何をどこに書くかを説明します。

  1. 目的の設定: 「E10」セルを選択する必要があります。これは、すべての攻撃ポイントの合計を表すためです。

  2. 攻撃の値を最大化したいので、「最大」ラジオボタンをチェックします。

  3. 変数セルを変更する場合: モンスターが選択されているかどうかを表すセルとして、「d2:d9」間隔を選択します。ソルバーは、合計攻撃を最大化するために、これらの値 (0 または 1) を調整しようとします。

  4. 制約の対象: ここで、いくつかの制約を追加する必要があります。[追加] ボタンをクリックしてから、次の操作を行います。

    • まず、d2:d9 がすべてバイナリ値であることを確認する必要があります。したがって、「セル参照」は「d2:d9」である必要があり、ドロップダウン メニューから「bin」をバイナリとして選択します。
    • もう 1 つの制約は、選択したモンスターの合計が 5 を超えてはならないということです。そのため、選択したモンスターの合計が表されているセル (D10) を選択し、「<=」と値「5」を追加します。
    • 最後に、これ以上マナを使用することはできないので、使用したマナの合計 (F2) を格納するセルを選択し、"<=" を選択し、使用できるマナの全量を追加します。私の場合は I2 にあります。細胞)。

終わり。それはうまくいくはずです、私の場合は少なくともうまくいきました。

とにかく役立つことを願っています。

于 2014-04-25T12:26:38.360 に答える