关于剪枝问题

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

6层搜索的棋力其实相当弱,碰到经常玩五子棋的人基本都会输,更不要说对五子棋有研究的玩家。以目前的平均一个节点有50个子节点的搜索方式,把搜索效率提高50倍则可以增加一层搜索深度。而除了前面讲到的AlphaBeta剪枝和启发式搜索,其他的剪枝算法基本都是非安全剪枝。也就是说后序我们会使用一些非安全的剪枝算法来提升搜索效率,而这样做的话,有一定的概率会剪掉一些有益的分支。

这里我们把启发式搜索也当做一种剪枝算法,其实它的实际作用就是剪枝。

克服水平线效应

假设我们目前搜索深度为N层,那么AI只会考虑N层以内的利益,而对N+1层以及以后的局势全然没有任何考虑。那么造成的结果就是AI就是一个视力为N的近视眼,很容易因为N层以内的短期利益而造成大局上的劣势,这就是水平线效应。

如果我们提高搜索深度,依然会存在水平线效应,只是这个水平线会隐藏的更深。想要克服水平线效应,那么就需要在一定情况下对N层以外的节点进行搜索。当然,我们不可能搜索整个博弈树,所以只能在某些前提下进行一些代价不高的深入搜索。

这里我们先实现一种最简单的克服水平线效应的方式-算杀。所谓算杀就是计算出杀棋,杀棋就是指一方通过连续的活三和冲四进行进攻,一直到赢的一种走法。

很显然,同样的深度,算杀要比前面讲的搜索效率高很多。因为算杀的情况下,每个节点只计算活三和冲四的子节点。所以同样是1秒钟的时间,搜索只能进行4层,而算杀很多时候可以进行到12层以上。

为了方便,我们把前面的讲到全面的极大极小值搜索简称为搜索

而且很容易想到,算杀其实也是一种极大极小值搜索,具体的策略是这样的:

MAX层,只搜索己方的活三和冲四节点,只要有一个子节点的能赢即可

MIN 层,搜索所有的己方和对面的活三和冲四节点(进攻也是防守),只要有一个子节点能保持不败即可。

算杀的代码实现如下:

1 /*

2 * 算杀3 * 算杀的原理和极大极小值搜索是一样的4 * 不过算杀只考虑冲四活三这类对方必须防守的棋5 * 因此算杀的复杂度虽然是 M^N ,但是底数M特别小,可以算到16步以上的杀棋。6 */

7

8 /*

9 * 基本思路10 * 电脑有活三或者冲四,认为是玩家必须防守的11 * 玩家防守的时候却不一定根据电脑的棋来走,而是选择走自己最好的棋,比如有可能是自己选择冲四12 */

13

14 var R = require("./role.js");15 var hasNeighbor = require("./neighbor.js");16 var scorePoint = require("./evaluate-point.js");17 var S = require("./score.js");18 var win = require("./win.js");19 var config = require("./config.js");20

21 //找到所有比目标分数大的位置

22 var find = function(board, role, score) {23 var result =[];24 for(var i=0;i

29

30 if(role ==R.empty) {31 var s1 =scorePoint(board, p, R.com);32 var s2 =scorePoint(board, p, R.hum);33 var s = s1+s2;34 if(s >score) {35 p.score =s;36 result.push(p);37 }38 } else{39 var s =scorePoint(board, p, role);40 if(s >=score) {41 p.score =s;42 result.push(p);43 }44 }45 }46 }47 }48 }49 //注意对结果进行排序

50 result.sort(function(a, b) {51 return b.score -a.score;52 });53 returnresult;54 }55

56 var max = function(board, role, deep) {57 var w =win(board);58 if(w == role) return true;59 if(w == R.reverse(role)) return false;60 if(deep < 0) return false;61

62 var points =find(board, role, S.BLOCKED_FOUR);63 if(points.length == 0) return false;64 for(var i=0;i

72 returnm;73 } else{74 return[p];75 }76 }77 }78 return false;79 }80

81 //只要有一种方式能防守住,就可以了

82 var min = function(board, role, deep) {83 var w =win(board);84 if(w == role) return true;85 if(w == R.reverse(role)) return false;86 if(deep < 0) return false;87 var points =find(board, R.empty, S.FOUR);88 if(points.length == 0) return false;89

90 var cands =[];91 for(var i=0;i

102 }103 }104 return cands[Math.floor(cands.length*Math.random())]; //无法防守住

