我正在尝试为小游戏的AI实现MCTS算法。该游戏是一个RPG模拟。 AI应该决定在战斗中发挥什么样的动作。这是一场转身基地战(FF6-7风格)。没有涉及的运动。如何在高度非确定性的系统上运行MCTS?
我不会详述,但我们可以放心地假设,我们可以确定地知道在任何特定情况下轮到玩家时会选择什么样的动作。
当一方没有活着的单位时(4v4),游戏结束。它可以采取任何转数(也可能永远不会结束)。在伤害计算中有很多RNG元素可以处理(攻击可以命中/不命中,暴击与否,有很多proc可以“处理”或不可以,buff可以有%值发生等等。 ..)。 单位有大约6个技能,每个技能都可以给出分支因子的概念。
我已经构建了一个初步版本的MCTS,目前给出的结果很差。我遇到了几件事情:
我的一个主要问题是如何处理我的动作的非确定性状态。我已经阅读了几篇关于这方面的文章,但我仍然处于黑暗中。
一些人建议确定游戏信息并在其上运行MCTS树,重复N次以涵盖广泛的可能游戏状态并使用该信息作出最终决定。最后,由于我们必须计算N次MCTS树而不是一次,它确实乘以了计算时间的一个巨大因素。我不能依靠这一点,因为在战斗过程中,我有成千上万的RNG元素:2^1000 MCTS树来计算我已经与其中一个斗争的位置不是一个选项:)
我有添加的想法X孩子也有同样的举动,但似乎也没有得到很好的答案。它使RNG曲线平滑一些,但如果X的值与特定RNG的百分比相比太大/太小,则可以将它移向相反的方向。因为我得到了多个RNG帕尔移动(命中改变,暴击几率,处理某个东西的百分比......),我无法找到满足每种情况的X的体面值。更多的是一种比其他任何东西都更糟糕的援助。
同样每个RNG元组增加1个节点{击中或未命中,暴击与否,proc1与否,proc2与否,等等}每一步都应该覆盖每一种可能的情况,但有一些重大的缺点:5 RNG只有这意味着2^5节点才能考虑每次移动,所以计算太多了。如果我们设法创建它们,我们可以为它们分配一个概率(与节点元组中每个RNG元素的概率相关)并在选择阶段使用该概率。这应该总体上,但在CPU上真的很难:/
我也不能“合并”他们在一个单一的节点,因为我没有办法根据两个不同的游戏状态准确地平均玩家/怪物stat的价值并且在移动处理过程中平均移动的结果本身是可行的,但是需要很多简化,这对代码来说是一种痛苦,并且无论如何都会非常快地损害我们的准确性。
你有什么想法如何解决这个问题?
算法的一些其他方面躲避我:
我不能做一个完整的播出,直到一个结束状态,因为A)它会采取很多我的计算时间和B)有些战斗可能永远不会终止(设计)。我有2个解决方案(我可以混合使用) - 随机播放X轮 - 使用评估功能尝试评分情况。
即使我只考虑健康点来评估我没有找到一个好的评估函数来为给定的情况返回一个可靠的值(1-4个单位之间的玩家和相同的怪物;我知道他们的HP电流/最大值)。令我困扰的是,战争的长度/权力差距可能会有很大差异。这意味着Hp有时候会有0.01%的变化(比如长时间比赛,比如老板),有时候这个变化不大(当玩家比他低时,他们会选择一个低级别区域)。
战斗力和Hp差异的差异意味着我的Biais参数在UCB选择过程中很难解决。我目前使用的东西很低,比如0.03。任何东西> 0.1和探索因子是如此之高,以至于我的树被深度构建深度:/
现在我还在模拟阶段使用偏移方式来选择移动:选择移动,玩家会在情况中选择,随机选择AI,导致模拟偏向于玩家。我已经尝试过使用一个纯粹的随机一个,但它似乎给更糟糕的结果。你认为有一个偏差的模拟阶段是否违背了算法的目的?我倾向于认为这会给人工智能带来悲观的看法,并且不会对最终结果产生太大影响。也许我错了。
欢迎任何帮助:)
Thxs for the answer! 1)我试过使用expectimax逻辑,但是RNG elt的数量太大了。我至少有十几种不同的RNG机制,有些具有很大的价值。随着游戏进展,我也会加入更多。所以RNG elt的最终数量会让我的Chance节点失去控制。2)我得到了1.5秒来计算AI – mydi
3)由于玩家设置了自己的AI逻辑(一小段if/else语句),AI知道玩家的动作。我可以利用它来减少计算,但就是这样。 4)我试过一个巨大的eval函数,它太复杂,无法管理。现在我只想找一些像Hp一样体面的东西,如果有必要的话,稍后再改进它 – mydi
你能详细介绍一下你使用的RNG机制吗? “具有大范围的价值”是什么意思?例如,你的意思是例如HP的攻击数量是否受损?在这种情况下,您可能可以计算平均值,而不是为每个可能的数字分支树。 – Sven