【转载】基于蒙特卡洛猜牌-极大极小搜索-alpha-beta剪枝-AI斗地主

蒙特卡洛树搜索
全称 Monte Carlo Tree Search(MCTS),是一种人工智能问题中做出最优决策的方法,一般是在组合博弈中的行动(move)规划形式。它结合了随机模拟的一般性和树搜索的准确性。MCTS 受到快速关注主要是由计算机围棋程序的成功以及其潜在的在众多难题上的应用所致。超越博弈游戏本身,MCTS 理论上可以被用在以 {状态 state,行动 action} 对定义和用模拟进行预测输出结果的任何领域。

原文地址

一、程序设计

MCTS通过很多次模拟真实对局,当模拟的次数足够多,(利用大数定律)模拟后获得的最佳收益的节点,就接近于理论上真实的最佳收益节点。那么这个节点所包含的Action(行动)就是当前state(状态)下最佳的选择。以斗地主来为例,MCTS就是在当前各家手牌的情况下,在符合斗地主规则和出牌常规的情况下框定可选的行动,进行n次模拟对局,每次对局都执行不完全相同的行动,记录和更新每种行动带来的收益,最终选择收益最佳的行动(出牌、跟牌或不出)。

一般情况下MCTS适用于二人零和完全信息博弈游戏。然而斗地主是3人游戏,并且是非完全信息博弈游戏,MCTS能适用吗?
我们先来尝试简化这个问题。首先,如果斗地主是明牌的,在规则允许的情况下,每个玩家的可选行动对其他玩家都是透明的,那就变成了3人完全信息博弈游戏。其次,斗地主中3个人分为两派,可以将2个农民和1地主之间的博弈,看成2人零和游戏。这样来考虑之后,斗地主就变成了MCTS擅长的“二人零和完全信息博弈游戏”了,理论上应该是可以实现的。

MCTS循环
每一次MCTS树搜索分为4个步骤:
1.选择(selection):从非叶子节点中选择未完全扩展的节点进行扩展;如果叶子节点都已扩展,选择UCT最高的节点。
2.扩展(extension):
选择第一个未尝试的行动。
用这个行动创建一个新的MCTS节点。其中父节点为当前节点,游戏状态为执行行动之后的游戏状态,此行动作为节点引发的行动。
将扩展出来的新节点加入MCTS树上。
返回新节点。
3.模拟(simulation):推演游戏过程,最终返回游戏结果信息(一般包括游戏得分,胜方等)。
4.反馈(backpropagation):反向传播游戏结果,更新各节点的q和n。
重复进行以上4个步骤足够多的次数,就可以通过选择UCT最高的节点作为下一步行动。

二、效果实现

AI 对局

请添加图片描述

其他效果省略

三、核心算法

本次毕设系统在设计中,主要采用Nodejs html javascript css结合的方式实现前端扑克牌对局,其中Nodejs主要实现对局算法的实现以及接收界面端用户操作的数据,实现用户线上对局的总体功能点。

核心算法实现


class AI{
    
    constructor(param) {
    
        param = param || {
    };
        this.player = param.player;
        this.game = param.game;
    }
    classify(pokerList){
    
        pokerList.sort(this.sortFunction);
        if(pokerList.length===0){
    
            return {
    1: [],2: [],3: [],4: []};
        }
        let lastPoker = pokerList[0];
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tinyfox_z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值