【五子棋AI】启发算法——迭代加深与内部迭代加深
2013-10-08 09:06
881 查看
α—β剪裁函数会一直搜索到指定深度然后返回,但是当走法生成器生成较多走法或深度设置较深时,往往会导致较长时间无法返回,从而无法进行较为准确的时间控制——因为如果即时返回,我们还没有得到结果,很尴尬的说。于是我们可以尝试搜索较浅的深度,然后返回一个值,如果没有胜利,那么尝试更深的深度。这样配合局面评价记录(置换表技术),可以对更深的搜索有一定的启发作用,而浅层搜索所消耗的时间所带来的负面影响(重复搜索)相对于时间控制和启发作用带来的好处相比要小,所以这是一个被广泛应用的技术,无论核心是PVS,还是MTDF。提到MTDF不得不说我的实验结果来看即使使用粗评价、减少棋型评分差异也没有得到比PVS更好的效果,可能与走法生成器的排序有关。
所以,迭代加深是一个非常有用的时间控制和启发方式。而且,代码也非常简单:
for i = 1 to maxdepth
vl=alphabetafull(-matevalue,matevalue,i)
if vl >=winvalue then
else if vl<=-winvalue then
end if
if lasetime >=maxtime then
end if
大体就是这样。
然后讨论一下“内部迭代加深”,内部迭代加深的意思是说在遍历全部可能走法之前,先浅层搜索一下得到一个浅层搜索的最好走法,然后把这个走法放在其他走法前面。也就是说,内部迭代加深是一种基于探测式的走法排序优化。在我的测试中,内部迭代加深起到了非常好的效果,它甚至要比置换表、杀手走法有效很多。所以在明确了内部迭代加深之后,代码应该比较容易写,我参考了象棋巫师的源代码,采用相同的深度约束和空窗探测,也就是说使用了相同的代码,虽然一个是VC一个是VB.NET,但说好听的我又踩了巨人的肩膀子一脚…………
全部文章和源码整理完成,以后更新也会在下面地址:
http://www.vbdevelopers.org
http://www.softos.org
所以,迭代加深是一个非常有用的时间控制和启发方式。而且,代码也非常简单:
for i = 1 to maxdepth
vl=alphabetafull(-matevalue,matevalue,i)
if vl >=winvalue then
else if vl<=-winvalue then
end if
if lasetime >=maxtime then
end if
大体就是这样。
然后讨论一下“内部迭代加深”,内部迭代加深的意思是说在遍历全部可能走法之前,先浅层搜索一下得到一个浅层搜索的最好走法,然后把这个走法放在其他走法前面。也就是说,内部迭代加深是一种基于探测式的走法排序优化。在我的测试中,内部迭代加深起到了非常好的效果,它甚至要比置换表、杀手走法有效很多。所以在明确了内部迭代加深之后,代码应该比较容易写,我参考了象棋巫师的源代码,采用相同的深度约束和空窗探测,也就是说使用了相同的代码,虽然一个是VC一个是VB.NET,但说好听的我又踩了巨人的肩膀子一脚…………
全部文章和源码整理完成,以后更新也会在下面地址:
http://www.vbdevelopers.org
http://www.softos.org
相关文章推荐
- 五子棋AI算法第六篇-迭代加深
- 【五子棋AI】启发算法——主要变例搜索
- 【五子棋AI】启发算法——VCF/VCT搜索
- 【五子棋AI】启发算法——开局库
- 【五子棋AI】启发算法——置换表
- 【五子棋AI】启发算法——PV与杀手启发
- 五子棋AI循序渐进【4】接近人类的思考方式——迭代加深、棋盘剪裁、空步剪裁、冲棋延伸
- 五子棋AI算法简易实现(五)
- 五子棋AI算法第五篇-算杀
- 五子棋AI 算法——极大极小搜索
- 【算法学习笔记】17.暴力求解法05 隐式图搜索1 迭代加深搜索 埃及分数
- 【算法竞赛入门经典】7.6 迭代加深搜索与IDA* 例题7-10 UVa11211
- 五子棋AI算法简易实现(七)
- 【算法学习笔记】17.暴力求解法05 隐式图搜索1 迭代加深搜索 埃及分数
- 五子棋AI算法第四篇-启发式搜索函数
- UOJ#9 浅谈在线仙人球嵌套动态网络路径剖分优化的分支定界贪心剪枝启发式迭代加深人工智能搜索决策算法解决问题
- C#实现八数码的IDEA*(迭代加深A*)算法
- 基于C++实现五子棋AI算法思想
- cocos 2dx 基于C++的 五子棋AI算法思想
- C#实现八数码的IDEA*(迭代加深A*)算法