我正在尝试为小型游戏的 AI 实现 MCTS 算法。游戏是一个rpg模拟游戏。AI应该决定在战斗中玩什么动作。这是一场回合制战斗(FF6-7 风格)。不涉及任何运动。
我不会详细说明,但我们可以有把握地假设,在任何给定情况下,当轮到该玩家出牌时,我们肯定知道什么动作会选择玩家。
当一方没有单位存活时,游戏结束(4v4)。它可以进行任意数量的回合(也可能永远不会结束)。伤害计算和技能处理中有很多 RNG 元素(攻击可以命中/未命中,暴击与否,有很多 proc 可以“触发”或不“触发”,buff 可以有 % 值发生等。 ..)。每个单元都有大约 6 种技能,可以让您了解分支因素。
我已经建立了一个初步版本的 MCTS,目前结果很差。我在一些事情上遇到了麻烦:
我的主要问题之一是如何处理我的动作的非确定性状态。我已经阅读了几篇关于此的论文,但我仍然一无所知。
有人建议确定游戏信息并在其上运行 MCTS 树,重复该过程 N 次以涵盖广泛的可能游戏状态,并使用该信息做出最终决定。最后,它确实将我们的计算时间乘以一个巨大的因子,因为我们必须计算 N 次 MCTS 树而不是一次。我不能依赖它,因为在战斗过程中我有成千上万的 RNG 元素:2^1000 MCTS 树来计算我已经在哪里挣扎不是一种选择:)
我有为相同的动作添加 X 个孩子的想法,但它似乎也没有带来一个好的答案。它会稍微平滑 RNG 曲线,但如果 X 的值与特定 RNG 的百分比相比太大/太小,则可以将其向相反方向移动。而且由于我获得了多个 RNG 标准动作(命中变化、暴击几率、触发某些东西的百分比等),我无法找到满足所有情况的合适的 X 值。比其他任何东西都更像是一个坏创可贴。
同样,每个 RNG 元组添加 1 个节点 {hit or miss ,crit or not,proc1 or not,proc2 or not,etc...} 应该涵盖所有可能的情况,但有一些严重的缺点:只有 5 个 RNG 机制意味着每次移动要考虑 2^5 个节点,计算量太大。如果我们设法全部创建它们,我们可以为它们分配一个概率(与节点元组中每个 RNG 元素的概率相关联)并在我们的选择阶段使用该概率。这应该总体上有效,但对 cpu 来说真的很难:/
我也无法将它们“合并”在一个节点中,因为我无法根据两种不同的游戏状态准确地平均玩家/怪物统计数据的值,并且在移动处理过程中平均移动结果本身是可行的,但需要很多简化代码是一种痛苦,无论如何都会很快损害我们的准确性。
你有任何想法如何解决这个问题吗?
该算法的其他一些方面让我无法理解:
在结束状态之前我无法进行完整的播放,因为 A)这将花费我大量的计算时间,并且 B)某些战斗可能永远不会结束(按设计)。我有 2 个解决方案(我可以混合使用) - 随机播放 X 轮 - 使用评估函数尝试对情况进行评分。
即使我只考虑评估健康点,我也无法找到一个好的评估函数来返回给定情况下的可靠值(玩家在 1-4 个单位之间,怪物也一样;我知道他们的 hp 当前/最大值)。令我困扰的是,战斗的长度/权力差异可能会有很大差异。这意味着有时 0.01% 的 Hp 变化很重要(例如,对于长时间的游戏与老板的关系),有时它只是微不足道的(当玩家与他相比的低 lvl 区域时)。
战斗之间的功率差异和 Hp 差异意味着我在 UCB 选择过程中的 Biais 参数很难修复。我目前正在使用非常低的东西,比如 0.03。任何 > 0.1 且探索因子如此之高,以至于我的树是按深度构建的:/
目前,我还在模拟阶段使用偏向的方式来选择移动:它选择玩家在这种情况下会选择的移动,并为 AI 选择随机移动,从而导致模拟偏向于玩家。我已经尝试对两者都使用纯随机的,但它似乎给出了更糟糕的结果。你认为有一个有偏见的模拟阶段是否有悖于算法的目的?我倾向于认为它只会给人工智能带来悲观的看法,不会对最终结果产生太大影响。也许我的想法是错误的。
欢迎任何帮助:)