研究契机

本学期学校开设数据结构课程,研究了一下minimax、negamax、alpha-beta剪枝算法,以供自己以后复习参考。

minimax算法

也就是极大化极小算法,对于零和博弈,一方所赢就是另一方所输,对于一棵博弈树,可以被分成max层和min层,所谓max层,在实际应用中就代表博弈时自己的回合,在自己的回合想要将自己的利益最大化,所以会遍历博弈树种孩子孩子结点的权值,并回传权值种最大的值,而对于min层,可以理解为对手回合,对手在自己的回合想要将我们的利益最小化,所以会遍历所有的孩子结点并回传最小值,在算法实现中可以用递归来实现。在这样的原理中,就可以通过遍历博弈树,比较每一种情况的权值,找到当前回合的全局最优解或局部最优解。

negamax算法

negamax算法和minimax在本质思想上是一致的,可以看作对minimax使用了一些数学技巧,首先将所有叶子结点上的值取负,然后在每一次回传时都会再次取负,这样每一次比较都只需取最大值即可,但是本质上都是采用了通过遍历博弈树最大化自身利益最小化对手利益的思想。

alpfa-beta剪枝

在程序实际运行过程中,计算机对于博弈树的遍历时自顶向下的,对于博弈过程中不会采取的路径可以进行剪枝。具体实现方法是将设定alpha代表自身最大利益,beta代表本回合对手能够将为我们的利益降到的权值,将alpha初始化为-∞,beta初始化为∞,在遍历博弈树时,在max层可以更新alpha的值,在min层可以更新beta的值,具体可以通过for循环来实现,当出现alpha>beta的情况时,就会进行剪枝,因为这条路径会导致对手降低我们取得的权重,也就是损害了我们的利益,我们在决策时不会选择这条路径,因此可以进行剪枝。

人机对战应用

在棋类游戏和一些信息对称的零和博弈游戏中,够可以采用minmax算法或者nagamax算法来预测最优解或者局部最优解,这样就可以实现人机对战,而采用alpha-beta剪枝算法,可以避免对不必要路径遍历所带来的时间和空间损耗。

代码实现

贴出了我所设计程序过程中所使实现的算法,针对不同需求可以进行优化

