這個部分我把它分成了兩個函式:
1. 找出雙方所有可能下子的位置(generateallnextpossiblemove函式)
2. 在這些位置中進行挑選,選出能夠產生更大優勢的下子位置,減少博弈樹搜尋節點的次數(pointsfilter函式)
2.2 落子位置的篩選
這一部分主要參考了 這篇部落格上的寫法,這裡有更加詳細的解釋這裡相當於對將要下棋的位置進行了乙個點估值,而不是全域性估值,意思是這個函式將判斷我方(這裡指代電腦ai)在當前下子後,在當前位置上是否能夠產生或者阻止對方形成有利於扭轉當前局勢的棋型,如:五連,活四,雙三等,如果可以,我們就可以按照不同棋型所對應的評估分值的高低對
generateallnextpossiblemove()
函式所生成的所有可能下子位置進行排序,然後將分值最高的位置作為最優解返回到maxmin函式中。
首先,我們要重新定義乙個區域性評估函式(這裡我們沿用前面估值函式中的部分函式和常量)
// color:1表示黑棋,0表示白棋,position:下子位置的二維座標
pointevaluate: function
( matrix, position, color)
else
}
接下來就是最關鍵的篩選函式了
var pointsfilter = function
(new_board, originallist, color)
if(fives.length)
return fives;
if(fours.length)
return fours;
if(twothrees.length)
return twothrees;
return [...threes, ...twos, ...neighbors];
};
這樣做我們就相當於將可能下子的位置按照可生成的優勢棋型所佔分值的高低進行了乙個排序。在測試的過程中,我們可以驚喜的發現,在相同的步數和近似的局勢下,在maxmin演算法中搜尋的節點數從原來的幾萬個甚至幾十萬個縮減到了五千以下,演算法效率提高了不少。
這個函式的呼叫也非常簡單
將原generateallnextpossiblemove()
函式中最後一行的
return [...onestepneighbours, ...twostepneighbours];
替換成
//new_board是當前棋盤
var originallist = [...onestepneighbours, ...twostepneighbours];
return pointsfilter(new_board, originallist, color);
那麼,generateallnextpossiblemove()
函式可以改造成一下變成下面的樣子:
var generateallnextpossiblemove = function
let onestepneighbours = ,
twostepneighbours = ;
let rowend = constants.chessboard.row_num + 2,
colend = constants.chessboard.col_num + 2;
//這裡後面考慮怎麼將其優化,直接將原棋盤傳進去
var new_board = new
array(15);
for(var i = 0; i < 15; i++)
new_board[i] = new
array(15);
for(let i = 2; i < rowend; i++)else
twostepneighbours.push([i-2, j-2]);}}
}}
var originallist = [...onestepneighbours, ...twostepneighbours];
return pointsfilter(new_board, originallist, color);
}
五子棋AI演算法簡易實現(四)
這個部分我把它分成了兩個函式 1.找出雙方所有可能下子的位置 generateallnextpossiblemove函式 2.在這些位置中進行挑選,選出能夠產生更大優勢的下子位置,減少博弈樹搜尋節點的次數 pointsfilter函式 2.1 找出雙方所有可能下子的位置 這個函式用於找出相鄰兩格以內...
五子棋AI演算法簡易實現(七)
4 alphabeta剪枝演算法 alphabeta剪枝演算法的根據說白了其實就是棋手不會選擇不利於自己的走法,當乙個節點的估值明顯不利於自己的時候,就會選擇丟棄這個節點。該演算法保持兩個值,alpha和beta,它們分別表示max層的玩家可以確保的最小分數和min層的玩家可以得到的最大分數。最初,...
Python實現AI五子棋
開發工具 python版本 3.6.4 graphics模組。環境搭建 安裝python並新增到環境變數即可。注 graphics模組在相關檔案中已經提供,就是乙個py檔案,直接放在當前路徑或者放到python安裝資料夾下的site packages資料夾內均可。原理簡介 對於五子棋這樣的博弈類ai...