在博弈树的极大极小过程中是对每一个树节点(称它为全局搜索吧)都要计算其估值,然后在这些估值中做出选择。如果搜索比较大的话,全局搜索的方式效率会非常低,因为有一些节点根本不需要搜索。那么怎么加快搜索的速度呢?可以采用Alpha-Beta剪枝方法。

Alpha-Beta剪枝方法如下:

任何Max节点n的alpha值如果大于或等于它先辈节点的bete值,那么节点n以下的分支就不用搜索了。这是beta剪枝。

任何Min节点的beta值如果小于或等于它先辈节点的alpha值,那么节点n以下的分支也不用搜索了。这是alpha剪枝。

下面给出代码:

// 带Alpha-Beta剪枝的极大极小过程函数,按指定的深度,搜索产生一个走法

int ChessAI::maxMinWithAlphaBetaCut(int** chessBoard, int whiteOrBlack, int depth, Point opPos, int alpha, int beta)

{

int bestValue, curValue; // bestValue是最好的分数, curValue是试探下子后,该次下子的分数

if (isBE5AtPoint(chessBoard, whiteOrBlack == 2 ? 1 : 2, opPos)) // 如果在这里可以分出胜负

{

if (whiteOrBlack == 1) // 电脑赢。这里为什么不是2呢?因为这里whiteOrBlack与opPos是相反关系

{

return FIVE_ALIKE;

}

else // 玩家赢

{

return -FIVE_ALIKE;

}

}

else if (depth == 0) //深度为0,估值返回

{

bestValue = getValue(chessBoard);

}

else

{

// 下面开始是利用了剪枝思想的极大极小过程

if (whiteOrBlack == 2) // 此节点为电脑白子,取极大值

{

// 下面开始对各个可以下的子进行评分

for (int i = 0; i <= 14; i++)

{

for (int j = 0; j <= 14; j++)

{

if (chessBoard[i][j] == 0) // 如果可以下子

{

if (alpha >= beta) // alpha剪枝

{

return alpha;

}

chessBoard[i][j] = whiteOrBlack; // 试探下子

curValue = maxMinWithAlphaBetaCut(chessBoard, 1, depth - 1, cocos2d::Point(i, j), alpha, beta);

chessBoard[i][j] = 0; // 撤消下子

if (curValue > alpha)

{

alpha = curValue; //子节点的最大值记录到alpha中

}

}

}

}

bestValue = alpha;

}// end if (whiteOrBlack == 2)

else if (whiteOrBlack == 1) // 此节点为玩家黑子,取极小值

{

for (int i = 0; i <= 14; i++)

{

for (int j = 0; j <= 14; j++)

{

if (chessBoard[i][j] == 0) // 如果可以下子

{

if (alpha >= beta) // beta剪枝

{

return beta;

}

chessBoard[i][j] = whiteOrBlack; // 试探下子

curValue = maxMinWithAlphaBetaCut(chessBoard, 2, depth - 1, cocos2d::Point(i, j), alpha, beta);

chessBoard[i][j] = 0; // 撤消下子

if (curValue < beta)

{

beta = curValue; //子节点的最小值记录到beta中

}

}

}

} // end else if (whiteOrBlack == 1)

bestValue = beta;

}

} // end else : (depth > 0)

return bestValue;

}

五子棋博弈树剪枝c语言,五子棋AI博弈树之带Alpha-Beta剪枝的极大极小过程函数...相关推荐

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

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

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

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

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

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

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

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

  5. alpha,beta剪枝详解

    α,β剪枝详解\alpha,\beta剪枝详解α,β剪枝详解 示例图 步骤详解 基础原理 这里我们先要理解什么是α,β\alpha,\betaα,β剪枝:α\alphaα是下界,β\betaβ是上界. ...

  6. 五子棋对弈程序c语言,五子棋程序纯C语言版.doc

    五子棋程序纯C语言版 五子棋程序纯C语言版 //以前发的代码里因为有C++的一点点代码,现在我把那C++的代码改掉.重发出来.//但是这些代码由于编译器的原因,在TC下仍无法运行.请使用VC.#inc ...

  7. 五子棋算杀c语言,五子棋AI算法-算杀(示例代码)

    关于剪枝问题 前面讲到的通过Alpha-Beta剪枝和启发式搜索可以将4层搜索的平均时间降低到1秒以下.只有这两个优化方式其实目前最多可以做到6层搜索,就是把AI和玩家各向后推算三步. 6层搜索的棋力 ...

  8. c语言五子棋毕业设计,基于c语言五子棋小游戏--本科生毕业设计.doc

    五子棋小游戏 需求分析 现在有越来越多的人使用电脑,而且五子棋的受众广泛但实体棋操作较为繁琐且平时较难实现,所以电脑版的五子棋游戏应运而生.大家对于这个小游戏的需求如下:首先,设计这个游戏最基本的就是 ...

  9. 五子棋人机对弈 c语言,五子棋人机对弈系统

    ********本科毕业论文(设计)任务书 论文(设计)题目:五子棋人机对弈系统 学院:专业:班级: 学生姓名:学号:指导教师:职称: 1.论文(设计)研究目标及主要任务 研究目标: 采用具有一定智能 ...

最新文章

  1. 使用移动设备 连接到Exchange Server 2007
  2. CentOS 7下使用chkconfig添加的服务无法使用/etc/profile里面的环境变量
  3. 360浏览器清凉新版让手机解暑
  4. 智慧城市java开发_智慧城市主界面开发 使用eclipse开发智慧城市APP源码 - 下载 - 搜珍网...
  5. 多表查询, 聚集查询和分组查询
  6. 基于python的-使用正则表达式验证手机号
  7. 103 规约分析总结
  8. html转换成pdf后变模糊,使用html2canvas.js和jspdf.js把网页转换成 pdf 不清晰怎么解决...
  9. 日本麻将中的牌型名称,充满格调与文艺
  10. xss.haozi.me
  11. 百度首页HTML(简单代码)
  12. Conlletion集合框架总结大全
  13. 如何在指定网站搜索内容
  14. 【Linux】-- Mysql(2) : 创建数据库和数据表
  15. 图书借阅java设计报告_JAVA课程设计报告图书借阅系统.pdf
  16. 修改远程桌面默认端口
  17. 论文翻译:ViBe+算法(ViBe算法的改进版本)
  18. linux如何查看有几个网卡,linux 查看有几块网卡
  19. 计算机信息处理技术水平证考试,2015年(上)全国信息技术水平考试计算机信息处理技术水平证书考试试卷...
  20. 年产10亿颗的555定时芯片,你知道是怎么工作么?陈老师告诉你

热门文章

  1. 05、HttpServletRequest
  2. ok6410 u-boot-2012.04.01移植六完善MLC NAND支持
  3. vue 添加完数据后刷新页面_页面刷新vuex数据消失
  4. jquery对象PHP转换,jQuery对象与DOM对象转换方法详解_jquery
  5. python如何返回多个值_python- 如何返回多个值 | 学步园
  6. vue中父子组件先后渲染_VUE如何实现子父组件、父子组件、兄弟组件传值
  7. centos7 ssr一键脚本_RHEL7(Centos7)下使用shell脚本一键部署服务
  8. 弹出层,div的写法
  9. 正直摄影方式的精度估算式_[公务员考试]数量关系——估算法与直除法
  10. mysql设置keepalived_MySQL高可用性之Keepalived+MySQL(双主热备)