Alph-Beta搜索算法

合集下载

五子棋中Alpha-Beta搜索算法的研究与改进

五子棋中Alpha-Beta搜索算法的研究与改进
t e e y d r cl e u i h e r h n d r n h n m b r c mb n d wi h a tt a p a Bea a g r hm f c e c sh g l e e a t o t e c id h r b ie t r d cng t e s a c o e b a c u y e; o ie t tefc t h h Al h - t l o i t e f in y i i h y r l v n h h l i t n d r e ,t s p p rp o o e h ttc e a u to e rs i n t r t e d e e n t o s f r o t ia i n o v r e i .E p rme t l o e o d r hi a e r p s s t e sa i v l a i n h u itc a d i a i e p ni g me h d o p i z t f mo e o d r e v m o ng x e i n a r s l h w h t h sm eh d e h n e h f c e c f p a Bea s a c l o i m. e u t s o t a i t o n a c st ee f in y o Al h - t e r h a g r h s t i t
2 极大极小算法
在人机博奔中, 搜索的过程是博弈程序就当前棋局对
未来棋 局 的思考过 程 。 一 思考过程 和人 类走棋 的思考 过 这 程是一 样 的 ,即当 己方在 所有 着法 中选择 走一步 后 ,思考 对 方 能有什 么着法 , 此反复 下去 …… , 一过 程就产 生 如 这 了一颗 博弈树 。 这一过 程 中 , 在 博弈 程序必 须假 定对 方和

Alpha-Beta剪枝算法

Alpha-Beta剪枝算法

注意,由于示例问 题格局数非常少, 我们可以给出完整 的格局树。这种情
况下我可以找到 Minimax算法的全 局最优解。而真实 情况中,格局树非 常庞大,即使是计 算机也不可能给出 完整的树,因此我 们往往只搜索一定 深度,这时只能找
到局部最优解。
这些轮到甲 方的节点叫 做max节点, max节点的 值是其子节 点最大值。 Min节点则
Alpha-Beta 剪枝算法
什么是Alpha-Beta 剪枝算法
• Alpha——beta修剪是一种搜索算法,它试图减少在搜索树中由极 小极大算法评估的节点数量。它是一种对抗性的搜索算法,通常用 于两玩家游戏(井字游戏、棋类、围棋等)的机器游戏。当至少有 一种可能性被发现时,它就会停止完全评估一个动作,这证明了这 一举动比之前检查过的动作更糟糕。这些举措不需要进一步评估。 当应用到标准的极小极大树时,它会返回与minimax相同的移动, 但是去掉那些不可能影响最终决策的分支。
相反。 最终完整赋 值的格局树
如下:
在上面的例子 中,根节点的 价值为20,表 示如果对方每 一步都完美决 策,则我方按 照上述算法可 最终拿到20元, 这是我方在 Minimax算法 下最好的决策。 格局转换路径 如下图红色路
径所示:
• 那这跟alpha-beta剪枝算法有什么关系呢?
• 由于Minimax算法有一个很大的问题就是计算复杂性。它所需 搜索的节点数随最大深度呈指数膨胀,而算法的效果往往和深 度相关,因此这极大限制了算法的效果。
• Alpha-beta算法可以看成变种的Minimax,基本方法是从根节点 开始采用深度优先的方式构造格局树,在构造每个节点时,都 会读取此节点的alpha和beta两个值,其中alpha表示搜索到当 前节点时已知的最好选择的下界,而beta表示从这个节点往下 搜索最坏结局的上界。由于我们假设对手会将局势引入最坏结 局之一,因此当beta小于等于alpha时,表示从此处开始不论最 终结局是哪一个,其上限价值也要低于已知的最优解,也就是 说已经不可能此处向下找到更好的解,所以就会剪枝。

[转载]中国象棋软件-引擎实现(四)搜索算法

