八:算杀 |
您所在的位置:网站首页 › 五子棋的博弈算法是什么 › 八:算杀 |
需要算杀吗?克服水平线效应需要算杀吗? 算杀其实是很多AI都带有的功能,简单的说,正常的搜索会搜索所有的可能性,而算杀只计算活三和冲四的节点,由于每一层的分支变得更少,因此算杀可以很容易实现较大的深度,一般都可以搜索到 12层以上。 在第一版教程中我是在叶节点算杀的,用的是 6 + 5 的方式,也就是正常搜索到6层,然后在叶节点进行5层的算杀,把整体深度提升到 11 层。实际测试的时候经常会出现需要计算 60 秒以上的棋。因为每个叶节点都进行算杀还是很慢的,特别是中盘容易碰到一些有很多冲四活三的局面,算杀会变得非常慢。 在新版本中,我直接抛弃了算杀模块,代码依然存在,但是并没有使用。不过其实我更建议另一种做法,算杀模块作为搜索模块的一个补充,而不是混在一起使用,就是在正常搜索完毕,且没有搜索到必胜局面的时候,进行一次较大深度的算杀(或者在之前也行),由于单次算杀的时间很短,几乎不会影响电脑的思考时间,并且能得到棋力的提升。估计在后序我会加上这个额外的算杀。 克服水平线效应所谓算杀就是计算出杀棋,杀棋就是指一方通过连续的活三和冲四进行进攻,一直到赢的一种走法。我们一般会把算杀分为两种: VCF (victory of continuous four) 连续冲四胜VCT (victory of continuous three) 连续活三胜一般在算杀的时候,我们优先进行 VCT,没有找到结果的时候再进行 VCF。很显然,同样的深度,算杀要比前面讲的搜索效率高很多。因为算杀的情况下,每个节点只计算活三和冲四的子节点。所以同样是1秒钟的时间,搜索只能进行4层,而算杀很多时候可以进行到12层以上。 为了方便,我们把前面的讲到全面的极大极小值搜索简称为搜索 而且很容易想到,算杀其实也是一种极大极小值搜索,具体的策略是这样的: MAX层,只搜索己方的活三和冲四节点,只要有一个子节点的能赢即可MIN 层,搜索所有的己方和对面的活三和冲四节点(进攻也是防守),只要有一个子节点能保持不败即可。算杀的实现代码也比较长,这里贴出部分关键代码,完整代码请参阅 https://github.com/lihongxun945/gobang: vcx.js //找到所有比目标分数大的位置//注意,不止要找自己的,还要找对面的,var findMax = function(role, score) { var result = [], fives = []; for(var i=0;i |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |