ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:201.98KB ,
资源ID:11367483      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11367483.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(人工智能αβ剪枝实现的一字棋实验报告DOC.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

人工智能αβ剪枝实现的一字棋实验报告DOC.docx

1、人工智能剪枝实现的一字棋实验报告DOC实验5:八剪枝实现一字棋、实验目的学习极大极小搜索及 剪枝算法实现一字棋、实验原理1.游戏规则一字棋游戏(又叫三子棋或井字棋),是一款十分经典的益智小游戏。井字棋的棋盘很简单,是一个 3X3的格子,很像中国文字中的井字,所 以得名井字棋。井字棋游戏的规则与五子棋十分类似,五子棋的规则是 一方首先五子连成一线就胜利;井字棋是一方首先三子连成一线就胜利。2.极小极大分析法设有九个空格,由 MAX,MIN二人对弈,轮到谁走棋谁就往空格上放一OXOOOXX某人的棋子),谁就取得了胜利只自己的棋子,谁先使自己的棋子构成 三子成一线(同一行或列或对角线全是用圆圈表示

2、MAX,用叉号代表 MIN比如左图中就是MAX取胜的棋局。e(P)。估价函数定义如下设棋局为 P,估价函数为(1) 若P对任何一方来说都不是获胜的位置,贝U e(P)=e(那些仍为MAX空 着的完全的行、列或对角线的总数)-e(那些仍为MIN空着的完全的行、列或对 角线的总数)(2) 若P是MAX 必胜的棋局,则 e(P)= +:(实际上赋了 60)。OXe(P)=5-4=1比如P如下图示,则 若P是B必胜的棋局,则e(P)=-:(实际上赋了 -20)需要说明的是,赋60,二赋-20的原因是机器 若赢了,则不论玩家下一步是否会赢,都会走这步必 赢棋。3.=-剪枝算法上述的极小极大分析法,实际是

3、先生成一棵博弈树,然后再计算其倒推值, 至使极小极大分析法效率较低。于是在极小极大分析法的基础上提出了 剪枝技术。a邛剪枝技术的基本思想或算法是,边生成博弈树边计算评估各节点的倒 推值,并且根据评估出的倒推值范围,及时停止扩展那些已无必要再扩展的子节 点,即相当于剪去了博弈树上的一些分枝, 从而节约了机器开销,提高了搜索效率。具体的剪枝方法如下:(1)对于一个与节点 MIN,若能估计出其倒推值的上确界 ,并且这个1值不大于 MIN的父节点(一定是或节点)的估计倒推值的下确界 ,即、;_:, 则就不必再扩展该 MIN节点的其余子节点了(因为这些节点的估值对 MIN父 节点的倒推值已无任何影响了)

4、。这一过程称为:-剪枝。(2)对于一个或节点 MAX,若能估计出其倒推值的下确界:,并且这个: 值不小于 MAX的父节点(一定是与节点)的估计倒推值的上确界,即, 则就不必再扩展该 MAX节点的其余子节点了 (因为这些节点的估值对 MAX 父节点的倒推值已无任何影响 了)。这一过程称为一:剪枝。从算法中看到:(1)MAX节点(包括起始节点)的值永不减少;(2)MIN节点(包括起始节点)的一:值永不增加。在搜索期间,丄和厶值的计算如下:(1)一个MAX节点的:-值等于其后继节点当前最大的最终倒推值。(2)一个MIN节点的一:值等于其后继节点当前最小的最终倒推值。4.输赢判断算法设计因为每次导致输

5、赢的只会是当前放置的棋子 ,输赢算法中只需从当前点开始 扫描判断是否已经形成三子。对于这个子的八个方向判断是否已经形成三子。 如 果有,则说明有一方胜利,如果没有则继续搜索,直到有一方胜利或者搜索完整 个棋盘。void PrintQP() /打印棋盘当前状态for(int i=0;i3;i+)for(i nt j=0;j3;j+)cout no wijt:coute ndl;void playerinput() /用户通过此函数来输入落子的位置,比如:用户输入3 1,则表示用户在第 3行第1列落子。if( no wi0=1 &n owi1=1 &no wi2=1)|( no w0i=1 &n

6、ow1i=1 &now 2i=1)|( no w00=1 &n ow11=1 &no w22=1)|( now20=1 &n ow11=1 &n ow02=1) II正方行连成线return 1;if( no wi0=-1 &no wi1=-1 &no wi2=-1)|( now0i=-1 &no w1i=-1 &no w2i=-1)|( now00=-1 &no w11=-1 &n ow22=-1)|( no w20=-1 &for(i nt j=0;j3;j+)/人一方/将棋盘中的空格填满自己的棋子,/flag记录本层的极值,temp记录下if(no wij=O)tmpQPij=1;els

7、etmpQPij=nowij;for(int i=0;i3;i+) II计算共有多少连成 3个1的行p+=(tmpQPi0+tmpQPi1+tmpQPi2)/3;for(int i=0;i3;i+) /计算共有多少连成 3个1的列p+=(tmpQP0i+tmpQP1i+tmpQP2i)/3;p+=(tmpQP00+tmpQP11+tmpQP22)/3; / 计算共有多少连成 3 个 1 的对角线p+=(tmpQP20+tmpQP11+tmpQP02)/3;for(int i=0;i3;i+) 既将棋盘数组中的 0变为-1for(i nt j=0;j3;j+)if(no wij=0) tmpQP

8、ij=-1;elsetmpQPij=no wij;for(int i=0;i3;i+)q+=(tmpQPi0+tmpQPi1+tmpQPi2)/3; for(int i=0;iflag)flag=temp;if(flag=val)out=true;/根据上一个结点是否为上确界,用本层的if(max)极值修改上一个结点的估计值if(flagval) val=flag; elseif(flagval)val=flag;return flag; /函数返回的是本层的极值 m 用来存放最大的 val/记录最佳走步的坐标int computer()int m=-10000,val=-10000,dep=

9、1;int x_pos,y_pos;char ch;cout ch;while(ch!=y&ch!= n)cout非法输入!您希望先走吗(y/n) ch;system(cls);In it();cout棋盘如下:endl;Prin tQP();if(ch=n) /计算机先走L5:for(i nt x=0;x3;x+)for(i nt y=0;y3;y+)if(no wxy=O)now xy=1;cut(val,dep,1); /计算机试探的走一步棋,棋盘状态改变了,在该状态下计算出深度为 dep-1的棋盘状态估计值 valif(Checkwi n()=1)cout电脑将棋子放在:x+1y+1e

10、ndl;Prin tQP();cout电脑获胜!游戏结束.endl;return 0;大估计值m=val;x_pos=x;y_pos=y;val=-10000;now xy=O;no wx_posy_pos=1;val=-10000;m=-10000;dep=1;cout电脑将棋子放在:x_pos+1y_pos+1endl;Prin tQP();coute ndl;nu m+;value();if(p=O)cout平局!endl;return 0;playerinput(); / 玩家走一步棋Prin tQP();coute ndl;nu m+;value();if(p=0)cout平局!en

11、dl;return 0;if(Checkwi n()=_1)cout您获胜!游戏结束.endl;return 0;goto L5;else /人先走L4: playeri nput();Prin tQP();coute ndl;nu m+;value();if(q=0)cout平局!endl;return 0;if (Checkwi n()=-1)cout您获胜!游戏结束.endl;return 0;for(i nt x=0;x3;x+)for(i nt y=0;y3;y+)if(no wxy=O)now xy=1;cut(val,dep,1);if(Checkwi n()=1)cout电脑将

12、棋子放在:x+1y+1endl;Prin tQP();cout电脑获胜!游戏结束.m)m=val;x_pos=x;y_pos=y;val=-10000;now xy=O;no wx_posy_pos=1;val=-10000;m=-10000;dep=1;cout电脑将棋子放在:x_pos+1y_pos+1endl;Prin tQP();coute ndl;nu m+;value();if(q=0)cout平局!endl;return 0;goto L4;return 0;int mai n()computer();system(pause);return 0;4.主要函数1估值函数估价函数:

13、int CTic_MFCDIg:evaluate(int board)完成功能:根据输入棋盘,判断当前棋盘的估值,估价函数为前面所讲:若是 MAX 的必胜局,则 e = +INFINITY,这里为+60若是MIN的必胜局,则e = -INFINITY,这里为-20,这样赋值的原 因是机器若赢了,则不考虑其它因素。其它情况,棋盘上能使 CUMPUTER成三子一线的数目为 el 棋盘上能使PLAYER成三子一线的数目为e2, e1-e2作为最终权值参数: board待评估棋盘返回: 评估结果2.Alpha-Beta 剪枝算法AlphaBeta剪枝主函数:int CTic_MFCDIg:AlphaB

14、eta(int Board, int Depth, int turn, int Alpha, int Beta, int *result)完成功能:根据输入棋盘,搜索深度,及其他参数,给出一个相应的最优解,存入 result 中。参数:board :待评估棋盘Depth :搜索深度turn :当前是机器走(MAX 结点)还是玩家走(MIN结点)Alpha :alpha值,第一次调用默认-100Beta :beta值,第一次调用默认+100result :输出结果返回:若当前点为MAX节点,则返回alpha值;3 .判断胜负int CTic_MFCDIg:isWi n(i nt curPos)完

15、成功能:根据输入棋盘,判断当前棋盘的结果, COMPUTER胜? PLAYER胜?平局?参数:board待评估棋盘返回:-1表示:尚未结束0表示:平局1 表示:PLAYER 胜2 表示:COMPUTER 胜五、实验截图G:W.exe10-1 -1 -1 0 10 0电脑将棋子放在二羽10-1 -1 -1 110 8请输入您的棋子位置“必3 31 0 -1-1 -1 110-1电脑将棋子放在M21 1 1-1 -1 110-1平局F请按任意键继绫六、实验总结通过本次实验进一步对老师课堂上所讲的:-剪枝有了更加深刻的了解,对 它的一般实现有了初步的认识。搜索深度并非越深越好,局限于估值函数是根据能够成三子一线的数目决定 的,所以搜索到最后一层,如果有人胜,则出现 :,如果没人胜,则三子一 线数目为0,所以毫无意义。这也是为什么大多数情况下都是平局的原因。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1