105 }

算杀算法的集成

有了算杀模块之后,我们可以直接对当前棋局进行算杀,但是显然更好的做法是在搜索中进行算杀,通过N层搜索结合M层算杀,我们可以最多搜索到N+M层。

至于如何组合算杀和搜索,最简单的是在每一个非连五的叶节点都进行一次算杀。为了避免算杀出现非最优解,还需要进行迭代加深,具体做法下一章再讲。

五子棋算杀c语言,五子棋AI算法-算杀(示例代码)相关推荐

  1. Java五子棋小游戏(控制台纯Ai算法)

    Java五子棋小游戏(控制台纯Ai算法) 继续之前的那个五子棋程序 修复了一些已知的小Bug 这里是之前的五子棋程序 原文链接 打包源码下载不需要C币,请点击下载连接 配套算法精讲帖子Java五子棋小 ...

  2. java走棋_Java五子棋小游戏(控制台纯Ai算法)

    Java五子棋小游戏(控制台纯Ai算法) 继续之前的那个五子棋程序 修复了一些已知的小Bug 这里是之前的五子棋程序 原文链接 修复了一些算法缺陷 本次增加了AI算法 可以人机对战 也可以Ai对Ai看 ...

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

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

  4. wav文件降噪c语言,音频降噪算法 附完整C代码

    降噪是音频图像算法中的必不可少的. 目的肯定是让图片或语音 更加自然平滑,简而言之,美化. 图像算法和音频算法 都有其共通点. 图像是偏向 空间 处理,例如图片中的某个区域. 图像很多时候是以二维数据 ...

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

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

  6. 五子棋棋谱16*16c语言,五子棋开局棋谱大全

    梅花步:也叫梅花连环阵.每4子围一子.连续防守才能出现的技巧.(是目前最难破的先手攻杀局,落子有点像围棋) 另外:要素 1.留三不冲四,保留变化 2.防守活三时防在对方攻势强的方向 3.八卦马步是强防 ...

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

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

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

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

  9. 五子棋棋谱16*16c语言,五子棋棋谱

    五子棋易学好懂,流传比较广泛,人们也将五子棋称为 连五子 . 连珠;下面是有五子棋棋谱,欢迎参阅. 第一名:寒星局 ┎┬┬┬┬┬┒ 点评:此局是最基本的布局, ┠┼┼●┼┼┨ 也很经典,适合初学者使用 ...

最新文章

  1. c3p0数据库连接池+mysql数据库基本使用方法
  2. View工作原理(一)事件传递原理详解
  3. 8.5 特征选择-机器学习笔记-斯坦福吴恩达教授
  4. python读取ttf_python解析字体反爬
  5. 对几种二叉树的简单理解
  6. python进行数据查询_如何进行python数据库查询?(实例解析)
  7. 持续集成coding
  8. html页面授权码,spring boot 2.0 整合 oauth2 authorization code授权码模式
  9. aix系统下oracle之ora-00471,Oracle RAC 9.2.0.7 (AIX53,HA52)三台主机实例全down的问题
  10. 线段树(Segment Tree)
  11. POJ 2996, Help Me with the Game
  12. 安卓android eclipse运行提示no compatible targets were found
  13. 前端跨域 ——实践总结,亲测有效
  14. 中国生物医药产业集群产业战略布局及运营管理模式分析报告2021-2027年
  15. Android Studio升级到3.5之后xml格式化问题
  16. Bootstrap框架快速上手
  17. 计算机硬盘加密的原理,对硬盘加密的加密技术是什么?
  18. ESXI虚拟机搭建华三vFW2000虚拟防火墙
  19. python黑客库长安十二时辰 更新_程序员爬取 3 万条评论,《长安十二时辰》槽点大揭秘!...
  20. JAVA开发与运维(配置中心Apollo的使用)

热门文章

  1. java中可变类型,不可变类型,不可变引用,不可变封装
  2. Maftools常用用法简介
  3. Open3D 最远点采样(FPS)
  4. 韶山市银田镇光裕堂彭氏
  5. 环信IM(PC-WEB端整体实现)
  6. 2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——第五章:中级控件
  7. Arduino-CCS-811检测空气中CO2和VOC含量(超详细)
  8. 保 姆 级 NLP 学 习 路 线
  9. oracle中同义词的作用,Oracle中使用同义词
  10. 计算机显卡n卡,电脑显卡a卡与n卡的区别