-
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教程第二版五:启发式评估函数 #15
Comments
还是前一章的那张图,上面可以看到在第二层中,第一个节点的值是3,因为他其实是本层中的极小值,导致后面的两个节点都可以进行剪枝(这里第二个节点的第二个孩子也可以剪掉的)。 |
我也觉得,这个博主的逻辑上有明显的问题,第三层剪”8“结点完全是因为,他搜索到了5,而5比6小才不选择其他的结点。 |
@weiziyoung @RechardWong 感谢指正,已经修改。写完代码太久确实容易搞错。 |
嗯,之前总感觉理解不了alpha beta剪枝,总感觉跟你想的不一样,后来想了一天以后,确定是你错了。 |
请教一下,我用了alpha beta pruning后发现只有在搜索层数为4的时候下的速度比较正常,但是一旦增加两层速度就会非常慢,请问在排序上有什么技巧吗? |
黑棋不能下33,44,长连,剪枝逻辑要改下。 |
@kevinyyh 加一层可能会导致10倍左右的时间消耗,你从4增加到6时间增长50~100倍都是很正常的。 |
黑棋禁手规则 |
starSpread参数未被使用,是不是可以删除 |
什么是启发式搜索
前面讲到了,AB搜索的效果很大程度上取决于子节点的排序。
还是前一章的那张图,上面可以看到在第二层中,第一个节点的值是3,第二个是6。因为3比较小,而这一层的最大值会被选中,所以第二个节点也需要完整计算所有孩子。如果3和6调换一下顺序,6在前,3在后。那么当第二个节点计算出第一个孩子5的时候就没有必要计算之后的孩子了。也就是,Alpha-Beta 剪枝的效率和节点排序有很大关系,如果最优的节点能排在前面,则能大幅提升剪枝效率。
对于Beta 剪枝也是同样的道理。所以说Alpha Beta剪枝的效率是取决于每一层节点的顺序的。 我们肯定是无法精确排序的,因为每一个节点的值并不能直接计算出来,需要递归计算子节点。 但是我们依然能对节点进行大致的一个排序。前面说过了,只要有一个大致的排序 其实就能很好的提升剪枝效率。
那么如何排序呢?就是给所有待搜索的位置进行打分,按照分数的高低来排序。注意这个打分算法是对某一个空位进行打分,和对整个棋盘进行打分的
evaluate
函数是不一样的。不过打分的基本原理是相同的。具体就是根据这个位置是否能成五,活四,活三等来进行打分。具体的代码有些长就不贴出来了,请参见board.js
中的gen
函数 。有了打分之后,我们就可以按照分数高低进行排序了。具体实现的时候,是根据按照 成五,活四,双三,活三,其他 的顺序来排序的。
启发式搜索函数的代码如下:
board.js
下一篇:五子棋AI设计教程第二版六:迭代加深
The text was updated successfully, but these errors were encountered: