-
Notifications
You must be signed in to change notification settings - Fork 128
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
五子棋AI教程第二版八:算杀 #18
Labels
Comments
你好,为什么我在具体的代码里没有找到哪里调用了算杀? |
@LaoMai 我的代码中并没有使用算杀模块。 |
大佬你好。。。对于类似的这种棋类AI是不是不用机器学习技术就没有办法规避相同错误?就是相同的下棋顺序会导致完全相同的棋局 |
是的,传统棋类算法都是这样 |
@JoeXu1997 是的,传统基于搜索的方法是没有学习能力的,不过可以加一些随机机制增加趣味性 |
想要规避这种可以用神经网络嘛。这个算法明显是deterministic的。 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
需要算杀吗?
算杀其实是很多AI都带有的功能,简单的说,正常的搜索会搜索所有的可能性,而算杀只计算活三和冲四的节点,由于每一层的分支变得更少,因此算杀可以很容易实现较大的深度,一般都可以搜索到 12层以上。
在第一版教程中我是在叶节点算杀的,用的是
6 + 5
的方式,也就是正常搜索到6层,然后在叶节点进行5层的算杀,把整体深度提升到11
层。实际测试的时候经常会出现需要计算 60 秒以上的棋。因为每个叶节点都进行算杀还是很慢的,特别是中盘容易碰到一些有很多冲四活三的局面,算杀会变得非常慢。在新版本中,我直接抛弃了算杀模块,代码依然存在,但是并没有使用。不过其实我更建议另一种做法,算杀模块作为搜索模块的一个补充,而不是混在一起使用,就是在正常搜索完毕,且没有搜索到必胜局面的时候,进行一次较大深度的算杀(或者在之前也行),由于单次算杀的时间很短,几乎不会影响电脑的思考时间,并且能得到棋力的提升。估计在后序我会加上这个额外的算杀。
克服水平线效应
所谓算杀就是计算出杀棋,杀棋就是指一方通过连续的活三和冲四进行进攻,一直到赢的一种走法。我们一般会把算杀分为两种:
一般在算杀的时候,我们优先进行 VCT,没有找到结果的时候再进行 VCF。很显然,同样的深度,算杀要比前面讲的搜索效率高很多。因为算杀的情况下,每个节点只计算活三和冲四的子节点。所以同样是1秒钟的时间,搜索只能进行4层,而算杀很多时候可以进行到12层以上。
为了方便,我们把前面的讲到全面的极大极小值搜索简称为搜索
而且很容易想到,算杀其实也是一种极大极小值搜索,具体的策略是这样的:
算杀的实现代码也比较长,这里贴出部分关键代码,完整代码请参阅 https://github.com/lihongxun945/gobang:
vcx.js
这样我们正常进行 8 层搜索,如果没有好的结果则进行约 12层的算杀,能达到一个比较理想的棋力。
下一篇:五子棋AI设计教程第二版九:性能优化
The text was updated successfully, but these errors were encountered: