首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

基于神经网络的斗地主程序(二)

太长不看版:https://github.com/MrWolffy/Fight-The-Landlord-With-CNN

上一篇文章发出去之后有各路大神给出了各种建议。信科的大神们说可以用强化学习,但是我还没有学过,所以决定暂时先不换模型。这段时间主要的工作在于更换输入和训练左右互搏。

首先将跟牌和出牌的数据分开训练。这一个做法就让预测准确率从原来的65%左右上升到68%-70%左右。在这段时间中我发现了一个重大的bug,收集数据的时候生成的参数和决策的时候生成的参数不对应,导致出牌的时候算出的概率不是正确的概率,所以之前会发现出牌特别玄学。改掉之后出牌变得正常很多。虽然我没有给它任何特判的限制,但是它也学会了一些正常人的出牌方式,比如在跟单牌的时候通常不会把对子拆开。所以说模型还是做出了很多工作的。

和程序打了几局之后我发现程序有一个明显的问题,就是出牌的时候不会选择最小的牌出,这和正常人的思维并不一样,而且这种出牌方式并不能让它的胜率变高。这种问题主要表现在出单牌和对子上,因为高级牌通常不存在最小的问题,有就不错了。因此我增加了几个描述单牌和对子大小的参数,包括出牌的level与手牌最小level的差及其二次项、主动出牌时出的是不是最小、跟牌时出的是不是能管上的最小、以及出牌的level。增加了这几个参数之后训练集上的预测准确率基本达到了70%,而新数据集的预测准确率降到65%。增加参数之后这一问题有了一定改善,但是在很多时候还是不从最小的开始出。

我尝试了让我的程序和python的sample2对打,以及我的程序自己对打。Python的sample2比sample强一些,和它对打我的程序胜率大概是25%左右。对打之后的数据预测准确度仅仅处于机遇水平,在训练集上的预测准确度也不高,大概在65%左右。但是对打后的程序确实强了一些,总体上看表现已经不错了,只是在某些关键点(比如终局前的几手)表现的不如人好,所以和我打的时候会输。

我的程序自己对打的时候数据预测准确度也比较低,新数据集大概在60%多一点,训练集上跟牌的预测准确度大概是66%,出牌的预测准确度可以达到70%以上。经过两轮学习之后我已经有点打不过程序了,之前不出最小牌的问题也已经基本解决。现在程序唯一的缺点就是两个农民之间会互相管,导致农民会输,这一点在我的程序自己对打的时候也验证过了,地主的胜率有60%以上。我在原文里放了一个我的程序自己对打的示例,可以看到在大部分时候程序出牌的思维和人已经比较接近。原文的链接可能需要在电脑端打开,手机端效果不好。

(人不如机器)

之后可能不会再花很多时间来写了,主要是电脑实在受不了而我又懒的租服务器。每次跑程序的时候风扇都会发出很大的声音,在我平时用电脑的时候完全不会这样,怕时间长了影响性能还是别太糟践电脑了。毕竟只是想解锁一个技能而已,没有打算练出来一个无敌程序和别人打。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180908G19E9E00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券