围棋在人工智能中的应用博弈树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
围棋在人工智能中的应用——博弈树搜索
搜索是人工智能中的一个基本问题,是推理不可分割的一部分,它直接关系到智能系统的性能与效率,尼尔逊把它称为人工智能研究中4个核心问题之一。根据问题的实际情况不断寻找可利用的知识,从而构造一条代价较小的推理路径,使问题得到解决的过程称之为搜索。搜索分为盲目搜索和启发式搜索H_J。盲目搜索是在预先控制策略中进行搜索,在搜索过程中获得的中间信息不用来改进控制策略。启发式搜索是在搜索过程中引入了与问题有关的启发式信息,以指导搜索的方向,加速问题的求解过程并找到最优解。
1博弈树搜索算法
博弈事件千差万别,但在具体的博弈事件背后都有着共同的特性:二人零和、全信息、非偶然。博弈树是一棵“与或”树,此“与或”树是始终站在某一方的立场上得出的,与或节点交替出现,在博弈事件中,每一个格局可供选择的行动方案都有很多种,因此会生成一个十分庞大的博弈树。
博弈树搜索可以脱离具体的博弈事件,完全在算法的级别上进行研究。博弈树只是实现求解的一部分,在搜索过程中还要注意其它问题,如行为的产生、搜索的方法及搜索的顺序。
估值函数对于一个具体的博弈事件来说是机器求解是否准确的关键,博弈树搜索效率的高低,最后作为行动优劣的取舍都是根据估值函数的结果确定的。在博弈事件中·,估值函数很难确定,它要根据具体情况的不断变化来确定,所以在整个过程中它是需要反复被验证的,权值需要反复修改,最终确定一个最佳值。
1.1极大极小搜索算法
假设有2个博弈者甲和乙(甲为计算机,乙为棋手),在这个博弈事件中我们要为甲找到最佳的走步。现假设甲方先下,乙方后下,深度为奇数的节点为甲方下了一子之后的局面(即乙方选择下法的局面),称之为极小节点;深度为偶数的节点为乙方下一子之后的局面(即甲方选择下法的局面),称为极大节点;博弈树的顶节点深度为0。
一个最佳走步可以由一个极大极小化过程产生,甲方要从搜索树中选择拥有最大值的节点,因此。一个标有“甲”的节点的估计值可以由它的标有“乙”的子节点的最大值确定。另一方面,乙方从叶节点中选择时,由于估计值越小对它越有利,因此必然选取估计值最小的节点(即最负的估计值),因此,标有“乙”的节点估计值可由它的标有“甲”的子节点的最小值确定。综上所述,可由博弈树的叶节点出发向上一层层倒推,得到上一层的估计值,从而得出根节点的估计值,这样就可以确定从根节点出发的最佳走步,称之为极大极小算法,其伪代码如下:
double ji da ji xiao(int depth)
{
int i;
double best,n;
if(比赛结束)
return evaluation();
if(depth==0)
return evaluation();/*叶节点*/
if(甲方)
best=一1 000:
else
best=1 000;/*初始化当前最优值,假设1
000为一个不可能达到的值*/
for(i=1;i<=w;i++)
{
n=ji_da—ji—xiao(depth一1);
if(n>best&&甲方)
best=n;
if(n best=n; } return best; } 1.2 a—p剪枝算法 使用极大极小搜索进行搜索时,随着搜索深度的增加,所花费的时间也大大增加,这是因为搜索过程中存在着大量的数据冗余,a—B剪枝算法解决的主要是数据冗余问题。a(alpha)和p(beta)剪枝的惟一区别在于分析的两层中极大极小值的先后顺序,a是用来取极大值时情况,p是在取极小值时的情况,其伪码如下: double Alpha—Beta(double alpha,double beta, int depth); { int i; double fl,best; if(比赛结束) return evaluation(); if(depth==0) retum evaluation();/*叶结点*/ if(极大节点) { for(i=1;i<=W;i++) { n=Alpha—Beta(alpha,beta,depth一 1); if(best>alpha) alpha=best; } return alpha; } else/*极小节点*/ { for(i=l;i<=w;i++) { n=Alpha—Beta(alpha,beta,depth一1); if(best beta=best; } return beta; } } 1.3小窗口搜索算法 小窗口搜索是一种为了缩小搜索范围而实现的算法,它是将a—B剪枝看作是一种对求解的范围不断缩小的过程。在一定范围内,如果能够精确对搜索进行估值,那么搜索的效率将会大大提高,在极限情况下,如果估计完全准确,那么剪枝的效率将和原来的树的总节点数相同。小窗口搜索是将估计的结果增加一个范围,来提高搜索效率。 窗口越小则可能减去的枝会越多,那么当窗口为0会怎么样呢?极小窗口搜索是根据搜索第1个节点作为估计值的,即在最好的情况下第1个节点就是最优解,它也就是树的最优解。小窗口搜索算法中存在的一个问题是如果估计值落在区域之外,那就不能得到最优解,引人一个标志value,它能够记录失败的原因。 double search(double alpha,double beta,-int depth ); { int i; double n,best; if(比赛结束) retum evaluation(); if(depth==0) retum evaluation();/*叶结点*/ i=N一1search(alpha,beta,depth一1);/*n 一1层的最佳值*/ alpha=x—window; beta=x+window: value=N—Isearch(alpha,beta,depth);/* 确定左右边界再搜索*/ if(value value=N—lsearch(alpha,一1 000, depth); if(value>beta) value=N一1search(beta,1 000,depth); Return value; } 08级计算机系 2班7号 王圆源