[转载]中国象棋软件-引擎实现(四)搜索算法
// 判断游戏是否结束,若结束则根据当前下棋方返回相应的极值,否则返回0 // 当前下棋方胜则返回极大值,当前下棋方败则返回极小值(下棋方追求极大值) int IsGameOver( int fWhoseTurn );
// 执行着法,返回ptTo位置的棋子状况。即若吃掉子返回被吃掉的子,没有吃子则返回0 BYTE DoMove( CCHESSMOVE * move );
然而,下棋是一个你来我往的交替进行并且相互“较劲”的过程,由于每一方都会尽可能将局面导向对自己有利而对对方不利的形势。所以有些“暂时”看来很不错的局面由于可 能会产生很糟糕的局面因而根本没有考虑的价值。所以当你看到某个局面有可能产生很糟糕的局面时(确切地说这里的“很糟糕”是与之前所分析的情况相比较而言的),你 应当立刻停止对其剩余子结点的分析——不要对它再报任何幻想了,如果你选择了它,则你必将得到那个很糟糕的局面,甚至更糟……这样一来便可以很大程度上减少搜索 的工作量,提高搜索效率。这称为“树的剪裁”。为了便于大家理解,下面我援引ElephantBoard的主页上所翻译的《Alpha-Beta搜索》中的一个“口袋的例子”,原文作者是 Bruce Moreland (brucemo@)。 口袋的例子:
int iBestmove = -1;
for( i = 0; i < nCount; i ++ ) {
nCChessID = DoMove( & MoveList[nDepth][i] ); // 执行着法(生成新节点) nScore = - AlphaBeta_HH( nDepth - 1, -beta, -alpha );//递归调用AlphaBeta_HH UndoMove( & MoveList[nDepth][i], nCChessID ); // 撤销执行(删除节点)

alphabeta剪枝算法原理

alphabeta剪枝算法原理

alphabeta剪枝算法原理Alpha-Beta剪枝算法原理一、引言Alpha-Beta剪枝算法是一种用于搜索树的算法,用于提高搜索效率。

在博弈树等搜索问题中,搜索空间往往非常庞大,传统的搜索算法需要遍历所有可能的节点,耗费大量时间和计算资源。

而Alpha-Beta剪枝算法通过剪去不必要的节点,大大减少了搜索空间,提高了搜索效率。

二、算法原理Alpha-Beta剪枝算法是基于Minimax算法的改进。

Minimax算法是一种博弈树搜索算法,用于在双方对抗的情况下选择最优的决策。

它通过递归地遍历博弈树,计算每个节点的值,然后根据节点的深度和玩家角色选择最优的决策。

Alpha-Beta剪枝算法在Minimax算法的基础上,引入了Alpha和Beta两个参数,用于剪枝。

具体来说,Alpha表示玩家1(Max玩家)当前的最佳选择值,Beta表示玩家2(Min玩家)当前的最佳选择值。

在搜索过程中,如果某个节点的值超出了Alpha或Beta的范围,就可以剪掉该节点及其子树,因为对当前玩家来说,该节点及其子树的值不会被选择。

三、算法步骤1. 初始化Alpha和Beta为负无穷和正无穷,分别表示玩家1和玩家2的最佳选择值;2. 对于当前节点,递归地遍历其子节点。

如果当前节点是Max节点,遍历所有子节点,并更新Alpha值;如果当前节点是Min节点,遍历所有子节点,并更新Beta值;3. 在遍历子节点的过程中,进行剪枝操作。

如果某个节点的值超出了Alpha或Beta的范围,就可以剪掉该节点及其子树;4. 根据Alpha和Beta的更新情况,判断是否进行剪枝。

如果Beta 小于等于Alpha,说明已找到最佳决策,可以提前终止搜索;5. 递归地返回父节点,并将当前节点的值传递给父节点。

如果当前节点是Max节点,返回最大值;如果是Min节点,返回最小值;6. 重复步骤2-5,直到搜索完成。

四、优势与应用领域Alpha-Beta剪枝算法在搜索空间庞大的问题中具有明显优势。

alpha-beta算法 zillmer修正方法

alpha-beta算法 zillmer修正方法

文章标题:深入探讨Alpha-Beta算法及Zillmer修正方法一、引言在计算机科学领域中,Alpha-Beta算法是一种用于减少博弈树搜索的一种优化技术。

Zillmer修正方法是对Alpha-Beta算法的一种改进,能够更好地提高搜索效率和性能。

本文将从简单到复杂,由浅入深地探讨Alpha-Beta算法及Zillmer修正方法,以便读者能更全面地理解这一主题。

二、Alpha-Beta算法的基本概念1. 什么是Alpha-Beta算法Alpha-Beta算法是一种用于减少博弈树搜索的一种优化技术,它通过剪枝的方式来避免搜索不必要的分支,从而提高搜索效率。

2. Alpha-Beta算法的原理在搜索过程中,Alpha-Beta算法会维护两个变量:Alpha和Beta。

其中,Alpha表示当前最好的选择,Beta表示对手的最好选择。

通过比较Alpha和Beta的值,可以确定是否进行剪枝,从而减少搜索的分支。

3. Alpha-Beta算法的应用及局限性Alpha-Beta算法在博弈树搜索、人工智能等领域得到了广泛的应用,但也存在一些局限性,比如对于某些特定的游戏状态,它可能无法有效地剪枝。

三、Zillmer修正方法的改进1. Zillmer修正方法的提出Zillmer修正方法是对Alpha-Beta算法的一种改进,它通过引入额外的修正值来提高搜索效率和性能。

2. Zillmer修正方法的原理在搜索过程中,Zillmer修正方法会根据当前搜索的情况,动态地计算并更新修正值,从而更加准确地评估当前的搜索情况,提高搜索效率。

3. Zillmer修正方法的应用及改进效果Zillmer修正方法在实际的应用中能够显著提高Alpha-Beta算法的搜索效率和性能,特别是对于一些复杂的游戏状态,它能够更好地优化搜索过程。

四、个人观点及总结个人观点:Alpha-Beta算法及Zillmer修正方法对于优化博弈树搜索具有重要的意义。

博弈算法在黑白棋中的应用

博弈算法在黑白棋中的应用

万方数据第l期杜秀全等:博弈算法在黑自棋中的应用·217·I皇jl初始棋局襁始棋禺(一1).自棋下棋之后E3(-1)c3(一1)mm。

m黑棋下棋之后F2F3F4F5F6C2I)3髓F5B6C8D6E6F6+估值十84+36+12+5一i+ii-i十6+5+6加一5十3十知·图2博弈搜索树3Alpha—Beta剪枝对于一般的极大极小搜索,即使每一步只有很少的下法,搜索位置都会呈指数级增长,但可以证明,程序不要考虑所有的位置而找到最佳位置旧J,这就是Alpha—Beta剪枝法(如图3所示),其基本思想是旧J:(1)若“或”节点的a值,不能使其父节点的口值降低,则该“或”节点以下的分支树不要再搜索,称为口剪枝。

(2)若“与”节点的口值,不能使其父节点的d值升高,则该“与”节点以下的分支树不要再搜索,称为口剪枝。

初始棋舄(-1)。

+84+36+12+5一I+ii一1+6+5+6+O-5十3+5.j图3Alpha—Beta剪枝示意图假设先搜索E3一F2F3F4F5F6,然后是C3一C2D3E6F5、C5一B6C6D6E6F6,即按从左到右的顺序进行深度优先搜索。

则搜索到D3分枝之后,就不用搜索E6和F5,因为如果接下来的值比D3大,就不会把值给C3,如果比D3小,把笸给C3后,也不会给根节点,因为根节点取最大值。

同样,搜索D6之后,就不再搜索E6和F6一i,Alpha~Beta剪枝算法在黑白棋中的应用:intAIphaBela(r小ly,nAlpha,nBeta)if(gameover)rctun.1Evaluation;//胜负已分,返回估值if(nPly==0)Evaluation;//叶子节点返回估值if(IsMinNcxb)//止E句用于判断当前节点是何种节点}//是取极小值的节点for(eachpos,siblen1)//x寸每一可能的走法mnlakcn1;//生成新节点SCOre=Alph,qi3cta(nPly一【,nAlptm,nBera);//递归搜索子节点unmakeIn'//撤销搜索过的节点if(score<nBera)nBel-a=score;//取极小值if(nAlpha>=nSela)nAlpha;/傅枝,抛弃后继节点retumnBeta;//返回最小值else{//I驭.极大值的节点for(eachpossiblern)//x寸每一可能的走法mnmkem;//生成新节点score=AlphaBeta(nPly一1,nAlpha,nBeta);//递归搜索子节点unnmkcmove;//撤销搜索过的节点if(score>nAlplm)nAlplm=score;//取极大值if(,Alpha>=nBeta)returnnBeta;//剪枝,抛弃后继节点returnnAlpha;//返回最大值}4算法改进当搜索深度稍大时,就会出现速度很慢的现象,于是做了以下改进:(1)改变搜索顺序会提高剪枝算法的效率L4J。

