1

我有一个用于我的游戏信息的谷歌电子表格。它包含 2 张纸 - 一张用于怪物信息,另一张用于团队。

怪物信息表包含怪物的攻击值、防御值和魔法消耗。它几乎就像我可以召唤的怪物数据库。

团队表执行以下操作:

  1. 询问我目前拥有的法力值。
  2. 计算我可以召唤的最多 5 个怪物的列表(可以少于 5 个)。
  3. 每个怪物都有自己的法力消耗,因此总法力消耗不能超过我在第 1 点中给出的法力值。
  4. 列表应该给我一个具有最高综合攻击值的团队。召唤多少怪物都无所谓。但是每个怪物不能被召唤两次。

我一直在考虑使用 query() 函数,以便可以使用 SQL 语句。(这样我就有希望直接检索列表)

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('怪物信息'!$A$:$D,"SELECT A,B,D ORDER BY B DESC LIMIT 5")
  • B5: =继续(A5, 1, 2)
  • C5: =继续(A5, 1, 3)
  • D5:=C5
  • A6: =继续(A5, 2, 1)
  • B6: =继续(A5, 2, 2)
  • C6:=继续(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

我已经解决了这个问题一个小时,我在这里只有一个解决方法。您的问题似乎是一个标准的线性编程任务,应该可以通过“求解器”软件轻松解决。谷歌电子表格中曾经有一个所谓的“求解器”,但不幸的是,它已从最新版本中删除。如果您不坚持使用 Google 解决方案,您应该在 Solver 支持的电子表格管理器软件之一中进行尝试。

我尝试了 MS Office(它有一个 Solver 插件,安装指南: http: //office.microsoft.com/en-001/excel-help/load-the-solver-add-in-HP010342660.aspx)。

在运行求解器之前,您应该准备一些原始数据集,包括辅助列和单元格。

  1. 在“成本”列旁边添加一个新列(假设它是“D”列),并在其下将每一行设置为 0 或 1。此列将告诉您是否选择了怪物加入攻击团队.

  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. 选中“Max”单选按钮,因为我们希望最大化攻击的价值。

  3. 通过更改可变单元格:选择“d2:d9”间隔,因为这些单元格表示是否选择了怪物。求解器将尝试调整这些值(0 或 1)以最大化总和攻击。

  4. 约束:在这里我们应该添加一些约束。单击添加按钮,然后:

    • 首先,我们应该确保 d2:d9 都是二进制值。所以“单元格引用”应该是“d2:d9”,并从下拉菜单中选择“bin”作为二进制。
    • 另一个约束应该是选择的怪物的总和不能超过5。所以选择表示选择的怪物总和的单元格(D10)并添加“<=”和值“5”
    • 最后,我们无法使用我们拥有的更多甘露,因此选择存储已用甘露 (F2) 和“<=”的单元格,并添加我们可以在 I2 中花费的全部甘露细胞)。

完毕。它应该有效,就我而言,它至少有效。

无论如何,希望它有所帮助。

于 2014-04-25T12:26:38.360 回答