2021年αβ剪枝实现的一字棋实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
人工智能大作业——极大极小算法和α -β剪枝实现一字棋
学院:
班级:
姓名:
学号:
教导老师:
日期:
目录
一、试验目..................................................................................................... 错误!未定义书签。
二、试验环境................................................................................................. 错误!未定义书签。
三、试验原理................................................................................................. 错误!未定义书签。
3.1 游戏规则......................................................................................... 错误!未定义书签。
3.2 极小极大分析法............................................................................. 错误!未定义书签。
3.3 α -β剪枝算法................................................................................ 错误!未定义书签。
3.4 输赢判定算法设计......................................................................... 错误!未定义书签。
四、数据结构................................................................................................. 错误!未定义书签。
4.1 程序步骤......................................................................................... 错误!未定义书签。
4.2 关键组员函数.................................................................................. 错误!未定义书签。
4.2.1 估值函数............................................................................. 错误!未定义书签。
4.2.2 Alpha-Beta 剪枝算法......................................................... 错误!未定义书签。
4.2.3 判定胜败............................................................................. 错误!未定义书签。
4.2.4 鼠标左键响应..................................................................... 错误!未定义书签。
4.2.5 Draw 系列函数..................................................................... 错误!未定义书签。
4.2.6 COMPUTER or PLAYER 先走................................................. 错误!未定义书签。
五、试验内容................................................................................................. 错误!未定义书签。
5.1 基础功效介绍................................................................................. 错误!未定义书签。
5.2 步骤图............................................................................................ 错误!未定义书签。
5.2.1 估价函数............................................................................. 错误!未定义书签。
5.2.2 Alpha-Beta 剪枝................................................................. 错误!未定义书签。
六、试验小结................................................................................................. 错误!未定义书签。
七、试验源代码............................................................................................. 错误!未定义书签。
一、试验目
(1) 学习极大极小搜索及α-β剪枝。
(2) 利用学到算法实现一字棋。
二、试验环境
(1) 硬件环境: 网络环境中微型计算机。
(2) 软件环境: Windows 操作系统, Microsoft Visual C++语言。
三、试验原理
3.1 游戏规则
"一字棋"游戏(又叫"三子棋"或"井字棋"), 是一款十分经典益智小游戏。
"井字棋" 棋盘很简单, 是一个3×3 格子, 很像中国文字中"井"字, 所以得名"井字棋"。
"井字棋"游戏规则与"五子棋"十分类似, "五子棋"规则是一方首先五子连成一线就胜利; "井字棋"是一方首先三子连成一线就胜利。
井字棋(英文名Tic-Tac-Toe)
井字棋出现年代估量已不可考, 西方人认为这是由古罗马人发明; 但我们中国人认为, 既然我们都发明了围棋、五子棋, 那发明个把井字棋自然是不在话下。
这些纯粹是口舌之争了, 暂且不提。
3.2 极小极大分析法
设有九个空格, 由MAX, MIN 二人对弈, 轮到谁走棋谁就往空格上放一只自己棋子, 谁先使自己棋子组成"三子成一线"(同一行或列或对角线全是某人棋子), 谁就取得了胜利。
用圆圈表示MAX, 用叉号代表MIN。
比如左图中就是MAX 取胜棋局。
估价函数定义以下:
设棋局为P, 估价函数为e(P)。
(1) 若P 对任何一方来说都不是获胜位置, 则e(P)=e(那些仍为MAX 空着完全行、列或对角线总数)-e(那些仍为MIN 空着完全行、列或对角线总数)
(2) 若P 是MAX 必胜棋局, 则e(P)=+∞(实际上赋了60)。
(3) 若P 是B 必胜棋局, 则e(P)=-∞(实际上赋了-20)。
比如P 以下图示,则e(P)=5-4=1
需要说明是, +∞赋60, -∞赋-20原因是机器若赢
了, 则不管玩家下一步是否会赢, 都会走这步必赢
棋。
3.3 α -β剪枝算法
上述极小极大分析法, 实际是先生成一棵博弈树, 然后再计算其倒推值, 至使极小极大分析法效率较低。
于是在极小极大分析法基础上提出了α-β剪枝技术。
α-β剪枝技术基础思想或算法是, 边生成博弈树边计算评定各节点倒推值, 而且依据评定出倒推值范围, 立刻停止扩展那些已无必需再扩展子节点, 即相当于剪去了博弈树上部分分枝, 从而节省了机器开销, 提升了搜索效率。
具体剪枝方法以下:
(1) 对于一个与节点MIN, 若能估量出其倒推值上确界β, 而且这个β值小于MIN 父节点(一定是或节点)估量倒推值下确界α, 即α≥β, 则就无须再扩展该MIN 节点其它子节点了(因为这些节点估值对MIN 父节点倒推值已无任何影响了)。
这一过程称为α剪枝。
(2) 对于一个或节点MAX, 若能估量出其倒推值下确界α, 而且这个α值大于MAX 父节点(一定是与节点)估量倒推值上确界β, 即α≥β, 则就无须再扩展该MAX 节点其它子节点了(因为这些节点估值对MAX 父节点倒推值已无任何影响了)。
这一过程称为β剪枝。
从算法中看到:
(1) MAX 节点(包含起始节点) α值永不降低;
(2) MIN 节点(包含起始节点) β值永不增加。
在搜索期间, α和β值计算以下:
(1) 一个MAX 节点α值等于其后继节点目前最大最终倒推值。
(2) 一个MIN 节点β值等于其后继节点目前最小最终倒推值。
3.4 输赢判定算法设计
因为每次造成输赢只会是目前放置棋子,输赢算法中只需从目前点开始扫描判定是否已经形成三子。
对于这个子八个方向判定是否已经形成三子。
假如有, 则说明有一方胜利, 假如没有则继续搜索, 直到有一方胜利或者搜索完整个棋盘。
四、数据结构
4.1 程序步骤
4.2 关键组员函数
4.2.1 估值函数
估价函数: int CTic_MFCDlg::evaluate(int board[])
完成功效: 依据输入棋盘, 判定目前棋盘估值, 估价函数为前面所讲:
若是MAX 必胜局, 则 e = +INFINITY, 这里为+60
若是MIN 必胜局, 则 e = -INFINITY, 这里为-20, 这么赋值原因是机器若赢了, 则不考虑其它原因。
其它情况, 棋盘上能使CUMPUTER 成三子一线数目为e1
棋盘上能使PLAYER成三子一线数目为e2,
e1-e2 作为最终权值
参数: board:待评定棋盘
返回: 评定结果
4.2.2 Alpha-Beta 剪枝算法
AlphaBeta 剪枝主函数:
int CTic_MFCDlg::AlphaBeta(int Board[], int Depth, int turn, int Alpha, int Beta, int *result) 完成功效: 依据输入棋盘, 搜索深度, 及其她参数, 给出一个对应最优解, 存入result 中。
参数: board :待评定棋盘
Depth :搜索深度
turn :目前是机器走(MAX 结点)还是玩家走(MIN 结点)
Alpha :alpha 值, 第一次调用默认-100
Beta :beta 值, 第一次调用默认+100
result :输出结果
返回: 若目前点为MAX 节点, 则返回alpha 值;
若目前点为MIN 节点, 则返回beta 值
4.2.3 判定胜败
int CTic_MFCDlg::isWin(int curPos)
完成功效: 依据输入棋盘, 判定目前棋盘结果, COMPUTER 胜?PLAYER 胜?平局?
参数: board:待评定棋盘
返回: -1 表示: 还未结束
0 表示: 平局
1 表示: PLAYER 胜
2 表示: COMPUTER 胜
4.2.4 鼠标左键响应
void CTic_MFCDlg::OnLButtonDown(UINT nFlags, CPoint point)
完成功效: 鼠标左键对应, 在点击那格放置玩家棋子, 以后再对应计算机走下一步
4.2.5 Draw 系列函数
void CTic_MFCDlg::DrawBoard(CDC *pDC)
完成功效: 依据Chess 棋盘数组画出棋盘
void CTic_MFCDlg::DrawO(CDC *pDC, int Pos)
完成功效: 在棋盘上画一个O, 电脑
void CTic_MFCDlg::DrawX(CDC *pDC, int Pos)
完成功效: 在棋盘上画一个X, 玩家
4.2.6 COMPUTER or PLAYER 先走
void CTic_MFCDlg::OnStartCom()
完成功效: 计算机先走
void CTic_MFCDlg::OnStartPly()
完成功效: 玩家先走
五、试验内容
5.1 基础功效介绍
本试验界面采取C++ MFC 完成, 总界面以下, 有以下功效:
1. 搜索树深度设置;
2. 机器先走或者玩家先走;
3. 游戏胜败或者平局判定。
4.鼠标在游戏开始之前或者结束以后点击棋盘不会有对应, 并会提醒用户先开始游戏;
5.鼠标点击棋盘区域之外, 不会有对应
6.搜索深度已经设置区域
7.同一棋盘格子点击只响应一次
这里需要说明是, 搜索深度并
非越深越好, 局限于估值函数是依
据能够成三子一线数目决定, 所以
搜索到最终一层, 假如有些人胜, 则
出现 , 假如没人胜, 则三子一
线数目为0, 所以毫无意义。
假如搜
索深度取到 4 或者以上, 会发觉电
脑会走出部分很"笨" 棋, 就是
这个原因。
经测试发觉, 搜索深度为
2时效果最好, 这也是我为何默认值
取 2 原因。
5.2 步骤图.
5.2.1 估价函数
5.2.2 Alpha-Beta 剪枝
六、试验小结
经过此次试验深入对老师课堂上所讲AlphaBeta 剪枝有了愈加深刻了解, 对它通常实现有了初步认识。
复习了大二时所学习C++语言, 而且对MFC 程序设计有了更深了解。
七、试验源代码
源代码见附件‘一字棋程序’。