AlphaBeta剪枝算法

AlphaBeta剪枝算法

AlphaBeta剪枝算法关于AlphaBeta剪枝的⽂章太多,这个⽅法是所有其它搜索⽅法的基础,得多花些时间认真地理解。

先把基本概念再回顾⼀遍:节点:在中国象棋中就是⼀个棋盘的当前局⾯Board,当然该轮到谁⾛棋也是确定的。

这⾥的圆形节点表⽰终⽌节点,在中国象棋⾥就是⼀⽅被将死的情况(或者到达了搜索的最⼤深度),后续不会再有着法产⽣,游戏如果⾛到这⾥就会结束。

在引擎⾥通常给红⽅⼀个很⼤的评估值,如+30000,给⿊⽅⼀个很⼩的评估值,如-30000,来⽅便地判断这种结束局⾯。

(胜利局⾯有稍微不同的表⽰法,⽤-30000+层数ply来表⽰)连线:表⽰⼀步着法Move,通过这步着法后,局⾯发⽣变化,先后⼿也要交换。

层:通常的术语是ply,复数形式是plies,也有称为levels,当然与depth也是对应的。

这个术语是为了与⽐赛⾥常说的回合相区分,⼀个回合通常包含2步,这个ply就表⽰某⼀⽅⾛了⼀步。

根节点记为0层,以下的层数递增。

深度depth:要注意是从下到上的,还是从上到下的。

(1)通常的算法书中都是从下到上递增的,即根节点为最⼤搜索深度,⾛到最底部的叶⼦结点为0,这种算法只要记住⼀个depth值就可以了。

(2)⽽另⼀种记法是根部结点为0,越向下depth增加,这时在搜索时就要传递2个参数值,depth和maxDepth,稍微有点啰嗦,应该也会影响⼀点效率。

另外在探查置换表中的结点时,⽤第(1)种记法也⽅便⼀些,因为要知道从当前节点迭代的深度值,否则还要在置换表中保存depth和maxDepth两个值。

AlphaBeta剪枝⽅法是对Minimax⽅法的优化,它们产⽣的结果是完全相同的,只不过运⾏效率不⼀样。

这种⽅法的前提假设与Minimax也是⼀样的:1)双⽅都按⾃⼰认为的最佳着法⾏棋。

2)对给定的盘⾯⽤⼀个分值来评估,这个评估值永远是从⼀⽅(搜索程序)来评价的,红⽅有利时给⼀个正数,⿊⽅有利时给⼀个负数。

Minimax极大极小算法、Alpha-BetaPruning剪枝算法

Minimax极大极小算法、Alpha-BetaPruning剪枝算法

Minimax极⼤极⼩算法、Alpha-BetaPruning剪枝算法这篇博客分为两部分。

⾸先我会先讲极⼤极⼩算法,然后在此基础上进⾏改进给出进阶版的Alpha-Beta剪枝算法以及代码实现。

⽂中配备b站讲解的视频,感兴趣的可以看⼀下视频讲解,然后复习的时候拿着⽂章当作参考。

Minimax算法(极⼤极⼩算法)概念是⼀种找出最⼩失败的可能的算法。

意思就是两个⼈下棋,A和B下棋,A想要⾃⼰的利益最⼤化(失败的可能性最⼩),B想要A的利益最⼩化(B想要A输)。

这个算法以及接下来的Alpha-Beta剪枝都是⼀种对抗性搜索算法(两个⼈互相对抗着下棋,俩⼈都想赢),是⼀种⼈⼯智能搜索的算法。

掌握此算法后可以⽤来写井字棋、五⼦棋等⼈⼯智能⼈机对抗下棋程序。

具体步骤给你⼀颗⼆叉树。

告诉你⼩紫和⼩⿊玩游戏。

紫⾊和⿊⾊圆圈代表他们两个。

我们是站在⼩紫的⾓度来描述的。

⼩紫想要他⾃⼰的得分最⼤所以⼩紫玩的时候,⼆叉树的那⼀层叫MAX层。

⼩⿊想要⼩紫的得分最⼩化,⼩⿊的叫做MIN层。

我们总是让⼩紫第⼀个开始,假设下⾯这个⼆叉树,我们只知道叶⼦节点的值(别管为啥,先学好算法原理,后续如何应⽤这个算法我还打算继续写博客和录视频讲解。

):在这⾥给出定义,MAX层的节点的值是什么??是它的⼦节点⾥⾯的最⼤值,MIN层的值是它的⼦节点⾥⾯的最⼩值。

直接上图。

MIN层是选择其孩⼦节点中最⼩值。

MAX层选择其孩⼦节点中的最⼤值。

算法概念就是这个样⼦。

算法的输⼊是构造的这⼀棵满⼆叉树,输出是最上层MAX节点的值。

