五子棋AI算法简易实现(七)

本文深入探讨了AlphaBeta剪枝算法的工作原理及其在棋类游戏中的应用。通过维持两个值——alpha和beta来评估玩家可能达到的最佳得分,进而决定是否放弃某些不必要的搜索路径。文章还提供了具体的代码实现,并附上了相关项目的GitHub链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

##电脑AI篇

###(4)AlphaBeta剪枝算法
AlphaBeta剪枝算法的根据说白了其实就是棋手不会选择不利于自己的走法,当一个节点的估值明显不利于自己的时候,就会选择丢弃这个节点。

该算法保持两个值,alpha和beta,它们分别表示max层的玩家可以确保的最小分数和min层的玩家可以得到的最大分数。最初,alpha是负无穷,而beta是正无穷,即两个棋手都以最差的分数开始。每当min层的玩家确定的最大分数变得小于等于max层的玩家确定的最小分数(即β<=α)时,max层的玩家不需要考虑该节点的后代,因为它们将永远不会被选择。

这是我从维基百科上摘抄下来的动图
这里写图片描述

更加详细的解释可参考这篇博客

代码实现:

var alpha = Number.NEGATIVE_INFINITY,
	beta = Number.POSITIVE_INFINITY;
	
var alphaMultiple = 1, //使得best的值足够小(无用)
	betaMultiple = 1; //使得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,相关源码可在上面查看
欢迎大家对我叙述和代码中出现的不足之处进行批评指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZTao-z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值