3

我正在尝试为小型游戏的 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 选择随机移动,从而导致模拟偏向于玩家。我已经尝试对两者都使用纯随机的,但它似乎给出了更糟糕的结果。你认为有一个有偏见的模拟阶段是否有悖于算法的目的?我倾向于认为它只会给人工智能带来悲观的看法,不会对最终结果产生太大影响。也许我的想法是错误的。

欢迎任何帮助:)

4

1 回答 1

4

我认为这个问题对于 StackOverflow 来说太宽泛了,但我会给你一些想法:

  1. 在树搜索中使用随机或概率通常称为 expectimax 搜索。您可以在第 4 章中找到使用 Monte-Carlo 树搜索的 Expectimax Approximation 的一个很好的总结和伪代码,但我建议使用带有 expectimax 扩展的普通极小极大树搜索。有一些修改,如Star1、Star2 和 Star2.5,以获得更好的运行时间(类似于 alpha-beta 修剪)。

    它归结为不仅有决策节点,还有机会节点。每个可能结果的概率应该是已知的,每个节点的期望值乘以它的概率,就可以知道它的真实期望值。

  2. 每次移动 2^5 个节点很高,但不是不可能的高,特别是对于少量移动和浅搜索。即使是 1-3 深度搜索也应该给你一些结果。在我的俄罗斯方块 AI 中,有大约 30 种不同的可能动作需要考虑,我计算以下三个部分的结果(每个可能)来选择我的动作。这在 2 秒内完成。我敢肯定,由于您正在等待用户输入,因此您有更多时间进行计算。

  3. 如果你知道玩家的什么动作是显而易见的,那对你的 AI 来说不应该也是显而易见的吗?

  4. 您不需要考虑单个值 (hp),您可以有几个加权不同的因素来计算期望值。如果我回到我的俄罗斯方块 AI,会计算、加权和相加 7 个因素(凹凸度、最高块、孔数……)。要获得权重,您可以使用不同的方法,我使用遗传算法来找到导致大多数行被清除的权重组合。

于 2015-10-20T10:11:37.800 回答