python battleship_从零开始Tensorflow: 用AI深度学习来玩战舰棋

注:此文复制于我的微信公众号,猫猫的AI游乐园 原文链接:从零开始Tensorflow: 用AI深度学习来玩战舰棋​mp.weixin.qq.com

上星期和一同事开会讨论设定这个季度的工作目标,结果一进会议室发现小哥在白版上画了个棋盘格子,跟我描述了他昨晚在FB messenger上玩通宵的游戏(如下图),即战舰棋,英文名叫 battleship 也叫 sink U。然后整个会议就变成了讨论各种提高胜率的方法, LOL,Po主灵光一闪,这不是一个很好的深度学习的应用栗子吗? 于是便有了以下的内容, perfect!

没玩过这个游戏?

规则简单来说就是双方有格子相同大小的棋盘,即海域,各自布署几艘长度不一的船(对手不知道你的布署),然后每回合轰炸对手的一个格子,你可以得知是否炸中目标,当整艘船被炸毁时,这艘船会显现出来。 想要获胜,你必须抢先在对手摧毁你所有船只前摧毁对手的所有船只。

看上去很有意思的样子

先上Demo: 5x5的棋盘 两个1x2的船, 左为AI轰炸的路线,右为随机轰炸的路线

为了简化问题,船只均为随机布署,‘-’ 指未被轰炸的格子,‘X’ 指已被轰炸但没击中目标,‘O’ 指击中目标 。 ‘#’ 和 ‘@’ 分别指代这两艘不同的船

可以看出训练出来的AI发现了轰炸对角线是最优的策略,很make sense啊是不是?

我也要玩!

为了让你更好的体验和AI对战的乐趣,我把这个游戏搬上了公众号,给此公众号发任意消息即可开始游戏 :) 界面如下,非常简洁,请不要介意 LOL

输入,输出, 神经网络结构 和 Reward Function

输入为以下几个和棋盘大小一样的平面:

1) 棋盘现在的状态: 未被轰炸的格子为0, 未击中的格子为-1, 击中的格子为1

2) 每艘船的状态: 1为未被击沉,否则为0

输出为一个和棋盘大小一致的平面,代表作为下一个目标的概率,AI会选择最大概率的点作为下一个目标。

我尝试了两种网络结构

1) 三层 Densely Connected Layers

2) 三层 卷积层,采用于之前写的五子棋AI的神经网络简化版,前两层分别用 32,64 units的3x3的filter,最后用1x1 的filter进行降维,再接最后一层Densely Connected layer 输出棋盘概率

结果发现CNN效果稍微要好一些,虽然训练时间更长。

对于 Reward function,我直接用了reference 1里面的,简单来说就是和随机轰炸的命中率做比较,我们希望AI的命中率能尽可能的比随机轰炸的命中率高

关于训练的performance

对于小棋盘如我所用到的5x5,在普通PC上只需要训练半个小时,大概10000次模拟游戏便可从开始的平均20次轰炸才能完成游戏到最后稳定在14次。

Talk is cheap, show me the code!

源代码我放到github上了: https://github.com/Kelvin-Zhong/battleship-reinforcement-learning (开发采用 Python 3.6, Tensorflow 1.7)代码架构比较灵活 :) ,如果你想自己训练一个不同的网络结构,或者游戏设置,我的github上面有描述方法步骤。

ReferenceSimple battleship tensorflow tutorialeNeural Network for Gomoku, tensorflow version written

最后求关注公众号咯,嘿嘿

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值