带有SQL查询的Google电子表格 - 找到最佳组合

时间:2013-11-09 01:48:35

标签: sql google-sheets combinations

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

怪物信息表包含攻击值,防御值和怪物的法术力费用。它几乎就像我可以召唤的怪物数据库。

团队表执行以下操作:

  1. 询问我现有的法力值。
  2. 计算我可以召唤的最多5个怪物的列表(可以少于5个)。
  3. 每个怪物都有自己的法术力费用,因此总法术力费用不得超过我在第1点给出的法力值。
  4. 列表列表应该给我一个具有最高组合攻击值的团队。召唤有多少怪物并不重要。但是每个怪物都不能召唤两次。
  5. 我一直在考虑使用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:=查询('怪物信息'!$ A $:$ D,“选择A,B,D订购B DESC限制5”)
    • B5:=继续(A5,1,2)
    • C5:= CONTINUE(A5,1,3)
    • D5:= C5
    • A6:= CONTINUE(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攻击)。

    如您所见,结果中并没有真正的模式。

    是否有任何专家愿意分享他们对此的见解?

1 个答案:

答案 0 :(得分:0)

我已经把这个问题玩了一个小时,我这里只有一个解决方法。您的问题似乎是一个标准的线性编程任务,应该可以通过" Solver"软件。曾经有一个所谓的" Solver"在谷歌电子表格,但遗憾的是它已从最新版本中删除。如果您不坚持使用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"分别)。这些列将分别是Attack和Cost的产品。所以你应该向E2单元写一个函数:= b2 * d2,对于F2单元:= c2 * d2。通过这种方式,如果选择了一个怪物(由D列告知,请记住),相应的E和F单元格将为非零值,否则它们将为0。

  3. 在最后一行下创建一个SUM行,并分别为D,E,F列创建一个汇总函数。因此,在我的电子表格中,D10单元格的值如下:= sum(d2:d9),依此类推。

  4. 我创建了一个电子表格来显示以下步骤: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" radiobutton,因为我们希望最大限度地提高攻击价值。

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

    4. 受制于约束:这里我们应该添加一些约束。单击“添加”按钮,然后:

      • 首先我们应该确保d2:d9都是二进制值。所以" Cell reference"应该是" d2:d9"从下拉菜单中选择" bin"作为二进制。
      • 另一个约束应该是所选怪物的总和不应超过5.所以选择表示所选怪物总和的单元格(D10)并添加"< ="和价值" 5"
      • 最后我们不能使用更多的吗哪,所以选择存储用过的吗哪(F2)和"< ="之和的单元格,并添加全部量的吗哪我可以在I2单元格中使用它。
    5. 完成。它应该工作,在我的情况下它至少起作用。

      希望它无论如何都有帮助。