美文网首页
斗地主AI设计总结

斗地主AI设计总结

作者: 过去_过不去 | 来源:发表于2019-06-05 17:41 被阅读0次

参考链接:TGDC | 腾讯游戏AI研究中心总监邓大付:牌类游戏的AI机器人研究初探

设计目的

根据不同的场景,斗地主AI的设计要求也不同,可以总结为以下几点:

  1. 在玩家掉线的情况下,AI的主要目的是游戏的拖管,我们需要设计的AI需要接近正常人的水平,这样好处一是,当玩家重新边上线时,其牌局形势变化不大,可以让玩家继续发挥自己水平,好处之二就是可以在玩家掉线里不影响体验其他玩家体验.
  2. 在高级比赛竞技中,AI的主要目的是其打牌技术足够强,这个任务的目的和Alpha Go一样.

对于以上两个目的可以概括的说,第一个目的就是要像人,第二个目的是要有高超技术

对于要像人这个目的的技术要点归纳:

可能从大量的玩家游戏记录中,让机器模仿玩家的打法,其实这个思想和生成对抗网络有点像,先让计算机学习玩家打牌,生成打牌方案,再用判别模型让计算机区分这局棋是正常人在打牌还是机器在打牌.

用一张图来表示:

用类似生成对抗网络做斗地主AI拟人模型

图画的有点丑,不过就这样吧.

具体流程如下:


训练生成模型

  1. 使用生成网络(在斗地主游戏中就是让计算机根据当前局势计算下一步的打法)
  2. 将当前局势与计算机得出的打法策略两组数据组合(数据形式[当前局势,计算机出牌策略])
  3. 将数据输入到判别模型中,让判别模型识别这是人在打牌还是机器在打牌
  4. 以上模型在可以建立合适的机器学习模型来训练,首先训练生成模型,在这个训练过程中将判别模型的参数固定,利用误差反向传播训练生成模型参数,使生成模型得出的打牌策略更加像人的打牌情形.

训练生成模型的目的在于使用生成模型在当前的判别规则中,当前的判别器无法识别出机器打法与人打法的区别.既然训练之后判别模型已经无法区分机器打法与人打法的区别了,那么接下来差别模型就要进行训练,使差别模型可以找到更有用的特征来区分机器打法与人打牌.

训练判别模型

  1. 使用生成网络(在斗地主游戏中就是让计算机根据当前局势计算下一步的打法)
  2. 将当前局势与计算机得出的打法策略两组数据组合(数据形式[当前局势,计算机出牌策略])
  3. 将数据输入到判别模型中,让判别模型识别这是人在打牌还是机器在打牌
  4. 在训练判别模型中,需要将生成模型的参数固定,差别模型的参数可变,这样就可以利用反向传播来训练判别模型.使得差别模型可以找到更好的特征来区分机器打法与人打法.

对于生成对抗网络思想的总结:

其实生成对抗网络就是利用了一种对敲的思想,生成器的目的就是希望通过优化自己,让自己得出的数据尽可能多的被判别为是人的打法.而判别模型的目的就是希望通过优化自己,拿自己将尽可能多的机器打牌记录给区分出来.

在模型中,其实生成模型一直占据主动地位而判别模型处于被动地位,通过不断的对敲训练,可以使生成模型不断的提升自己性能,在最终状态下,判别模型无法识别出两种打法的区别.

关键要点:如何设计模型模型和判别模型?


笼统一点讲,对于上面两个模型,我们希望我们所建立模型能理解打牌这个游戏的过程.当然这个问题又可以分成两个:

第一个问题: 我们应该如何表示打牌过程中的形势?
我们需要一种合理的数据表示方式,我们希望这种数据形式尽可能多的包含当前局势信息,而且最好的即没有冗余数据也没有缺少信息.
在这里,数据应该怎么表示我们暂且不考虑,我们先来想想当前局势应该包含那些信息:

  1. 玩家手中里的牌的信息
  2. 已经在牌堆里面的信息
  3. 剩下未知牌的信息(其实这个信息可以从前面的两组信息计算得出)
  4. 其他玩家手里牌的张数
  5. 自己的身份,是上家,下家,地主
  6. 自己打牌之前两个玩家出的牌

下面说一下考虑这些信息的意义:

  • 第1,2,3,4条信息可以用来帮助玩家进行对手牌的推测,让模型学习学析对手可能有的牌的情况
    -. 第1条信息可以用于帮助模型了解自己的形势
    -. 第6条信息可以帮助模型了解自己应该怎么出牌:如果是(PASS,PASS) 那么玩家可以自由出牌;如果是(出牌,PASS)或者(PASS,出牌) 那么玩家需要根据它们给的形式去接牌.
    -. 第5条信息是帮助玩家了解自己的身份,是现其他人呈合作关系,还是敌对关系.

在数据的表示上,我的设想也是使用多层"图像",在一定意义上,它确实是一张图像.

数据表示)G.png

上面所说明的信息(1)为例:

因为牌总共有54张,4种花色各13张加小王大王,我们可以将之表示为一个4*15矩阵,其中4表示4种花色,每种花色一行,15表示列,代表A234-KwW的牌,每张牌在矩阵中对应了一个位置.
如果牌在当前玩家手中,那么就在该位置用1表示,如果不在玩家手中,就可以用0表示,就可以得到一张由0和1构成的二维图像.
同上理,已经在牌堆的和未知牌的信息也可以用这种方式表示.

再将前面两个玩家的打法也可以使用矩阵表示堆叠起来.

将上面矩阵堆叠,就可以得到一个4 * 15 * 5 的矩阵

不过还有几个信息采用上面矩阵的方式处理:

  1. 其他玩家手里牌的张数
  2. 自己的身份,是上家,下家,地主

前面已经说过,这两个信息其实也非常重要,对于信息5,因为只有三种情况,我们或许可以借鉴word2Vec的思想,就是把每个身份编码成一个语义微量,最后将语义向量和其他数据的提取的信息拼接.

对于每个玩家手里牌的数据,或许可以用数字嵌入进去,不过我总感觉似乎有点问题,心里有点忐忑.不过先就这样吧.

上面的模型总体概括网络图就是如下:

打牌决策网络模型

因为斗地主的打牌方法实在太多了,如果不把主牌和带牌分开,那就有非常多种可能,所以需要考虑把模型拆开:
-. 主牌动作309种,使用独热编码
-. 从牌动作,使用sigmoid,可以另外做一下带牌网络来预测带牌情况

先写一个TODO吧,后面再写

未解决的问题?

  1. 对于类似图像的数据,使用什么CNN网络好?
  2. 对于不同玩家牌数信息是否需要更好的表示?
  3. 判别模型的怎么构建?
    4.上面的目的是基于如何使AI类似人,那要让AI具有高超水平应该怎么做?

相关文章

网友评论

      本文标题:斗地主AI设计总结

      本文链接:https://www.haomeiwen.com/subject/rdhsxctx.html