当前位置: 首页 > 知识库问答 >
问题:

Buraco纸牌游戏中一个令人愉快的AI所需的建议

秦新立
2023-03-14

我正在尝试为Buraco纸牌游戏(2人和4人)建立一个有效的AI。

我想避免启发式的方法:我不是游戏的专家,在我用这种方法开发的最后几个游戏中,我用这种方法获得了平庸的结果。

我知道montecarlo树搜索算法,我曾用它做过一个结果离散的跳棋游戏,但我真的被最近其他机器学习选项的成功搞糊涂了。

例如,我在stack overflow中找到了这个答案,这个答案真的让我很困惑,它说:“所以,再来一次:构建一个可以与自己对抗的机器人。一个常见的基础是一个函数Q(S,a),它为玩家的任何游戏状态和可能的动作分配一个值--这叫做q-learning。这个函数通常被实现为神经网络……尽管我认为它在这里不需要那么复杂。”

我对机器学习很陌生(这应该是强化学习吧?)我只知道一点Q学习,但这听起来像是一个伟大的想法:我采取我的机器人,使发挥自己,然后它学习它的结果…问题是,我不知道如何开始!(如果这种方法是好的还是不好的,也是不好的)。

你能帮我找到正确的方向吗?Q学习策略对我的领域是一个好的策略吗?蒙特卡洛仍然是我最好的选择吗?在像布拉科这样的4人比赛中(2个对手和1个队友),它能很好地发挥作用吗?还有其他方法我忽略了吗?

PS:我的目标是为一个随意的应用开发一个令人愉快的人工智能,我甚至可以考虑让人工智能作弊的可能性,例如通过看玩家的手牌或套牌。即使有了这个,嗯,允许我也不能建立一个好的启发式,我认为:

谢谢你们的帮助!

共有1个答案

吴鸿禧
2023-03-14

编辑:再想想你在MCTS方面的知识和你对跳棋的实现,我认为我的答案过于教化了--如果你知道MCTS,你可能知道很多。尽管如此,我还是希望能有所帮助。请在评论中提出具体问题。

是我建议你开一个新问题,所以我觉得我至少应该在这里给出一个答案。然而,就在一开始,我想澄清一下在这里应该期望什么。你所要求的东西是相当复杂的,需要在实现中有一些扎实的经验。我有机会在相当多的游戏中执行最优策略,我认为这仍然是一个沉重的挑战。所以我想这里的目标是得到一些概述--而不是一个适当的解决方案(我不能给出无论如何,因为我不知道Buraco的游戏)。

正如另一个答案所述,强化学习的理论提供了坚实的基础。一个很好的引言是萨顿和巴托同书名的书。它真的很容易接受,我建议读完前五章左右(这些包括动态编程和蒙特卡罗)。本书不充分的两点是:(1)它没有明确地应用于两人博弈,(2)它主要依赖于价值函数的表格表示(--没有涉及神经网络等)。

