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

来源:互联网 发布:数据结构设计怎么写 编辑:程序博客网 时间:2024/06/05 07:09

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<int,int> > v;generatepoint(v);int len=v.size();int best=INT_MAX;for(int i=0;i<len;++i){pos[v[i].first][v[i].second]=1;//【AAAAA】我是极小层,我要的是更小的数。我找过的孩子中,目前为止找到的最小的数是best,如果best小于了前辈们之前找到的最小值,那么我将更新它,并且告诉下面未遍历过的孩子,比alpha大的数就不要再给我了 int tmp=max_alphabeta(depth-1,v[i].first,v[i].second,best<alpha?best:alpha,beta); pos[v[i].first][v[i].second]=0;if(tmp<best)best=tmp;if(tmp<beta)break;} return best;}int max_alphabeta(int depth,int i1,int i2,int alpha,int beta){int res=evaluate_minmax_noalphabeta();Chess cc;cc.chess_isover(i1,i2,1);if(isover!=0||depth<=0){isover=0;return res;}vector< pair<int,int> > v;generatepoint(v);int len=v.size();int best=INT_MIN;for(int i=0;i<len;++i){pos[v[i].first][v[i].second]=2;int tmp=min_alphabeta(depth-1,v[i].first,v[i].second,alpha,best>beta?best:beta);pos[v[i].first][v[i].second]=0; if(tmp>best)best=tmp; //【AAAAA】这是极大层,电脑选取最大值点。到目前为止(i=0),已知tmp。那么该层向上返回的值将不小于tmpif(tmp>alpha)break;//【AAAAA】我的上一层告诉我,它找到的最小的数是alpha,它是极小层,他需要更小的数。如果我找到的tmp比alpha大,那么就不要找了,因为我是极大层,我只会返回更大的数给上一层} return best;}void Chess::chess_ai_minmax_alphabeta(int &x,int &y,int depth){vector< pair<int,int> > v;generatepoint(v);int best=INT_MIN;int len=v.size();vector< pair<int,int> > v2; for(int i=0;i<len;++i){pos[v[i].first][v[i].second]=2;int tmp=min_alphabeta(depth-1,v[i].first,v[i].second,INT_MAX,INT_MIN);if(tmp==best)v2.push_back(v[i]);if(tmp>best){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



0 0
原创粉丝点击