五子棋AI算法简易实现(七)
程序员文章站
2024-03-18 15:03:04
...
电脑AI篇
(4)AlphaBeta剪枝算法
AlphaBeta剪枝算法的根据说白了其实就是棋手不会选择不利于自己的走法,当一个节点的估值明显不利于自己的时候,就会选择丢弃这个节点。
该算法保持两个值,alpha和beta,它们分别表示max层的玩家可以确保的最小分数和min层的玩家可以得到的最大分数。最初,alpha是负无穷,而beta是正无穷,即两个棋手都以最差的分数开始。每当min层的玩家确定的最大分数变得小于等于max层的玩家确定的最小分数(即β<=α)时,max层的玩家不需要考虑该节点的后代,因为它们将永远不会被选择。
这是我从*上摘抄下来的动图
更加详细的解释可参考这篇博客
代码实现:
var alpha = Number.NEGATIVE_INFINITY,
beta = Number.POSITIVE_INFINITY;
var alphaMultiple = 0.1, //使得best的值足够小
betaMultiple = 10; //使得best的值足够大
//max函数
var max = function(board, color, alpha, beta, deep){
var v = ModuleEvaluate.evaluate(board);
if(deep <= 0 || ModuleWinnerCheck.checkWinnerInAiController(board, color))
return v;
var best = MIN;
var points = StepGenerator.generateAllNextPossibleMove(board, color);
for( var i = 0; i < points.length; i++){
pointCounter++;
var p = points[i];
board[p[0]+2][p[1]+2] = color;
var v = min(board, Math.abs(color-1), alpha, best > betaMultiple*beta? best : beta, deep-1);
board[p[0]+2][p[1]+2] = 'e';
if(v > best)
best = v;
if(v > alpha)
break;
//alpha:上一层(min层)的当前最小值,v:当前层(max层)的下一层的最小值
/*我方在当前位置的下子,应当使对方紧接着的下子所产生的优势不超过对方上一步下子所产生的优势*/
}
return best;
};
//min函数
var min = function(board, color, alpha, beta, deep){
var v = ModuleEvaluate.evaluate(board);
if(deep <= 0 || ModuleWinnerCheck.checkWinnerInAiController(board, color))
return v;
var best = MAX;
var points = StepGenerator.generateAllNextPossibleMove(board, color);
for( var i = 0; i < points.length; i++){
pointCounter++;
var p = points[i];
board[p[0]+2][p[1]+2] = color;
var v = max(board, Math.abs(color-1), best < alphaMultiple*alpha? best : alpha, beta, deep-1);
board[p[0]+2][p[1]+2] = 'e';
if(v < best)
best = v;
if(v < beta)
break;
//beta:上一层(max层)的当前最大值,v:当前层(min层)的下一层的最大值
/*对方在当前位置的下子,应当使我方紧接着的下子所产生的优势超过我方上一步下子所产生的优势*/
}
return best;
};
项目地址:https://github.com/huangzhutao/Gomoku.git,相关源码可在上面查看
欢迎大家对我叙述和代码中出现的不足之处进行批评指正