我正在设计一款游戏,其中AI需要确定哪种盔甲组合将为角色提供最佳的整体状态加值。每个角色将有大约10个属性,其中只有3-4个是重要的,而那些重要的属性,其中一些将比其他角色更重要。
护甲还可以提升1或所有属性。例如,衬衫可能会给角色的int + + 2耐力+4,同时,一条裤子可能有+7力量而没有别的。
所以让我们说一个角色有一个健康的盔甲选择(5双裤子,5双手套等)我们已经指定Int和Perception是这个角色最重要的属性。我怎么能编写一个算法来确定哪个盔甲和物品组合会导致任何给定属性中的最高值(比如在这个例子中Int和Perception)?
答案 0 :(得分:7)
这非常简单。首先,一些假设:
你没有提到这个,但据推测,一个人最多只能佩戴一种特殊位置的盔甲。也就是说,你不能穿两条裤子或两件衬衫。
据推测,一件装备的选择也不会影响或与其他装备发生冲突(除了在同一槽中没有多件衣服的限制)。也就是说,如果你穿裤子,这绝不会妨碍你穿衬衫。但请更加巧妙地注意,我们假设您没有因佩戴两件相关物品而产生某种协同效应。
假设您想要定位统计X.那么算法如下:
证明:获得更高X统计数据的唯一方法是,如果有一个项A
提供的X比其他组中的其他项更多。但是我们已经按降序排列了每个组中的所有项目,因此没有这样的A
。
如果违反假设会怎样?
如果假设一个不正确 - 也就是说,你可以在每个插槽中佩戴多个项目 - 然后选择第一个<而不是从每个组中挑选第一个项目<来自每个组的em> Q(s)项目,其中 Q(s)是可以进入插槽 s 的项目数。
如果假设2不成立 - 也就是说,项做相互影响 - 那么我们就没有足够的信息来解决问题。我们需要具体了解物品如何相互影响,或者被迫通过蛮力尝试每种可能的物品组合,并查看哪些物品具有最佳的整体效果。
如果你想同时定位多个统计数据,你需要一种方法来判断某些东西是多么好。这称为适应度函数。您需要确定N个统计信息相对于彼此的重要程度。例如,你可能会认为每个+1 to Perception值得10分,而每个+1 to Intelligence只值6分。您现在有办法评估项目相对于彼此的“良好”。
有了这个,而不是优化X,而是优化F,即适应度函数。对于一个统计,该过程与上述过程相同。
答案 1 :(得分:3)
如果按类别对项目数量没有限制,则以下内容适用于多个统计信息和多个项目。
数据准备:
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)