五子棋AI博弈树之带Alpha-Beta剪枝的极大极小过程函数



在博弈树的极大极小过程中是对每一个树节点(称它为全局搜索吧)都要计算其估值,然后在这些估值中做出选择。如果搜索比较大的话,全局搜索的方式效率会非常低,因为有一些节点根本不需要搜索。那么怎么加快搜索的速度呢?可以采用Alpha-Beta剪枝方法。

 

Alpha-Beta剪枝方法如下:

  1. 任何Max节点nalpha值如果大于或等于它先辈节点的bete值,那么节点n以下的分支就不用搜索了。这是beta剪枝。

  2. 任何Min节点的beta值如果小于或等于它先辈节点的alpha值,那么节点n以下的分支也不用搜索了。这是alpha剪枝。

下面给出代码:

// 带Alpha-Beta剪枝的极大极小过程函数,按指定的深度,搜索产生一个走法
int ChessAI::maxMinWithAlphaBetaCut(int** chessBoard, int whiteOrBlack, int depth, Point opPos, int alpha, int beta)
{
	int bestValue, curValue;  // bestValue是最好的分数, curValue是试探下子后,该次下子的分数

	if (isBE5AtPoint(chessBoard, whiteOrBlack == 2 ? 1 : 2, opPos))   // 如果在这里可以分出胜负
	{
		if (whiteOrBlack == 1)  // 电脑赢。这里为什么不是2呢?因为这里whiteOrBlack与opPos是相反关系
		{
			return FIVE_ALIKE;
		}
		else   // 玩家赢
		{
			return -FIVE_ALIKE;
		}
	}
	else if (depth == 0)   //深度为0,估值返回
	{
		bestValue = getValue(chessBoard);
	}
	else
	{
		// 下面开始是利用了剪枝思想的极大极小过程
		if (whiteOrBlack == 2)  // 此节点为电脑白子,取极大值
		{
			// 下面开始对各个可以下的子进行评分
			for (int i = 0; i <= 14; i++)
			{
				for (int j = 0; j <= 14; j++)
				{
					if (chessBoard[i][j] == 0)  // 如果可以下子
					{
						if (alpha >= beta)  // alpha剪枝
						{
							return alpha;
						}
						chessBoard[i][j] = whiteOrBlack; // 试探下子
						curValue = maxMinWithAlphaBetaCut(chessBoard, 1, depth - 1, cocos2d::Point(i, j), alpha, beta);
						chessBoard[i][j] = 0;  // 撤消下子
						if (curValue > alpha)
						{
							alpha = curValue; //子节点的最大值记录到alpha中
						}
					}
				}
			}
			bestValue = alpha;
		}// end if (whiteOrBlack == 2)
		else if (whiteOrBlack == 1)  // 此节点为玩家黑子,取极小值
		{
			for (int i = 0; i <= 14; i++)
			{
				for (int j = 0; j <= 14; j++)
				{
					if (chessBoard[i][j] == 0)  // 如果可以下子
					{
						if (alpha >= beta)  // beta剪枝
						{
							return beta;
						}
						chessBoard[i][j] = whiteOrBlack; // 试探下子
						curValue = maxMinWithAlphaBetaCut(chessBoard, 2, depth - 1, cocos2d::Point(i, j), alpha, beta);
						chessBoard[i][j] = 0;  // 撤消下子
						if (curValue < beta)
						{
							beta = curValue; //子节点的最小值记录到beta中
						}
					}
				}
			} // end else if (whiteOrBlack == 1) 
			bestValue = beta;
		}
	}  // end else : (depth > 0)

	return bestValue;
}

你可能感兴趣的:(C++学习笔记)