int minimax(int(*board)[3], int depth, int alpha, int beta) {int result = score(board, 3).result;if (depth == 0 || result != -1) {//如果可以分出输赢,直接返回结果if (result != -1)//首先判断是否结束return score(board, 3).score;else//如果未平局,找到最优解,否则返回既定估值{if (judge(board, 3) == -2){return -1000;}points p;p = seekpoints3(board);//生成最佳位置return p.score[0];//返回最佳位置对应的最高分}}else if (depth % 2 == 0){//max层,我方决策int sameboard[3][3];copyboard(board, sameboard);points p = seekpoints3(sameboard);//找寻最优点for (int i = 0; i < 9; ++i) {if (p.score[i] > -INT_MAX){sameboard[p.pos[i].x][p.pos[i].y] = 2;int a = makedec1(sameboard, depth - 1, alpha, beta);sameboard[p.pos[i].x][p.pos[i].y] = 0;//还原if (a > alpha) {alpha = a;if (depth == 2) {Decision.pos.setx(p.pos[i].x);Decision.pos.sety(p.pos[i].y);Decision.eval = a;}}if (beta <= alpha)break;//剪枝}}return alpha;//返回最大值}else{//min层,敌方决策int rboard[3][3];reverseboard(board, rboard);points p = seekpoints3(rboard);int sameboard[3][3];copyboard(board, sameboard);for (int i = 0; i < 9; ++i) {if (p.score[i] > -INT_MAX) {sameboard[p.pos[i].x][p.pos[i].y] = 1;int a = makedec1(sameboard, depth - 1, alpha, beta);sameboard[p.pos[i].x][p.pos[i].y] = 0;//还原if (a < beta)beta = a;if (beta <= alpha)break;//剪枝}}return beta;//返回最小值,即对我方最不利}
}

调试过程

在研究minimax、negamax、aplha-beta剪枝算法时,资料中的描述都比较抽象,有些晦涩,但通过手工模拟,同时进行分析后,最终较为深入的理解了算法的思想。在使用剪枝算法完成自己的程序时,由于计算机的处理方式和实际生活中人的处理方式是有一定差异的,因此在程序中要进行相应的修改,才能运行得到想要的决策。

数据结构——人机对弈(minimax、negamax、alpaha-beta剪枝算法)相关推荐

  1. alpha beta 剪枝算法

    摘自wikipedia alpha-β修剪的好处在于可以消除搜索树的分支.这样,搜索时间可以限制在"更有希望"的子​​树中,并且可以在同一时间执行更深入的搜索.该算法和极小化极大算 ...

  2. Minimax 和 Alpha-beta 剪枝算法简介,及以此实现的井字棋游戏(Tic-tac-toe)

    前段时间用 React 写了个2048 游戏来练练手,准备用来回顾下 React 相关的各种技术,以及试验一下新技术.在写这个2048的过程中,我考虑是否可以在其中加入一个 AI 算法来自动进行游戏, ...

  3. 五子棋AI算法第三篇-Alpha Beta剪枝

    剪枝是必须的 五子棋AI教程第二版发布啦,地址:https://github.com/lihongxun945/myblog/labels/%E4%BA%94%E5%AD%90%E6%A3%8BAI% ...

  4. alpha-beta剪枝五子棋c语言,五子棋AI算法第三篇-Alpha Beta剪枝

    剪枝是必须的 上一篇讲了极大极小值搜索,其实单纯的极大极小值搜索算法并没有实际意义. 可以做一个简单的计算,平均一步考虑 50 种可能性的话,思考到第四层,那么搜索的节点数就是 50^4 = 6250 ...

  5. 五子棋AI算法-Alpha Beta剪枝

    上一篇讲了极大极小值搜索,其实单纯的极大极小值搜索算法并没有实际意义. 可以做一个简单的计算,平均一步考虑 50 种可能性的话,思考到第四层,那么搜索的节点数就是 50^4 = 6250000,在我的 ...

  6. Alpha-Beta剪枝算法在直棋中的运用

    游戏说明 详见本人的项目描述页面:https://gitee.com/liuweilhy/NineChess/blob/master/Readme.md 我做了个简单的GUI如下图. 点击这里可以下载 ...

  7. C++毕业设计——基于C+++EasyX+剪枝算法的能人机对弈的五子棋游戏设计与实现(毕业论文+程序源码)——五子棋游戏

    基于C+++EasyX+剪枝算法的能人机对弈的五子棋游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于C+++EasyX+剪枝算法的能人机对弈的五子棋游戏设计与实现,文章末尾附有本毕业设 ...

  8. 基于python的AI五子棋实现(极大极小值搜索和alpha beta剪枝)

    1.极大极小值搜索介绍 人机博弈是人工智能的重要分支,人们在这一领域探索的过程中产生了大量的研究成果,而极小化极大算法(minimax)是其中最基础的算法,它由Shannon在1950年正式提出. M ...

  9. Tic-Tac-Toe人机对弈程序(python实现)

    目录 1. 前言 2. 处理流程 3. 代码 4. 代码说明 4.1 棋盘显示 4.2 初始化 4.3 人类棋手的下一步 4.4 AI棋手的下一步 4.5 终局及胜负判断 5. 棋局示例 1. 前言 ...

最新文章

  1. MySQL优化篇:慢查询日志
  2. npm WARN enoent ENOENT: no such file or directory
  3. linux 安装tomcat 权限不足问题
  4. FMS3系列(二):创建可交互的FMS连接--I can say:Hello World
  5. 表单提交中文乱码_Java学习路线分享如何处理中文参数
  6. 怎么把c语言改成汇编语言,如何把汇编语言转换成C语言
  7. linux telnet mysql_Linux下安装telnet(傻瓜教程)
  8. android layout 开关,Android多状态开关
  9. leetcode之回文链表
  10. CST,CET,UTC,GMT,DST,Unix时间戳几种常见时间概述与关系(转)
  11. 服务器遭受攻击的解决办法
  12. 【推荐】精选行政文书模板大全(调查报告+会议纪要+通知+通告+总结+规定等模板,共177份)
  13. scala异常处理、提取器(Extractor)、文件IO
  14. Dual Attention机制
  15. 电池电压值转换为百分比
  16. 夺命十三枪枪谱完整版
  17. 学计算机智商,IQ最高的十大专业公布,考验你们智商的时刻到了!
  18. 【面试题记录】2020前端秋招笔试面试题目记录
  19. (转)美国最大的独立理财顾问公司 爱德华琼斯专注的成功
  20. jquery发送put请求_通过 Ajax 发送 PUT、DELETE 请求的两种实现方式

热门文章

  1. 现代电气控制系统安装与调试装置
  2. Appium+python自动化(一)- 环境搭建—上(超详解)
  3. install.wim 大于4G问题解决方案
  4. cnpm能用npm install吗_npm依赖版本变动引发的惨案
  5. 基于微信求职招聘小程序系统设计与实现 开题报告
  6. 如何禁用a标签的点击事件
  7. 全球及中国微电子封装材料行业发展前景展望及运营动态分析报告2021-2027年版
  8. BLE-nordic协议栈timeslot机制
  9. c语言实现大顶堆思路及代码
  10. python代码调用笔记本摄像头