- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
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也是一样的:
双方都按自己认为的最佳着法行棋。
对给定的盘面用一个分值来评估,这个评估值永远是从一方(搜索程序)来评价的,红方有利时给一个正数,黑方有利时给一个负数。(如果红方有利时返回正数,当轮到黑方走棋时,评估值又转换到黑方的观点,如果认为黑方有利,也返回正数,这种评估方法都不适合于常规的算法描述)
从我们的搜索程序(通常把它称为Max)看来,分值大的数表示对己方有利,而对于对方Min来说,它会选择分值小的着法。但要注意:用Negamax风格来描述的AlphaBeta中的评估函数,对轮到谁走棋是敏感的。
也就是说:
在Minimax风格的AlphaBeta算法中,轮红方走棋时,评估值为100,轮黑方走棋评估值仍是100。
但在Negamax风格的AlphaBeta算法中,轮红方走棋时,评估值为100,轮黑方走棋时评估值要为-100。
贴一段伪代码:
defABNegaMax(board,depth,maxDepth,alpha,beta)if(board.isGameOver()ordepth==maxDepth)
returnboard.evaluate(),nullbestMove=null
bestScore=-INFINITY
formoveinboard.getMoves()
newBoard=board.makeMove(move)
score=ABNegaMax(newBoard,maxDepth,depth+1,-beta,-max(alpha,bestScore))score=-score
if(scorebestScore)bestScore=scorebestMove=move
#earlyloopexit(pruning)
if(bestScore=beta)returnbestScore,bestMovereturnbestScore,bestMove
用下列语句开始调用:
ABNegaMax(board,player,maxDepth,0,-INFINITY,INFINITY)
//methodcallwithdepth5andminimumandmaximumboundaries
//minimaxValue=alphaBeta(board,5,-MATE,+MATE)
intalphaBeta(ChessBoardboard,intdepth,intalpha,intbeta)
{
intvalue;
if(depth==0||board.isEnded())
{
value=evaluate(board);returnvalu
您可能关注的文档
- 20101014123937765《社会工作导论》试题及答案.docx
- A fewa little练习分析和总结.docx
- A Learning Plan分析和总结分析和总结.docx
- A poor girl was selling flowers in the street 21 Christmas Eve阅读理解答案.docx
- A system of no systems分析和总结分析和总结.docx
- A young man was getting ready to graduate from college完形填空答案.docx
- A 楼交货单基础.docx
- A1合同段交通工程预制块开工报告.docx
- a7testbankpartiichapter5analyzingtheaudience分析和总结分析和总结.docx
- a12testbankpartiichapter10usinglanguage分析和总结分析和总结.docx
最近下载
- 每周工作4小时—蒂莫里.费里斯.pdf
- 2024年苏州工业职业技术学院高职单招(英语/数学/语文)笔试历年参考题库含答案解析.docx
- 陕旅版四年级下册英语教案完整版(最全).doc
- 北师大版2024-2025学年一年级数学下册教学工作计划(及进度表).docx
- 2024年湖南科技职业学院高职单招职业技能测验历年参考题库(频考版)含答案解析.docx
- 动画分镜设计.ppt VIP
- 2024年苏州工业职业技术学院单招职业技能测试题库及答案解析.docx
- 大学四级英语单词.doc VIP
- FUNAC发那科 机器人系统高级编程Karel中文版.pdf
- 雨课堂学堂在线《计算机网络(湖北科技学院)》学堂云单元测试考核答案.pdf
文档评论(0)