當前位置:
首頁 > 最新 > 從零開始Tensorflow:用AI深度學習來玩戰艦棋

從零開始Tensorflow:用AI深度學習來玩戰艦棋

上星期和一同事開會討論設定這個季度的工作目標,結果一進會議室發現小哥在白版上畫了個棋盤格子,跟我描述了他昨晚在FB messenger上玩通宵的遊戲(如下圖),即戰艦棋,英文名叫 battleship 也叫 sink U。然後整個會議就變成了討論各種提高勝率的方法, LOL,Po主靈光一閃,這不是一個很好的深度學習的應用栗子嗎? 於是便有了以下的內容, perfect!

沒玩過這個遊戲?

規則簡單來說就是雙方有格子相同大小的棋盤,即海域,各自布署幾艘長度不一的船(對手不知道你的布署),然後每回合轟炸對手的一個格子,你可以得知是否炸中目標,當整艘船被炸毀時,這艘船會顯現出來。 想要獲勝,你必須搶先在對手摧毀你所有船隻前摧毀對手的所有船隻。

看上去很有意思的樣子

先上Demo: 5x5的棋盤 兩個1x2的船, 左為AI轟炸的路線,右為隨機轟炸的路線

為了簡化問題,船隻均為隨機布署,『-』 指未被轟炸的格子,『X』 指已被轟炸但沒擊中目標,『O』 指擊中目標 。 『#』 和 『@』 分別指代這兩艘不同的船

GIF

可以看出訓練出來的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上面有描述方法步驟。

Reference

Simple battleship tensorflow tutoriale

http://efavdb.com/battleship/

Neural Network for Gomoku, tensorflow version written

https://github.com/junxiaosong/AlphaZero_Gomoku/blob/master/policy_value_net_tensorflow.py

最後求關注公眾號咯,嘿嘿


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

2018年開春,最時髦的穿搭看這裡!
易烊千璽:每個女孩子都想要託付終身的理想型

TAG:全球大搜羅 |