人工智能五子棋實現原理


關於棋盤棋子的實現邏輯我就不多說了,大家可以看源碼,並不復雜,說說AI部分的實現吧:

我的實現思路是:

當玩家走下一步棋的時候,AI要考慮兩個因素:

1.走對自己獲得勝利最有利的點(說白了就是最接近5子連線的點)

2.堵對對方獲得勝利最有利的點(說白了就是堵對方的棋子)

做到這兩步就能實現一個初級階段的人工智能了。

那么接下來就講講關於計算獲得勝利最有利的點是如何計算出來的:

其實原理也比較簡單:

在棋盤上計算每個空白位置的點的4個方向(橫向,縱向,左上角到右下角方向,右上角到左下角方向)每個有可能獲勝的方向所連成的以當前棋子為出發點的長度為獲勝棋子數量的(五子棋為5)中途沒有被敵方棋子阻擋的所覆蓋的己方棋子數。(是不是很繞,反正如果是我看到會被繞暈,沒看懂不要緊,下面有栗子,對是栗子)得出每個方向上最大棋子數之后,然后取出每個棋子四個值里最大的值作為獲勝權重(win_weight)。

以下圖為例:

這是一個6x6的棋盤,現在我們來計算一下白子獲勝的權重:

那么權重是如何計算的呢?舉個栗子來說明吧:

首先定義這個棋盤坐標系x方向是向右的,y方向是向下的,左上角的位置是(0,0),(x,y)可以定義一個棋子的坐標。定義xy方向為左上角到右下角方向,yx方向為右上角到左下角方向。

(0,0)點的權重計算:首先判斷這一點沒有連成5子的可能性,權重為0。

(0,2)點的權重計算:首先判斷這一點沒有連成5子的可能性,權重為0。

(0,3)點的權重計算:首先判斷這一點有連成5子的可能性,接下來x軸方向上經過當前位置可連成五子的棋子有0個,y軸方向上經過當前位置可連成五子的棋子有1個,xy方向不存在連成5子的可能性,yx方向上不存在連成5子的可能性,四個方向中,取最大值,結果為1,那么當前點的獲勝權重為1。

以此類推,可以得出所有空白點的白字獲勝權重。

那么我們下一步讓AI直接走獲勝權重最大的點是不是就可以了呢?

非也非也。我們不能只考慮自己獲勝,也要考慮防止對手獲勝。那么如何防止對手獲勝呢?我的方式就是走對手獲勝權重最高的位置就可以了,就素堵住對方的棋子(傳說中的走別人的路,讓別人無路可走)。

同樣的方式,我們可以求得黑子的獲勝權重(win_weight)分布:

可以看出在(0,0),(0,2),(0,4),(0,5)這幾個點是黑子獲勝概率最大的點。白子走在這些點就可以堵住黑棋。

好的我們得到了白子贏得勝利最有利的點,以及白子阻止黑子獲得勝利最有利的點,那么問題來了:我們到底該如何選擇具體走哪個點呢?

有個比較粗劣的實現方式,就是將這兩個權重相加,相當於將這兩個條件同等來對待,認為對白子獲得勝利的影響重要性是相同的,然后取加起來權重最高的點。

但實際情況是這兩個條件對獲得勝利的影響是不等價的,我們要想辦法來得到描述這兩者之間關系的公式。這里的實現方式有:

  • 1.通過試探法(就是瞎猜)

嘗試去將這兩個參數相乘,取得的結果作為最終權重,來進行取值。

或者 白子的獲勝權重 + R * 黑子的獲勝權重, R是一個系數,我們需要通過不斷的調整來接近最好的結果。

通過不斷的嘗試,來將最接近答案的公式猜出來。

  • 2.通過條件分情況來判斷

比如下過五子棋的人都知道一個常識:當對手有三子相連,是一個很危險的情況,如果自己目前沒有三子相連,那么你應該去堵住對方的連在一起的三子。那么就可以判斷,當對手的win_weight >= 3 的時候,加入對手權重的判斷,其余情況不考慮對手獲勝權重。

  • 3.通過機器學習來讓機器理解人類走棋的邏輯

構建機器學習算法,通過大量的訓練數據來訓練機器,從而讓機器通過歷史數據來算出下一步該怎么走

我認為第三種方式是最理想的實現,因為前面兩種無法覆蓋到所有的情況。不過目前我只是做了第一種的簡單的實現,接下來會考慮逐漸完善機器學習算法。

好了,這就是我實現五子棋AI的一個大致思路,有很多人問我什么是機器學習,我覺得在這里可以用一個簡單的比喻告訴大家:

人生會經歷很多事情,當你年幼無知的時候,可能會由於涉世未深而犯很多次錯誤,當你漸漸長大了,成熟了,經歷的事情多了起來,尤其是當你犯錯的時候,有人對你指出這樣做是錯的,你犯錯誤的次數就會慢慢減少,這個過程就像是一個機器學習的過程。

機器積累訓練數據之前,很容易出錯,經過大量的訓練數據訓練之后,就會做的越來越好,這就是機器學習。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM