五子棋(人机)-alpha-beta剪枝

alpha:表示目前为止上一层找到的最小数

beta:表示目前为止上一层找到的最大数

1.极大层的上一层是极小层。一方面极大层找的是自己的子节点中的最大值,另一方面极大层的上一层找的是极大层们提供的节点中的最小一个。

2.如果极大层已经遍历完整一个子树,得到子节点值为tmp,那么就表示该极大层向上提供的节点值至少大于等于tmp(因为极大层向上返回的是孩子中的最大值)

3.如果tmp已经大于了极大层上一层提供给极大层的alpha,也即我极大层虽然没遍历完,但是我的一个孩子已经大于了上一层的最低要求alpha,那么只会返回更大值的我,就不用再继续往下遍历了,即使遍历了,上一层也不要。

以上就是我理解的alpha剪枝,beta剪枝也相似。

//alpha是指遍历过的节点中目前为止找到最小的,beta是指遍历过的节点中目前为止找到最大的 
int min_alphabeta(int depth,int i1,int i2,int alpha,int beta)
{
	int res=evaluate_minmax_noalphabeta();
	Chess cc;
	cc.chess_isover(i1,i2,2);
	if(isover!=0||depth<=0)
	{
		isover=0;
		return res;
	}
	vector< pair > v;
	generatepoint(v);
	int len=v.size();
	int best=INT_MAX;
	for(int i=0;i > v;
	generatepoint(v);
	int len=v.size();
	int best=INT_MIN;
	for(int i=0;ibeta?best:beta);
		pos[v[i].first][v[i].second]=0; 
		if(tmp>best)	best=tmp; //【AAAAA】这是极大层,电脑选取最大值点。到目前为止(i=0),已知tmp。那么该层向上返回的值将不小于tmp
		if(tmp>alpha)	break;//【AAAAA】我的上一层告诉我,它找到的最小的数是alpha,它是极小层,他需要更小的数。如果我找到的tmp比alpha大,那么就不要找了,因为我是极大层,我只会返回更大的数给上一层	
	} 
	return best;
}
void Chess::chess_ai_minmax_alphabeta(int &x,int &y,int depth)
{
	vector< pair > v;
	generatepoint(v);
	int best=INT_MIN;
	int len=v.size();
	vector< pair > v2; 
	for(int i=0;ibest)
		{
			best=tmp;
			v2.clear();
			v2.push_back(v[i]);
		}
		pos[v[i].first][v[i].second]=0;		
	}
	len=v2.size();
	int i=(int)(rand()%len);
	x=v2[i].first;
	y=v2[i].second; 
}
效果没有传说中的好,往后计算4步,得卡很久。

参考:http://blog.csdn.net/lihongxun945/article/details/50668253

http://www.cnblogs.com/pangxiaodong/archive/2011/05/26/2058864.html

http://www.cnblogs.com/IThaitian/p/3616550.html



你可能感兴趣的:(五子棋(人机)-alpha-beta剪枝)