我希望这不是一个任意问题,但我一直在查看Faile和TSCP的源代码,而且我一直在互相反对。据我所知,引擎有很多共同之处,但Faile每秒搜索约130万个节点,而TSCP每秒只搜索300k个节点。
可以在此处找到faile的源代码:http://faile.sourceforge.net/download.php。可以在此处找到TSCP源代码:http://www.tckerrigan.com/Chess/TSCP。
在浏览它们之后,我看到了一些相似之处:两者都使用阵列板表示(尽管Faile使用144大小的板),两者都使用带有某种转置表的alpha beta搜索,两者都具有非常相似的评估函数。我可以找到的主要区别是,Faile使用了板块的冗余表示,同时还具有块位置的数组。这意味着当生成移动时(通过两个程序的非常相似的函数),Faile必须循环通过更少的坏块,同时保持这个阵列的成本相当少。
我的问题是:为什么这两个程序的速度有4倍的差异?另外,为什么Faile一直击败TSCP(我只是通过观察他们的动作来估计大约200个ELO差异)?对于后者,似乎是因为Faile正在深入研究几层。
答案 0 :(得分:8)
简答: TSCP很简单(你可以从它的名字猜测)。 Faile更先进,开发人员花了一些时间来优化它。因此,Faile更快更合理,这意味着更深层次的搜索和更高的ELO。
长答案:据我记忆,使用alpha beta搜索(最能影响性能的部分),程序中最重要的部分是移动生成器。 TSCP的移动生成器不会以任何特定顺序生成移动。 Faile的生成器(如您所注意到的)使用片段列表,它按片段值减少的顺序排序。这意味着它首先产生更重要的动作。这允许alpha-beta修剪减少更多不需要的移动并使搜索树更少分支。并且较少的树枝可能更深,并且仍然具有相同数量的节点,这允许更深入的搜索。
这是一个非常简化的示例,移动顺序如何允许更快的搜索。假设,最后白人的举动很愚蠢 - 他们把一些东西移到了无保护的位置。如果我们发现一些黑色的移动可以移除这一块,我们可以忽略所有其他的,尚未估计的移动并返回处理白移动列表。女王控制的空间比一个棋子多得多,所以它有更多的机会去掉这个棋子,所以如果我们先看看女王的动作,我们就更有可能跳过更多不必要的动作。
我没有比较这些程序的其他部分。但最有可能的是,Faile也更好地优化了它们。像alpha-beta算法本身,搜索树的可变深度,静态位置分析等也可以进行优化。
答案 1 :(得分:5)
TSCP没有哈希表(-75 ELO)。 TSCP没有针对订购的杀手(-50 ELO)。 TSCP没有空移动(-100 ELO)。 TSCP具有错误的攻击功能设计(-25 ELO)。
在这四件事中,你有大约250点ELO的差异。这将增加每秒节点的数量,但是您无法比较不同引擎上的每秒节点数,因为程序员可以对节点使用不同的解释。