代码之家  ›  专栏  ›  技术社区  ›  bugfixr

如何从一组项目中选择最有益的项目组合?

  •  6
  • bugfixr  · 技术社区  · 14 年前

    我正在设计一个游戏,其中人工智能需要确定哪种装甲组合将给角色最好的整体属性加成。每个角色大约有10个属性,其中只有3-4个是重要的,在那些重要的属性中,一些属性将比其他属性更重要。

    护甲也会提升1或所有属性。例如,一件衬衫可能给角色的智力+4和+2耐力,而同时,一条裤子可能有+7的力量,而没有其他东西。

    所以假设一个角色有一个健康的盔甲选择(5条裤子,5副手套等),我们已经指定智力和感知是这个角色最重要的属性。我怎么能写出一个算法来确定哪种装甲和物品的组合会导致任何给定属性中的最高值(比如在这个例子中的int和perception)?

    2 回复  |  直到 14 年前
        1
  •  7
  •   John Feminella    14 年前

    针对一个统计数据

    这很简单。首先,有几个假设:

    • 你没有提到这个,但大概一个人最多只能穿一种盔甲在一个特定的位置。也就是说,你不能穿两条裤子或两件衬衫。

    • 而且,一件衣服的选择大概不会影响或与其他人冲突(除了在同一个槽中不能有多件衣服的限制)。也就是说,如果你穿裤子,这决不妨碍你穿衬衫。但请注意,更微妙的是,我们假设你穿两件相关的衣服不会产生某种协同效应。

    假设您想要以统计X为目标,那么算法如下:

    • 按槽对所有项目进行分组。
    • 在每个组中,按它们提升x的程度按降序对该组中的潜在项进行排序。
    • 挑选每组的第一件衣服穿上。
    • 所选的一组项目是最佳装船。

    证明:获得更高X属性的唯一方法是如果有一个物品 A 它提供了比它的组中的其他一些更多的x。但我们已经按降序对每组的所有项目进行了排序,所以不可能出现这样的情况 .

    如果违反了这些假设会怎么样?

    • 如果假设一不是真的——也就是说,你 可以 在每个槽中穿多件衣服——然后不要从每组中挑选第一件,而是挑选第一件 Q(S) 每组的项目,其中 Q(S) 是可以放入槽中的项目数 S .

    • 如果假设二不是真的——也就是说,项目 相互影响——那么我们就没有足够的信息来解决这个问题。我们需要明确地知道物品是如何相互影响的,否则我们就不得不通过暴力来尝试各种可能的物品组合,看看哪些物品的整体效果最好。


    目标N统计

    如果你想一次瞄准多个统计数据,你需要一种方法来告诉“多好”的东西。这叫做 适应度函数 . 您需要确定n个统计数据之间的相对重要性。例如,你可能认为感知的每+1值10分,而智力的每+1值6分。你现在有了一种方法来评估物品之间的“善性”。

    一旦你有了它,你就不用为x优化,而是为f优化,健身功能。对于一个统计数据,该过程与上述相同。

        2
  •  3
  •   bguiz    14 年前

    如果按类别对项目数没有限制,则以下内容适用于多个统计信息和多个项目。

    数据准备:

    • 根据你确定的重要性,给每个统计数据(智力,感知)一个权重
      将其存储为一维数组 statImportance
    • 给每个项目的统计组合一个值,根据所说的项目对玩家所说的统计的促进程度
      将其存储为二维数组 itemStatBoost

    算法:

    用伪代码。这里假设 itemScore 是一个可排序的映射 Item 作为键和数值作为值,值初始化为0。
    假设 sort 方法可以按值(而不是键)对该映射进行排序。

    //Score each item and rank them
    for each statistic as S
      for each item as I
        score = itemScore.get(I) + (statImportance[S] * itemStatBoost[I,S])
        itemScore.put(I, score)
    sort(itemScore)
    
    //Decide which items to use
    maxEquippableItems = 10 //use the appropriate value
    selectedItems = new array[maxEquippableItems]
    for 0 <= idx < maxEquippableItems
      selectedItems[idx] = itemScore.getByIndex(idx)