实现的一个基本部分是游戏的状态s。该状态应尽可能紧凑、无冗余地捕捉游戏的完整当前状态。此外,对于每个状态S,您需要能够分配可用的动作a(比如拿卡)。此外,根据您要应用的方法,了解概率分布p(S's,A)会有帮助,当您处于状态S并执行动作A时,概率分布给出了最终处于状态S'的概率。最后,当您处于状态S时,您需要指定奖励R(S'S,A)并执行动作AS'结束(对于两个玩家的零和游戏,奖励可以很容易地选择:当S'是您获胜的状态时,您将获得+1作为奖励,如果您输了-1,否则0--但是对于玩家多的游戏或非零和游戏则不适用)。

从给定的状态s,您还可以导出单人玩家看到的简化状态s_p1s_p2等。这些状态捕获特定玩家的信息(当然比完整状态要少--例如,玩家不知道对手的牌,也不知道牌在牌组中的顺序)。这些减少的状态提供了玩家做出决定的基础。因此,玩家1的目标是获得一个函数Q_1(S_P1,a),它告诉他:当我处于状态S_P1时,我最多应该做动作a(这是Q学习的思想)。其他球员也是如此。必须对这些函数进行训练,以便得出最佳结果。

这样做的方法是通过强化学习的中心方程,贝尔曼方程。有几种求解方法,如值迭代法、蒙特卡洛法(这基本上是您在链接中引用的方法)、时差法等。这些方法中的一些可以解释为你的数字球员,他们反复地相互比赛,并在这个过程中希望得到更好的每一个。但是,这并不是保证的,它很容易像在任何优化问题中一样陷入局部极小。充其量你手边已经有了一个好的数字玩家(从某个地方),你只训练一个玩家来打败他--这样你就把两个玩家的问题简化为单人的问题,这就容易多了。

我将在这里做一个删减,因为这些东西真的更好地从书中掌握,因为我知道这个答案对你几乎没有帮助,即使它有十页长。这里是最后一个如何继续的建议:(i)从书中获得基础,(ii)实现其中的一些玩具问题,(iii)将这些东西扩展到两个玩家的游戏--这也参见极小极大定理,(iv)解决一些更容易的游戏(像井字游戏,即使这需要很长时间),(v)熟悉神经网络和所有这些东西,(vi)解决buraco--然而,这是一个很难的程序。

 类似资料:
  • 我在做一个匹配的纸牌游戏,但我不明白如何实际做到这一点。我希望有人能帮我解释一下我能做些什么来解决这个问题。 以下是规格: 在一个对的纸牌游戏中,目标是翻出对匹配的纸牌。 https://en.wikipedia.org/wiki/contension_(游戏)以下是我们考虑的配对变化的规则。 在游戏开始时,有n张牌面朝下,其中n是4的倍数。每种卡片有4张,卡片上标有字母a、b、....例如,如果

  • 我正在尝试创建一个MVC模式的回合制卡牌游戏。我对正确的设计有些怀疑。 我创建了一个由这些类组成的模型: 卡(使用套装) 套牌(40张牌,抽取牌法,剩余牌数) 表 套装(enum) 玩家(手牌,人名,手牌数,收藏牌我想) 游戏模型(引用了Deck、Table,并在构造函数中包含两个玩家) 我将在用户按下“新游戏”按钮时创建两个Player对象和GameModel(计算机和Player)。这样做对吗

  • 我试图用Java实现纸牌游戏“Skat” 规则: 有32张卡片。每张牌在游戏中只存在一次。 颜色有:梅花、黑桃、红心、钻石 价值观是:王牌,国王,王后,杰克,十,九,八,七 那些牌被洗牌了。有三名球员 第一轮:每位玩家有3张牌。然后将两张卡片放入Skat。 第二轮:每位玩家再获赠4张牌。 第三轮:每位玩家再获得3张牌。 期望输出:每个玩家的牌都被展示(每张牌都应该存在一次) 我的产量:钻石七(32

  • 你玩一个新的集换式卡牌游戏。你和电脑各有一张牌。计算机放置一张卡,然后您放置卡。每张牌都有一个强度值,具有较高强度值的卡获胜。如果您和 If 计算机具有同样强大的卡,则计算机获胜。您知道计算机的卡。你的目标是计算你赢得的最大化卡牌的强度值之和。为此,您将获得两个整数数组,它们代表您的卡和计算机的卡。 你会有[5,15,100,1,5]的牌。电脑使用相同的牌,所以也使用[5,15,100,1,5]。

  • 我尝试在Java实施纸牌游戏“滑冰” 规则: 有32张牌。每张牌在游戏中只存在一次。 颜色是:梅花、黑桃、红心、钻石 这些值是:王牌、国王、王后、杰克、十、九、八、七 那些牌被洗牌了。有三个队员 第一回合:每位玩家获赠3张牌。然后将2张牌放入滑板中。 第二回合:每名玩家再获4张牌。 第三回合:每名玩家再获3张牌。 想要的输出:露出的每个玩家的牌(每张牌都要存在一次) 我的输出:钻石七(32次) 我

  • 这是我关于堆栈溢出的第一个问题,所以如果我的问题中有一个新手错误,请原谅,请随时更正,因为我计划在未来几个月内更多地使用此网站。 不管怎样,我是高中12年级的学生,我被一个家庭作业问题卡住了。所以基本上我们被分配了一个创建战争游戏(纸牌游戏)的项目,我们被要求每天做一小部分。到目前为止,直到今天一切都很顺利,因此我向你们提出了这个问题。 以下是该项目的内容: 卡片 它有什么: 私有int值:卡的值