- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试为一个小游戏的人工智能实现一个mcts算法。这个游戏是一个RPG模拟游戏。人工智能应该决定在战斗中要玩什么动作。这是一个回合基地战斗(ff6-7风格)。不涉及任何运动。
我不会详细说明,但我们可以放心地假设,当轮到球员上场时,我们肯定知道在任何给定的情况下,球员会选择什么动作。
游戏结束时,一方没有单位活着(4v4)。它可以转任意数圈(也可能永远不会结束)。在伤害计算和技能处理中有很多rng元素(攻击可以命中/未命中,暴击或不命中,有很多过程可以“触发”或不触发,buff可以有%的值发生等等)。
每个单位都有大约6项技能来给出分支因子的概念。
我已经建立了MCT的初步版本,目前效果不佳我有几个问题:
我的一个主要问题是如何处理我的动作的不确定状态我读了几篇关于这件事的文章,但我仍然一无所知。
有些人建议确定游戏信息并在其上运行mcts树,重复n次该过程以覆盖广泛的可能游戏状态,并使用该信息做出最终决定。最后,它确实乘以了我们计算时间的一个巨大因素,因为我们必须计算n次mcts树而不是1次。我不能相信这一点,因为在一场战斗中,我有成千上万的RNG元素:2^1000 MCTS树来计算我已经与之斗争的地方不是一个选项:)
我本来想在同一步中增加x个孩子,但这似乎也不能得到一个好的答案。它可以稍微平滑RNG曲线,但如果X的值与特定RNG的百分比相比太大/太小,则可以将其向相反的方向移动由于我得到了多个rng-par移动(命中变化,暴击几率,命中率等等),我找不到一个像样的x值来满足所有情况。比其他任何东西都更糟糕。
同样,为每个rng元组添加1个节点{hit or miss,crit or not,proc1 or not,proc2 or not,etc.}对于每个移动,应该覆盖所有可能的情况,但有一些严重的缺点:对于5个rng mecanism,仅意味着每个移动需要考虑2^5个节点,计算起来太多了。如果我们能够创建它们,我们可以为它们分配一个概率(与节点元组中每个rng元素的概率相关联),并在选择阶段使用该概率。这应该是一个整体的工作,但在CPU上是非常困难的:/
我也不能将它们“合并”到一个节点中,因为我无法根据两个不同的游戏状态精确地平均玩家/怪物属性的值,并且在移动处理过程中平均移动的结果本身是可行的,但是需要大量的简化,这对代码来说是一个痛苦,而且无论如何都会很快地损害我们的准确性。
你有什么办法解决这个问题吗?
算法的其他一些方面让我难以理解:
我不能做一个完整的播放直到一个结束状态,因为a)这将需要我的大量计算时间和b)一些战斗可能永远不会结束(按设计)。我有两个解决方案(我可以混合)
-随机播放x个回合
-使用评估功能尝试对情况进行评分。
即使我只考虑生命值来评估,我也没有找到一个好的评估函数来返回给定情况下的可靠值(玩家的生命值在1-4个单位之间,怪物的生命值在1-4个单位之间;我知道他们的生命值/最大值)。令我烦恼的是,战斗的时间长短/力量的差异很大。这意味着,有时候惠普0.01%的变化很重要(比如长时间与老板的比赛),有时候只是微不足道(当玩家建立了一个较低的等级区域时)。
战斗之间的力量和HP差异意味着我在UCB选择过程中的BIAIS参数很难确定。我现在用的是很低的值,比如0.03任何大于0.1的东西,而且勘探系数很高,所以我的树是按深度建造的:/
目前,我也在使用一种偏倚的方式来选择移动在我的模拟阶段:它选择的移动,玩家将选择的情况下和随机的一个人工智能,导致模拟偏倚有利于玩家我试过用纯随机的方法来处理这两个问题,但结果似乎更糟。你认为有一个偏倚的模拟阶段,工作的目的与alogorithm?我倾向于认为这只会给人工智能带来悲观的看法,不会对最终结果产生太大的影响也许我想错了。
欢迎任何帮助:)
最佳答案
我认为这个问题对于stackoverflow来说太宽泛了,但我会给你一些想法:
在树搜索中使用随机或概率通常称为expectimax搜索。您可以在第4章中找到Expectimax Approximation with Monte-Carlo Tree Search的良好摘要和伪代码,但我建议使用带有expectimax扩展名的普通minimax树搜索。有一些修改,比如Star1, Star2 and Star2.5以获得更好的运行时(类似于alpha-beta剪枝)。
归根结底,它不仅有决策节点,还有机会节点。每个可能结果的概率应该是已知的,并且每个节点的期望值与其知道其实际期望值的概率相乘。
每次移动2^5个节点是高的,但不是不可能高,特别是对于低移动数和浅搜索。即使是1-3个深度的搜索也会给你一些结果。在我的俄罗斯方块ai中,有大约30个不同的可能移动要考虑,我计算了下面三个部分(每个可能)的结果来选择我的移动。这是在2秒钟内完成的。我相信你有更多的时间来计算,因为你在等待用户的输入。
如果你知道玩家的动作是明显的,那对你的人工智能来说是不是也很明显?
您不需要考虑单个值(hp),您可以有多个权重不同的因素来计算期望值如果我回到我的俄罗斯方块人工智能,有7个因素(颠簸,最高块,洞的数量,…)是计算,加权和加在一起的。为了得到权重,可以使用不同的方法,我使用了一种遗传算法来找到权重的组合,从而清除了大多数行。
关于algorithm - 如何在高度不确定的系统上运行MCTS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33220741/
我有一个关于 MCTS 的基本问题。我的问题是关于开始状态的处理。据我了解,搜索树是通过有效操作的分支来构建的,这会导致每次在相同状态下启动时遍历相同的搜索树。但是如果每次游戏开始时游戏的开始状态都不
我目前正在尝试为我的一个项目实现 MCTS,但我不确定我是否正确理解了节点选择的概念。在游戏开始时,在我随机选择一个 Action 后,将整棵树展开到游戏结束点,然后进行反向传播,这个节点显然比其他所
我正在尝试通过蒙特卡罗树搜索解决 2048 的变体。我发现 UCT 是一种在探索/开发之间进行权衡的好方法。 我唯一的问题是我见过的所有版本都假设得分是胜率。我怎样才能让它适应一个游戏,其中分数是最后
好吧,我基本上了解 MCTS 如何与节点选择等一起工作。我不明白的是随机推出阶段。我随机模拟 future 的游戏步骤直到以赢或输结束,这是否正确?对于具有多种状态、可能的行动以及未知的敌人行动的更复
我试图掌握此实现的流程并弄清楚如何运行此 MCTS 实现:https://github.com/int8/gomcts/blob/master/README.md . 采取的步骤:我遵循了自述文件,但
当我运行我的程序时出现这个错误: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
我想知道MCTS中如何处理N个玩家的游戏。对手的 Action 是否嵌入到搜索树中?它们的值(value)生成方式与其他操作相同吗?如果是这样,它们的值是否会以错误的方式改变父状态的总值(value)
所以我熟悉更基本的树搜索算法,例如带有极小极大的游戏搜索,但我一直在尝试了解有关蒙特卡洛树搜索算法的更多信息,并且想知道它如何处理“精确线”。 在国际象棋中,您可能会遇到 30 次失败但有 1 条获胜
我想并行化我的 MCTS 程序。有几种方法可以做到这一点: 叶并行化,其中每个叶并行展开和模拟。 根并行化,其中每个线程/进程创建一个单独的树,当完成一定数量的模拟时,树被合并以提供更好的统计数据 树
我从官方 MCTS 考试 70-562 书中得到的小测试程序没有触发事件。我在 Debug模式下跟踪了计算机逻辑,它甚至没有进入我的事件,即使我已经设置好一切来处理它们。所以最大的问题是我做错了什么?
MCTS算法的步骤是: 选择 扩张 模拟 反向传播 我的问题涉及第三步,模拟。我们用一个新节点扩展了我们的决策树,并模拟了剩余的 Action ,直到游戏结束。这个模拟可以分为两部分: 轮到我们利用决
在本书的第 123 页 - 第 3 章,第 2 课。它说: ” Page.ViewState 属性提供了一个字典对象,用于在 对同一页面的多个请求。此对象属于 StateBag 类型。当一个 ASP.
如图所示,AlphaGo Zero 神经网络使用损失函数,该函数使用 MCTS 概率和值作为真实标签。我试图了解神经网络的输出是否被视为逻辑(例如实值)或原始概率([0,1])。在损失函数中,看起来
我正在阅读 MCTS 自定进度培训工具包(考试 70-536):Microsoft .NET Framework — 应用程序开发基础,第二版电子书。 现在我正在完成线程章节(第 7 期)。在第 2
在我的书“MCTS 自定进度培训工具包(考试 70-515):使用 Microsoft .NET Framework 4 进行 Web 应用程序开发”的第 418 页上有以下问题: You want
我是一名优秀的程序员,十分优秀!