我正在尝试为Buraco纸牌游戏(2名和4名玩家)建立一个有效的AI。
我想避免使用启发式方法:我不是游戏的专家,而且在我开发的最后一场比赛中,我用这条路获得了平庸的结果。
我知道montecarlo tree search algorithm,我已经将它用于具有离散结果的跳棋游戏,但我对最近其他机器学习选项的成功感到困惑。
例如我发现堆栈溢出中的this answer让我很困惑,它说: “所以再说一次:构建一个可以对抗自己的僵尸程序。一个常见的基础是一个函数Q(S,a),它赋予任何游戏状态和玩家可能的行动价值 - 这称为Q学习。这就是函数通常被实现为一个神经网络...虽然我认为它不需要那么复杂。“
我对机器学习很新(这应该是强化学习,对吧?)我只知道一点Q学习,但这听起来是个好主意:我带着我的机器人,对抗自己,然后它从结果中学习......问题是我不知道如何开始! (如果这种方法可能是好的,也不会。)
你可以帮助我找到正确的方向吗? Q-learning策略对我的域名来说是一个好的策略吗? 蒙特卡洛仍然是我最好的选择吗? 它会像Buraco(2个对手和1个队友)这样的4人游戏中运作良好吗? 还有其他方法我忽略了吗? PS:我的目标是为休闲应用开发一个令人愉快的AI,我甚至可以考虑通过观察玩家的手或牌组来让AI作弊的可能性。即使有这个,嗯,许可我也无法建立一个好的启发式,我想:/谢谢你们的帮助!
答案 0 :(得分:0)
我是那个建议你提出一个新问题的人,所以我沮丧我至少应该在这里给出答案。但是,在开始时,我想澄清一下应该在这里期待什么。你要求的东西是非常复杂的,需要一些坚实的实现经验。我有机会为很多游戏实施最佳策略,我认为这仍然是一个严峻的挑战。所以我认为这里的目标是得到一些概述 - 而不是一个正确的解决方案(因为我不知道Buraco的游戏,所以我无论如何也无法提供)。
如其他答案所述,强化学习理论提供了坚实的基础。一本很好的介绍是萨顿和巴托的同名书。这是真的可读,我建议通过前五章左右(这些章节涵盖动态编程和蒙特卡罗)。本书不充分的两点是:(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学习)。其他球员也一样。必须对这些功能进行培训,以便获得最佳结果。
这样做的方法是通过强化学习的中心方程式,贝尔曼方程。有几种解决方法,如值迭代,蒙特卡罗(这基本上是您在链接中引用的方法),时间差异方法等。这些方法中的一些可以被解释为您的数字播放器,它们反复相互竞争,并且在此过程中希望每个方法都变得更好。但是,这不能保证,很容易像任何优化问题一样陷入局部最小值。充其量你已经掌握了一个好的数字播放器(来自某个地方)并且你只训练一个玩家来击败他 - 这样你就可以将双人游戏问题减少到一个单人游戏的问题,这个问题要容易得多。
我会在这里剪一下,因为从书中可以更好地掌握这些东西,因为我知道这个答案对你来说实际上并没有帮助,即使它长达十页。这里有一个最后的建议如何继续:(i)从书中获得基础,(ii)在其中实施一些玩具问题,(iii)将这些东西扩展到两个玩家游戏 - 参见最小极大定理,(iv)解决一些更简单的游戏(如tic-tac-toe,即使这需要很长时间),(v)熟悉神经网络和所有这些东西,并且(vi)解决Buraco - 这是一个艰难的程序,但是。