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

时间:2010-04-24 12:11:54

标签: algorithm

我正在设计一款游戏,其中AI需要确定哪种盔甲组合将为角色提供最佳的整体状态加值。每个角色将有大约10个属性,其中只有3-4个是重要的,而那些重要的属性,其中一些将比其他角色更重要。

护甲还可以提升1或所有属性。例如,衬衫可能会给角色的int + + 2耐力+4,同时,一条裤子可能有+7力量而没有别的。

所以让我们说一个角色有一个健康的盔甲选择(5双裤子,5双手套等)我们已经指定Int和Perception是这个角色最重要的属性。我怎么能编写一个算法来确定哪个盔甲和物品组合会导致任何给定属性中的最高值(比如在这个例子中Int和Perception)?

2 个答案:

答案 0 :(得分:7)

定位一个统计信息

这非常简单。首先,一些假设:

  • 你没有提到这个,但据推测,一个人最多只能佩戴一种特殊位置的盔甲。也就是说,你不能穿两条裤子或两件衬衫。

  • 据推测,一件装备的选择也不会影响或与其他装备发生冲突(除了在同一槽中没有多件衣服的限制)。也就是说,如果你穿裤子,这绝不会妨碍你穿衬衫。但请更加巧妙地注意,我们假设您没有因佩戴两件相关物品而产生某种协同效应。

假设您想要定位统计X.那么算法如下:

  • 按位置对所有项目进行分组。
  • 在每个组中,按降序排列该组中的潜在项目,按照它们提升X的程度。
  • 选择每组中的第一项并佩戴它。
  • 所选择的项目集是最佳装载。

证明:获得更高X统计数据的唯一方法是,如果有一个项A提供的X比其他组中的其他项更多。但是我们已经按降序排列了每个组中的所有项目,因此没有这样的A

如果违反假设会怎样?

  • 如果假设一个不正确 - 也就是说,你可以在每个插槽中佩戴多个项目 - 然后选择第一个<而不是从每个组中挑选第一个项目<来自每个组的em> Q(s)项目,其中 Q(s)是可以进入插槽 s 的项目数。

  • 如果假设2不成立 - 也就是说,项相互影响 - 那么我们就没有足够的信息来解决问题。我们需要具体了解物品如何相互影响,或者被迫通过蛮力尝试每种可能的物品组合,并查看哪些物品具有最佳的整体效果。


定位N个统计信息

如果你想同时定位多个统计数据,你需要一种方法来判断某些东西是多么好。这称为适应度函数。您需要确定N个统计信息相对于彼此的重要程度。例如,你可能会认为每个+1 to Perception值得10分,而每个+1 to Intelligence只值6分。您现在有办法评估项目相对于彼此的“良好”。

有了这个,而不是优化X,而是优化F,即适应度函数。对于一个统计,该过程与上述过程相同。

答案 1 :(得分:3)

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

数据准备:

  • 根据您确定的重要性,给每个统计量(Int,Perception)一个权重 将其存储为1-D数组statImportance
  • 根据所述项目提升玩家的统计数据,给每个项目统计组合一个值 将其存储为二维数组itemStatBoost

算法:

在伪代码中。这里假设itemScore是一个可排序的Map,其中Item为键,数值为值,值初始化为0。 假设sort方法能够按值(而非键)对此Map进行排序。

//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)