五子棋(人机)-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
- 五子棋(人机)-alpha-beta剪枝
- 五子棋AI算法-Alpha Beta剪枝
- 五子棋AI算法第三篇-Alpha Beta剪枝
- alpha-beta剪枝搜索
- 例析Alpha-Beta剪枝
- Alpha-Beta 剪枝算法
- alpha beta 剪枝算法
- alpha-beta剪枝
- Alpha-Beta剪枝算法
- Alpha-beta剪枝算法
- 例析Alpha-Beta剪枝
- Alpha-beta剪枝-井字棋
- Alpha-Beta剪枝(Alpha Beta Pruning)
- Alpha-Beta剪枝算法(Alpha Beta Pruning)
- 【alpha-bet剪枝】五子棋AI
- 五子棋AI博弈树之带Alpha-Beta剪枝的极大极小过程函数
- 对抗博弈 alpha-beta剪枝
- 五子棋(人机)-只算杀棋
- 把arguments转换为数组
- Android之Service
- 使用Git来部署线上代码
- 英语学习的一点东西
- Python创建虚拟环境
- 五子棋(人机)-alpha-beta剪枝
- Android之BroadcastReceiver
- npm install出错
- python实现多线程压测post接口服务
- hive和hadoop的dos操作语句
- 堆排序
- Android网络编程(六)OkHttp3用法全解析
- 如何正确使用@synthesize(在有了自动合成属性实例变量之后,@synthesize还有哪些使用场景?)
- 硬盘接口种类