- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为Buraco纸牌游戏(2和4个玩家)建立有效的AI。
我想避免采用启发式方法:我不是游戏专家,而在过去的游戏中,我都是以此方式开发的,因此我在这条道路上获得了平庸的成绩。
我知道montecarlo tree search algorithm,我曾将它用于具有不同结果的跳棋游戏,但我对其他机器学习选项的近期成功感到困惑。
例如,我发现堆栈溢出中的this answer确实使我感到困惑,它说:
“再说一遍:构建一个可以与自己对抗的机器人。一个共同的基础是函数Q(S,a),该函数为游戏的任何状态和玩家可能采取的行动分配一个值-这就是所谓的Q学习。函数通常被实现为神经网络……尽管我认为这里不需要那么复杂。”
我是机器学习的新手(应该是强化学习,对吗?),我只了解一些Q学习,但这听起来是个好主意:我拿起自己的机器人,与自己竞争,然后从中学习其结果……问题是我不知道如何开始! (如果这种方法不好,那么两者都不行)。
您能帮我找到正确的方向吗?
Q学习策略对我的领域来说是一种好策略吗?
蒙特卡洛仍然是我的最佳选择吗?
在Buraco这样的4人游戏(2个对手和1个队友)中,它会很好地工作吗?
还有其他我忽略的方法吗?
PS:我的目标是为休闲应用开发令人愉悦的AI,我甚至可以考虑通过观察玩家的手或甲板来使AI作弊的可能性。即使这样,嗯,我仍然无法建立良好的启发式方法,我想:/
谢谢你们的帮助!
最佳答案
编辑:再次考虑您在MCTS中的知识以及您对Checkers的实现,我认为我的回答过于教学法了-如果您知道MCTS,您可能知道很多。不过,我希望它会有所帮助。随时在评论中提出具体问题。
我是一个建议您提出一个新问题的人,所以我跌倒了,我至少应该在这里给出答案。但是,从一开始,我想澄清一下这里应该期待什么。您要求的内容非常复杂,并且需要一定的实践经验。我曾有机会为很多游戏实施最佳策略,我认为这仍然是一个严峻的挑战。因此,我认为这里的目标是获得概述-而不是适当的解决方案(由于我不了解Buraco的游戏,我无法给出任何解决方案)。
如另一个答案所述,强化学习理论提供了坚实的基础。一个很好的介绍是萨顿和巴托同名的书。这真的很容易理解,我建议您遍历前五章左右(这些内容涵盖了Dynamic Programming和Monte Carlo)。本书不足之处有两点:(i)没有明确适用于两人游戏,(ii)主要依赖于值函数的表格表示(没有神经网络等。参与)。
实现的基本部分是游戏的状态S
。此状态应尽可能紧凑且非冗余地捕获游戏的完整当前状态。此外,对于每个状态S
,您需要能够分配可用的操作A
(例如拿卡)。此外,根据您要应用的方法,有助于了解概率分布p(S'|S,A)
,该概率分布给出了当您处于状态S'
并执行操作S
时最终处于状态A
的概率。最后,当您处于状态r(S'|S,A)
时,您需要指定奖励S
,并执行操作A
以S'
结尾(对于两个玩家零和游戏,可以很容易地选择奖励: S'
是您获胜的状态,如果您输+1
,则会获得-1
作为奖励;否则,您将获得0
-但是,对于拥有更多玩家或非零和游戏的游戏而言,这不成立。
从给定状态S
,您还可以导出单个玩家看到的简化状态S_P1
,S_P2
等。这些状态捕获特定玩家的信息(当然比完整状态要少-例如,玩家不知道对手的牌,也不知道甲板上的牌顺序)。这些减少的状态为玩家做出决定提供了基础。因此,玩家1的目标是获得一个告诉他的函数Q_1(S_P1, A)
:当我处于状态S_P1
时,我最多应该执行动作A
(这是Q学习的思想)。其他玩家也一样。必须对这些功能进行培训,以便获得最佳结果。
这样做的方法是通过强化学习的中心方程式,即贝尔曼方程式。有几种解决方法,例如值迭代,Monte Carlo(这基本上是您在链接中引用的方法),时间差方法等。这些方法中的一些可以解释为您的数字播放器,它们反复相互竞争,并且在此过程中有望彼此变得更好。但是,这不能保证,就像任何优化问题一样,很容易陷入局部最小值。充其量来说,您已经可以从某个地方拥有一个出色的数字玩家,并且只需训练一个玩家就可以击败他-这样,您可以将两人游戏的问题减少为单人游戏的问题,这要容易得多。
我会在这里进行介绍,因为从书中确实可以更好地掌握这些内容,并且即使我的答案只有十页,我也知道它实际上对您没有帮助。在这里,最后一个建议是如何进行:(i)从书中获得基础,(ii)在其中实现一些玩具问题,(iii)将内容扩展到两个玩家游戏-有关此问题,另请参见极小极大定理,(iv)解决一些更简单的游戏(例如井字游戏,甚至要花很长时间),(v)熟悉神经网络和所有这些东西,并且(vi)解决Buraco-这是一个艰巨的程序。
关于machine-learning - 需要有关Buraco纸牌游戏中令人愉悦的AI的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46370218/
很抱歉新手的问题,但是: 我最近才发现“=”运算符不只是处理对象/等等。值(value),也是引用。这很酷,但我认为这对变量来说是不一样的,它不会在存储整数或 float 的变量之间创建引用。后来我觉
我是一名优秀的程序员,十分优秀!