代码实现class Node{ //结点类public:const int value;Node *left;Node *right;Node(int v,Node* l,Node* r):value(v),left(l),right(r) {};};为了遍历这棵树,⾸先我们得创建出来这棵树对吧?但是你的代码⾥没有创建⼆叉树这⼀部分啊。

人工智能:一种现代方法ch05 Adversarial Search - 2016

人工智能:一种现代方法ch05 Adversarial Search - 2016

Go (围棋) has too high a branching factor for existing search techniques. Current and future software must rely on huge databases and pattern-recognition techniques.
国际象棋搜索树大约有35100或者10154个结点。如果考虑完
整的搜索策略,就是用亿次机来处理,也得花天文数字 计的时间。博弈要求在无法计算出最优决策的情况下也要给 出某种决策。如何尽可能地利用好时间。 搜索树的深度影响性能。
14
how to deal with the huge state space?
fully observable, deterministic
zero-sum(零和, 1 + (-1) = 0) time-constrained
6
Games are a form of multi-agent environment.
multi-agent environment
中国首届“人机大战”,诸宸0:2败于笔记本电脑“紫光之星”
2016,AlphaGo
10
Game playing has a huge state space.
How: Chinese Chess
state space 九 列 十 行 十 四 种 不 同 的 棋 子
三 十 二 个 棋 子
13
3
12
8
2
4
6
14
5
2
MAX选择哪一步?a1/a2/a3
21
optimal decisions in games {5.2}

五子棋人工智能算法设计与实现

五子棋人工智能算法设计与实现

五子棋人工智能算法设计与实现五子棋人工智能算法设计与实现一、引言五子棋,作为一种古老而又广泛流行的棋类游戏,一直以来都备受人们的喜爱。

它不仅考验玩家的智力和思维能力,同时也是人工智能算法在博弈领域中的经典案例之一。

本文将重点探讨五子棋人工智能算法的设计与实现,通过对五子棋的规则和特性的分析,提出一种基于博弈树搜索的算法,并进行相应的实验,来验证这一算法在五子棋中的有效性。

二、五子棋的规则和特性五子棋是一种双人对弈的棋类游戏。

目标是在一个15x15的棋盘上,以先连成五子的玩家为胜利。

每个玩家轮流下子,只能在无子的位置下子,棋子只能放在网格交叉点上。

在五子棋中,我们需要考虑如下几个规则和特性:1. 规模较小:相较于国际象棋等游戏,五子棋的规模较小,棋盘上只有225个空位,而且在早期阶段每个空位都有很多可供选择的位置。

2. 复杂度高:尽管规模小,但五子棋的游戏复杂度非常高,下棋的每一步对于后面的局势都会产生重要的影响。

3. 搜索空间大:在五子棋中,游戏的可能走法非常多,根据计算,一个人的平均走法数可以达到10^170种。

基于以上特点,设计一个高效的五子棋人工智能算法是非常具有挑战性的。

三、五子棋人工智能算法的设计思路针对五子棋的规则和特性,我们提出了一种基于博弈树搜索的算法,以实现人工智能在五子棋中的应用。

1. 构建博弈树:首先,我们需要构建五子棋的博弈树。

根节点表示当前局面,每个子节点表示每一步的下棋位置。

我们假设每个玩家都做出最优的选择,通过递归的方式,构建一棵完整的博弈树。

2. 构建评估函数:为了对博弈树进行评估,我们需要设计一个评估函数来评估每个局面的优劣。

该函数可以根据棋盘上的棋子分布情况、连子数目以及棋子的位置等来计算得分,越高表示该局面越好。

3. Alpha-Beta剪枝:由于搜索空间非常大,传统的博弈树搜索算法效率较低。

为了提高搜索效率,我们引入Alpha-Beta剪枝算法。

这一算法可以在搜索过程中剪去一些不必要的分支,使搜索过程更加高效。

算法笔记--极大极小搜索及alpha-beta剪枝

算法笔记--极大极小搜索及alpha-beta剪枝

算法笔记--极⼤极⼩搜索及alpha-beta剪枝极⼩极⼤搜索算法即minimax搜索算法主要应⽤于零和博弈(⾮胜即负,如围棋,象棋,井⼦棋等),完全信息(玩家知道之前所有的步骤。

象棋就是完全信息,因为玩家是交替着落⼦,且之前的步骤都能在棋盘上体现)这个算法采⽤搜索算法递归实现,⼀层为先⼿,记为a, ⼀层为后⼿,记为b, 交替出现对于最终局⾯,有⼀个分数(⽐如:先⼿胜分数为1,平局分数为0,先⼿输分数为-1)先⼿a想要让这个分数越⼤越好,后⼿b想要让这个分数越⼩越好,于是搜索到先⼿这⼀层,取最⼤返回,搜索到后⼿这⼀层,取最⼩返回如下图:于是伪代码为:int MaxMin(position,int d){int bestvalue,value;if(game over) //检查游戏是否结束return evaluation(p);// 游戏结束,返回估值if(depth<=0) //检查是否是叶⼦节点return evaluation(p);//叶⼦节点,返回估值if(max) //极⼤值点bestvalue=-INFINTY;else//极⼩值点bestvalue=INFINTY;for(each possibly move m){MakeMove(m); //⾛棋value=MaxMin(p,d-1);UnMakeMove(m); //恢复当前局⾯if(max)bestvalue=max(value,bestvalue);//取最⼤值elsebestvalue=min(value,bestvalue);//取最⼩值}return bestvalue;}关于alpha-beta剪枝:如果当前层为取最⼩,如果取最⼩后⽐上⼀层当前最⼤值还⼩,则不需要往下搜索,因为上⼀层根本不会选择当前节点往下搜,还有更好的选择同理,如果当前层为取最⼤,如果取最⼤后⽐上⼀层当前最⼩值还⼤,则不需要往下搜索,因为上⼀层根本不会选择当前节点往下搜具体推荐看最上⾯的知乎链接点赞最多的回答。

博弈树搜索算法的分析与实现_危春波

博弈树搜索算法的分析与实现_危春波


由于 B* 算法对估值的依赖性很强,实验所用的估值效
与 实
果实现算法速度很快(时间小于一秒),但走法只有搜索深

度为三层α - β剪枝的水准,实用时有待进一步提高。
3 结束语
以上讨论了博弈树搜索算法的两类算法,其中α - β剪
枝算法比较成熟,是当前最常用的算法,在融合各种策略后
具有很高的剪枝效率。如果能进一步改进数据结构和进行代
节点结果(包括搜索深度,估值类型: 准确还是上下边界) 记录下来,在后继的搜索过程中,查看表中记录。如果搜索 的节点已经有记录(子树的深度大于或者等于当前的新节点 要求的搜索深度),它的信息就可以直接运用了,这样我们 可以避免重复搜索很多子树。置换表是一种内存增强技术, 以空间换时间。
1.3 历史启发(History Heuristic) 历史启发是为了迎合α - β剪枝搜索对节点排列顺序敏 感的特点来提高剪枝效率的,即根据历史走法对当前搜索的 节点集进行排序,从而优先搜索好的走法。 1.4 迭代深化(Iterative Deepening) 迭代深化是一个不断求精的过程,对博弈树进行多次遍 历,并不断加深其深度,用于控制搜索的时间。 在实用中迭代深化和前面提到的算法结合使用具有很好 的效果,如 PVS 算法,上几层迭代得到的最佳走法可以帮助 下一层提高剪枝效率; 迭代过程中把前面局面的历史得分存 入置换表,最佳走法存入历史启发表可以提高剪枝效率。 1.5 实验数据分析 各种增强策略都能提高α - β剪枝的效率,其中空窗口



2.用的策略为 Berliner 原则: 用一组候选分枝与

最佳分枝做比较,如果各候选分枝实行信息反馈的深度是


ti,最佳分枝实行信息反馈的深度是t,比较∑ti2和t2,若前

alpha-beta剪枝算法在黑白棋应用中的优化

alpha-beta剪枝算法在黑白棋应用中的优化

alpha-beta剪枝算法在黑白棋应用中的优化摘要:alpha-beta剪枝算法是一种传统的搜索算法, 它在博弈算法中有着非常广泛的运用,它大大减少了相同搜索深度下的计算量,但其仍然不能满足有限时间内进行搜索的需求。

为此,有很多针对该算法的优化方法,但这些优化方法大都是以消耗更多空间为代价的。

本文以黑白棋为例,从全局考虑,提出几种优化策略,以较少的计算量,获得较高智能性。

经过实验测试,在PC机中对相同的搜索层次,发现优化方法的算法可以较大幅度地提高效率.关键词: alpha-beta剪枝算法,人工智能,黑白棋,算法优化Abstract: alpha-beta algorithm is a kind of typical method for optimizing adversarial search, which is used widely in game playing algorithm for it reduces the computation amount obviously in the same search depth, but it still does not meet the requirement of searching in a limited time. So, there are many enhancements on its optimization, but most of those enhancements consume more space. This paper takes black and white chess for example, presents some strategies of enhancement from a global angle, and those methods could use less computation amount and get more intelligence at the same time. The experiment in PC shows that the optimized algorithm could improve efficiency at a high extent compared to the non-optimized algorithm at the same condition.Keywords: alpha-beta pruning algorithm; artificial intelligence; searching technique; algorithm optimize引言目前,已经有很多对alpha-beta算法的优化,提高了搜索的性能,其中有一些已经被广泛证实是有效的算法,它们主要包括以下几种:置换表(transposition tables)、驳斥表(refutation tables)、窄窗搜索(aspiration search)和最小窗口搜索(minimal window)、启发式搜索(heuristic),它们的主要思想在这里就不再赘述。

基于α-β剪枝算法的智能五子棋

基于α-β剪枝算法的智能五子棋

基于α-β剪枝算法的智能五子棋一、基本介绍游戏界面:使用了Java Swing进行开发,如图所示。

游戏步骤:1. 先设置游戏的参数,可以选择模式(双人、单人、双机),智能(估值函数、估值函数+搜索树),搜索树(层数、每层节点),再开始游戏;2. 在棋盘上单击鼠标左键,落下棋子;3. 在棋盘上单击鼠标右键,查看该点的估值;4. 可以显示落子顺序和悔棋;5. 使用搜索树AI时,控制台显示搜索过程;6. 某方胜利后,游戏结束。

二、棋型确定(图不全)死4-5死3-5死2-5再统计在四个方向各形成什么棋型,是否形成组合棋型,取最高分为初步打分的结果。

落子位置:根据棋盘分布问题,越中心的点分值应当越高。

private static int[][] position = {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 },{ 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0 },{ 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0 },{ 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 3, 2, 1, 0 },{ 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 4, 3, 2, 1, 0 },{ 0, 1, 2, 3, 4, 5, 6, 6, 6, 5, 4, 3, 2, 1, 0 },{ 0, 1, 2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 2, 1, 0 },{ 0, 1, 2, 3, 4, 5, 6, 6, 6, 5, 4, 3, 2, 1, 0 },{ 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 4, 3, 2, 1, 0 },{ 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 3, 2, 1, 0 },{ 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0 },{ 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0 },{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };例如,对下图A点,如果放白子,在四个方向分别会形成活3、活2、眠2,形成两种棋型(组合棋型)活3和活2眠2,最高分为活3对应的200分,再加上位置分值6分,就是206分;如果放黑子,同理是25分。

极小极大搜索的个人理解(alpha-beta剪枝)

极小极大搜索的个人理解(alpha-beta剪枝)

极⼩极⼤搜索的个⼈理解(alpha-beta剪枝)极⼩极⼤搜索的算法过程: 主要思想⽐较简单,但说清楚也不⼤容易。

其核⼼思想是通过对于以后的状态进⾏预见式的暴搜,对可能的状态进⾏分析。

理论上,如果能够搜索到最终状态,那么之后的⾛法都已经是确定的了。

(这个地⽅觉得有些糊涂) 对于局⾯形式的估计⾸先需要⼀个合理的估价函数。

实际上是因为真正的搜索⼏乎都是⽆法搜索到所有的可能性,否则完全⽤0和1就能表⽰当前局⾯的胜负态了。

所以需要对局⾯进⾏较为合理的分析估价。

对于某⼀⽅来说都是要使得最终局⾯状态值(理论上,最终局⾯状态有且仅有⼀个)获得最⼤,所以对于两⽅来说,可以通过⼀⽅估价正越⼤表⽰胜率越⼤,另⼀⽅估价正越⼩(负越⼤)表⽰胜率越⼤。

因此出现了极⼩极⼤搜索算法。

从最简单的情况开始分析,⾸先确定我⽅要使得最终局⾯估价最⼤,⽽⾮当前局⾯估价最⼤,所以需要预测下⼀个我⽅局⾯的估价如何。

⽽在此之前的⼀步掌握权在对⽅的⼿上,⾃然会选择对他有利的状态(⼀定是最终局⾯形式最⼤的状态⾛法),也就是⾛对于对⽅最终局⾯估价最⼤的状态。

因此我⽅的落⼦是根据所有下⼀个状态对⽅会如何⾛来决定的。

最终局⾯估价是双⽅共同决定的。

(常常会被Min和Max状态搞乱,其实不要管这个,花时间弄明⽩其中的含义,写出来⾃然能够明⽩(其实Min()表⽰⾛到当前可预见的最后的状态的最⼩值,Max()反之))伪代码如下:int MinMax(int depth) { if (SideToMove() == WHITE) { // ⽩⽅是“最⼤”者 return Max(depth); } else { // ⿊⽅是“最⼩”者 return Min(depth); }}int Max(int depth) { int best = -INFINITY; if (depth <= 0) { return Evaluate(); } GenerateLegalMoves(); while (MovesLeft()) { MakeNextMove(); val = Min(depth - 1); UnmakeMove(); if (val > best) { best = val; } } return best;}int Min(int depth) { int best = INFINITY; // 注意这⾥不同于“最⼤”算法 if (depth <= 0) { return Evaluate(); } GenerateLegalMoves(); while (MovesLeft()) { MakeNextMove(); val = Max(depth - 1); UnmakeMove(); if (val < best) { // 注意这⾥不同于“最⼤”算法 best = val; } } return best;}⼀个简便的实现⽅法,通过来回正负的变化来减少代码量,便于维护。

alphabeta剪枝算法原理

alphabeta剪枝算法原理

alphabeta剪枝算法原理Alpha-Beta剪枝算法原理引言:在人工智能领域,博弈树搜索是一种常见的算法,用于解决两个对手之间的决策问题。

而Alpha-Beta剪枝算法则是一种优化博弈树搜索的方法,它通过剪去不必要的搜索分支,大大减少了搜索的时间复杂度,提高了搜索效率。

本文将详细介绍Alpha-Beta剪枝算法的原理及其应用。

一、博弈树搜索博弈树搜索是通过构建一棵树来表示博弈的决策过程。

树的每个节点表示一个决策点,树的边表示决策的选项。

对于每个节点,可以根据某种评估函数来确定它的分值。

通过搜索博弈树,可以找到最优的决策序列。

二、极小极大算法极小极大算法是一种常用的博弈树搜索算法,它在树上进行深度优先搜索,通过对叶子节点进行评估,逐层向上选择最优的决策。

该算法中的每个节点都有一个值,对于极大节点,它的值是其子节点中最大的值;对于极小节点,它的值是其子节点中最小的值。

三、Alpha-Beta剪枝算法的原理Alpha-Beta剪枝算法是对极小极大算法的一种优化方法,它通过剪去不必要的搜索分支,减少了搜索的时间复杂度。

具体来说,Alpha-Beta剪枝算法引入了两个参数:alpha和beta。

其中,alpha表示当前搜索路径中极大节点已经找到的最优值,beta表示当前搜索路径中极小节点已经找到的最优值。

在搜索过程中,当某个极大节点的值大于等于beta时,可以直接剪去该极大节点的所有子节点,因为极小节点不会选择这个极大节点。

同理,当某个极小节点的值小于等于alpha时,可以直接剪去该极小节点的所有子节点,因为极大节点不会选择这个极小节点。

通过递归地进行搜索,并不断更新alpha和beta的值,可以逐渐缩小搜索范围,从而大大减少搜索时间。

四、Alpha-Beta剪枝算法的应用Alpha-Beta剪枝算法广泛应用于博弈领域,特别是各种棋类游戏。

在这些游戏中,博弈树的规模往往非常庞大,而Alpha-Beta剪枝算法能够有效地减少搜索时间,提高计算机对手的决策速度。

组合游戏1:详解Minimax和AlphaBeta剪枝算法

组合游戏1:详解Minimax和AlphaBeta剪枝算法

组合游戏1:详解Minimax和AlphaBeta剪枝算法本系列,我们来看看在⼀种常见的组合游戏——回合制棋盘类游戏中,如何⽤算法来解决问题。

⾸先,我们会介绍并解决搜索空间较⼩的问题,引⼊经典的博弈算法和相关理论,最终实现在⼤搜索空间中的Deep RL近似算法。

在此基础上可以理解AlphaGo的原理和⼯作⽅式。

本系列的第⼀篇,我们介绍3个Leetcode中的零和回合制游戏,从最初的暴⼒解法,到动态规划最终演变成博弈论⾥的经典算法:minimax 以及 alpha beta 剪枝。

获得最好的阅读体验,请点击最下⽅阅读原⽂,并在电脑上打开第⼀篇 [Leetcode中的Minimax 和 Alpha Beta剪枝]第⼆篇: ⼀些组合游戏的理论第三篇: 连接N个点的OpenAI Gym GUI环境第四篇: 蒙特卡洛树搜索(MCTS)和时间差分学习(TD learning)Leetcode 292 Nim Game (简单)简单题 Leetcode 292 Nim Game。

你和你的朋友,两个⼈⼀起玩 Nim游戏:桌⼦上有⼀堆⽯头,每次你们轮流拿掉 1 - 3 块⽯头。

拿掉最后⼀块⽯头的⼈就是获胜者。

你作为先⼿。

你们是聪明⼈,每⼀步都是最优解。

编写⼀个函数,来判断你是否可以在给定⽯头数量的情况下赢得游戏。

⽰例:输⼊: 4输出: false解释: 如果堆中有 4 块⽯头,那么你永远不会赢得⽐赛;因为⽆论你拿⾛ 1 块、2 块还是 3 块⽯头,最后⼀块⽯头总是会被你的朋友拿⾛。

定义为有个⽯头并采取最优策略的游戏结果,的值只有可能是赢或者输。

考察前⼏个结果:,然后来计算。

因为玩家采取最优策略(只要有⼀种⾛法让对⽅必输,玩家获胜),对于4来说,玩家能⾛的可能是拿掉1块、2块或3块,但是⽆论剩余何种局⾯,对⽅都是必赢,因此,4就是必输。

总的说来,递归关系如下:这个递归式可以直接翻译成Python 3代码# TLE# Time Complexity: O(exponential)class Solution_BruteForce:def canWinNim(self, n: int) -> bool:if n <= 3:return Truefor i in range(1, 4):if not self.canWinNim(n - i):return Truereturn False以上的递归公式和代码很像fibonacci数的递归定义和暴⼒解法,因此对应的时间复杂度也是指数级的,提交代码以后会TLE。

中国象棋对弈程序

中国象棋对弈程序

中国象棋对弈程序专业:计算机科学与技术小组成员:孙忱、周俊、施聪聪、周理想指导老师:陈宇、蒋德茂(苏州大学计算机学院)作品类别:学术论文+计算机程序【摘要】:人机博弈是人工智能研究的经典课题之一。

凭借设计优良的算法和计算机的快速运算能力,计算机可以在人机对弈中表现出相当高的“智能”。

通常,一款象棋程序的实现可以被分为下棋引擎(人工智能)和外壳(界面及程序辅助)两大部分。

本文将介绍如何实现一款中国象棋对弈程序。

【关键词】:中国象棋;人工智能;博弈树;Alpha-Beta搜索;历史启发;界面;多线程;计时器;列表框;MFC。

[Abstract]: Man-machine Game is a classic topic in Artificial Intelligence. Relying on fine-designed algorithms and the fast operation ability, computers can display high "intelligence" in playing chess. Usually, the realization of a chess program can be decomposed into two major parts: the Chess Engine (Artificial Intelligence) and the Shell (User Interface & Program Assist). This paper will introduce how to realize a Chinese Chess program.[Key words]: Chinese Chess; Artificial Intelligence (AI); Game Tree; Alpha-Beta Search; History Heuristic; User Interface; Multithreaded; Timer; List Box; MFC.一、前言我们的目标是实现一款有着一定下棋水平且交互友好的中国象棋人机对弈程序。

棋盘博弈法

棋盘博弈法

棋盘博弈法介绍棋盘博弈法是一种经典的博弈策略,在许多领域都有广泛应用。

它通过将问题转化为在棋盘上的博弈过程,从而寻找最优解。

本文将详细介绍棋盘博弈法的原理、应用以及相关算法。

原理棋盘博弈法的基本原理是将复杂的问题转化为在棋盘上进行博弈的过程,通过博弈的方式寻找最优解。

在博弈过程中,两个参与者轮流在棋盘上进行操作,每一步操作都会改变棋盘的状态,直到达到博弈结束的条件。

应用棋盘博弈法在许多领域都有广泛的应用,包括计算机科学、数学、人工智能等。

下面列举几个典型的应用场景:游戏策略优化在许多棋类游戏中,如围棋、国际象棋等,棋盘博弈法可以帮助玩家制定最优的策略。

通过建立数学模型和算法,可以分析棋局的特点,并找到最优的下棋顺序和位置,提高胜率。

优化问题求解在一些优化问题中,如旅行商问题、背包问题等,棋盘博弈法可以将问题转化为在棋盘上的博弈过程。

通过建立数学模型和算法,可以在有限的时间内找到最优解,提高问题求解效率。

人工智能决策在人工智能领域,棋盘博弈法可以应用于智能决策和规划问题。

通过建立棋局和规则,可以对不同的决策方案进行评估和比较,从而选择最优的决策路径。

算法棋盘博弈法有许多不同的算法和策略,下面介绍几种常见的算法:极小化极大算法(Minimax Algorithm)极小化极大算法是一种常见的博弈算法,在棋盘博弈中有广泛应用。

该算法通过递归地搜索棋盘上的所有可能状态,在每一步中通过评估函数对当前状态进行评估,然后选择最优的下一步操作。

该算法考虑到对手的最佳应对策略,使自己的收益最大化。

算法步骤如下: 1. 递归的搜索所有可能的下一步操作,并建立搜索树。

2. 在搜索树的每一层上,交替选择极大和极小节点,直到达到终止条件。

3. 在叶子节点上,通过评估函数对当前状态进行评估。

4. 根据评估结果,向上回溯,选择最优的操作路径。

Alpha-Beta剪枝算法Alpha-Beta剪枝算法是在Minimax算法基础上的一种优化策略。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Alpha-Beta搜索
最小-最大的问题
Alpha-Beta 同“最小-最大”非常相似,事实上只多了一条额外的语句。

最小最大运行时要检查整个博弈树,然后尽可能选择最好的线路。

这是非常好理解的,但效率非常低。

每次搜索更深一层时,树的大小就呈指数式增长。

通常一个国际象棋局面都有35个左右的合理着法,所以用最小-最大搜索来搜索一层深度,就有35个局面要检查,如果用这个函数来搜索两层,就有352个局面要搜索。

这就已经上千了,看上去还不怎样,但是数字增长得非常迅速,例如六层的搜索就接近是二十亿,而十层的搜索就超过两千万亿了。

要想通过检查搜索树的前面几层,并且在叶子结点上用启发式的评价,那么做尽可能深的搜索是很重要的。

最小-最大搜索无法做到很深的搜索,因为有效的分枝因子实在太大了。

口袋的例子
幸运的是我们有办法来减小分枝因子,这个办法非常可靠,实际上这样做绝对没有坏处,纯粹是个有益的办法。

这个方法是建立在一个思想上的,如果你已经有一个不太坏的选择了,那么当你要作别的选择并知道它不会更好时,你没有必要确切地知道它有多坏。

有了最好的选择,任何不比它更好的选择就是足够坏的,因此你可以撇开它而不需要完全了解它。

只要你能证明它不比最好的选择更好,你就可以完全抛弃它。

你可能仍旧不明白,那么我就举个例子。

比如你的死敌面前有很多口袋,他和你打赌赌输了,因此他必须从中给你一样东西,而挑选规则却非常奇怪:每个口袋里有几件物品,你能取其中的一件,你来挑这件物品所在的口袋,而他来挑这个口袋里的物品。

你要赶紧挑出口袋并离开,因为你不愿意一直做在那里翻口袋而让你的死敌盯着你。

假设你一次只能找一只口袋,在找口袋时一次只能从里面摸出一样东西。

很显然,当你挑出口袋时,你的死敌会把口袋里最糟糕的物品给你,因此你的目标是挑出“诸多最糟的物品当中是最好的”那个口袋。

你很容易把最小-最大原理运用到这个问题上。

你是最大一方棋手,你将挑出最好的口袋。

而你的死敌是最小一方棋手,他将挑出最好的口袋里尽可能差的物品。

运用最小-最大原理,你需要做的就是挑一个有“最好的最差的”物品的口袋。

假设你可以估计口袋里每个物品的准确价值的话,最小-最大原理可以让你作出正确的选择。

我们讨论的话题中,准确评价并不重要,因为它同最小-最大或Alpha-Beta的工作原理没有关系。

现在我们假设你可以正确地评价物品。

最小-最大原理刚才讨论过,它的问题是效率太低。

你必须看每个口袋里的每件物品,这就需要花很多时间。

那么怎样才能做得比最小-最大更高效呢?
我们从第一个口袋开始,看每一件物品,并对口袋作出评价。

比方说口袋里有一只花生黄油三明治和一辆新汽车的钥匙。

你知道三明治更糟,因此如果你挑了这只口袋就会得到三明治。

事实上只要我们假设对手也会跟我们一样正确评价物品,那么口袋里的汽车钥匙就是无关紧要的了。

现在你开始翻第二个口袋,这次你采取的方案就和最小-最大方案不同了。

你每次看一件物品,并跟你能得到的最好的那件物品(三明治)去比较。

只要物品比三明治更好,那么你就按照最小-最大方案来办——去找最糟的,或许最糟的要比三明治更好,那么你就可以挑这个口袋,它比装有三明治的那个口袋好。

比方这个口袋里的第一件物品是一张20美元的钞票,它比三明治好。

如果包里其他东西都没比这个更糟了,那么如果你选了这个口袋,它就是对手必须给你的物品,这个口袋就成了你的选择。

这个口袋里的下一件物品是六合装的流行唱片。

你认为它比三明治好,但比20美元差,那么这个口袋仍旧可以选择。

再下一件物品是一条烂鱼,这回比三明治差了。

于是你就说“不谢了”,把口袋放回去,不再考虑它了。

无论口袋里还有什么东西,或许还有另一辆汽车的钥匙,也没有用了,因为你会得到那条烂鱼。

或许还有比烂鱼更糟的东西(那么你看着办吧)。

无论如何烂鱼已经够糟的了,而你知道挑那个有三明治的口袋肯定会更好。

算法
Alpha-Beta就是这么工作的,并且只能用递归来实现。

稍后我们再来谈最小一方的策略,我希望这样可以更明白些。

这个思想是在搜索中传递两个值,第一个值是Alpha,即搜索到的最好值,任何比它更小的值就没用了,因为策略就是知道Alpha的值,任何小于或等于Alpha的值都不会有所提高。

第二个值是Beta,即对于对手来说最坏的值。

这是对手所能承受的最坏的结果,因为我们知道在对手看来,他总是会找到一个对策不比Beta更坏的。

如果搜索过程中返回Beta或比Beta更好的值,那就够好的了,走棋的一方就没有机会使用这种策略了。

在搜索着法时,每个搜索过的着法都返回跟Alpha和Beta有关的值,它们之间的关系非常重要,或许意味着搜索可以停止并返回。

如果某个着法的结果小于或等于Alpha,那么它就是很差的着法,因此可以抛弃。

因为我前面说过,在这个策略中,局面对走棋的一方来说是以Alpha为评价的。

如果某个着法的结果大于或等于Beta,那么整个结点就作废了,因为对手不希望走到这个局面,而它有别的着法可以避免到达这个局面。

因此如果我们找到的评价大于或等于Beta,就证明了这个结点是不会发生的,因此剩下的合理着法没有必要再搜索。

如果某个着法的结果大于Alpha但小于Beta,那么这个着法就是走棋一方可以考虑走的,除非以后有所变化。

因此Alpha会不断增加以反映新的情况。

有时候可能一个合理着法也不超过Alpha,这在实战中是经常发生的,此时这种局面是不予考虑的,因此为了避免这样的局面,我们必须在博弈树的上一个层局面选择另外一个着法。

在第二个口袋里找到烂鱼就相当于超过了Beta,如果口袋里没有烂鱼,那么考虑六盒装流行唱片的口袋会比三明治的口袋好,这就相当于超过了Alpha(在上一层)。

算法如下,醒目的部分是在最小-最大算法上改过的:
int AlphaBeta(int depth, int alpha, int beta) {
if (depth == 0)
{
return Evaluate();
}
GenerateLegalMoves();
while (MovesLeft())
{
MakeNextMove();
val = -AlphaBeta(depth - 1, -beta, -alpha);
UnmakeMove();
if (val>= beta)
{
return beta;
}
if (val> alpha)
{
alpha = val;
}
}
return alpha;
}
把醒目的部分去掉,剩下的就是最小-最大函数。

可以看出现在的算法没有太多的改变。

这个函数需要传递的参数有:需要搜索的深度,负无穷大即Alpha,以及正无穷大即Beta:
val = AlphaBeta(5, -INFINITY, INFINITY);
这样就完成了5层的搜索。

我在写最小-最大函数时,用了一个诀窍来避免用了“Min”还用“Max”函数。

在那个算法中,我从递归中返回时简单地对返回值取了负数。

这样就使函数值在每一次递归中改变评价的角度,以反映双方棋手的交替着子,并且它们的目标是对立的。

在Alpha-Beta函数中我们做了同样的处理。

唯一使算法感到复杂的是,Alpha 和Beta是不断互换的。

当函数递归时,Alpha和Beta不但取负数而且位置交换了,这就使得情况比口袋的例子复杂,但是可以证明它只是比最小-最大算法更好而已。

最终出现的情况是,在搜索树的很多地方,Beta是很容易超过的,因此很多工作都免去了。

可能的弱点
这个算法严重依赖于着法的寻找顺序。

如果你总是先去搜索最坏的着法,那么Beta截断就不会发生,因此该算法就如同最小-最大一样,效率非常低。

该算法最终会找遍整个博弈树,就像最小-最大算法一样。

如果程序总是能挑最好的着法来首先搜索,那么数学上有效分枝因子就接近于实际分枝因子的平方根。

这是Alpha-Beta算法可能达到的最好的情况。

由于国际象棋的分枝因子在35左右,这就意味着Alpha-Beta算法能使国际象棋搜索树的分枝因子变成6。

这是很大的改进,在搜索结点数一样的情况下,可以使你的搜索深度达到原来的两倍。

这就是为什么使用Alpha-Beta搜索时,着法顺序至关重要的原因。

相关文档
最新文档