为什么Faile比简单国际象棋程序(TSCP)快得多?(国际象棋引擎优化)

为什么Faile比简单国际象棋程序(TSCP)快得多?(国际象棋引擎优化),c,optimization,chess,C,Optimization,Chess,我希望这不是一个太武断的问题,但我一直在查看Faile和TSCP的源代码,我一直在与它们相互竞争。据我所知,这些引擎有很多共同点,但Faile每秒搜索约130万个节点,而TSCP每秒仅搜索300k个节点 faile的源代码可在此处找到:。TSCP源代码可在此处找到: 在浏览它们之后,我看到了一些相似之处:两者都使用阵列板表示(尽管Faile使用144大小的板),都使用alpha-beta搜索和某种换位表,都有非常相似的求值函数。我能发现的主要区别是Faile使用了电路板的冗余表示,它还具有工件位

我希望这不是一个太武断的问题,但我一直在查看Faile和TSCP的源代码,我一直在与它们相互竞争。据我所知,这些引擎有很多共同点,但Faile每秒搜索约130万个节点,而TSCP每秒仅搜索300k个节点

faile的源代码可在此处找到:。TSCP源代码可在此处找到:

在浏览它们之后,我看到了一些相似之处:两者都使用阵列板表示(尽管Faile使用144大小的板),都使用alpha-beta搜索和某种换位表,都有非常相似的求值函数。我能发现的主要区别是Faile使用了电路板的冗余表示,它还具有工件位置的数组。这意味着,当移动生成时(两个程序的功能非常相似),Faile必须循环通过更少的坏片段,同时维护此阵列的资源成本要少得多


我的问题是:为什么这两个程序的速度相差4倍?另外,为什么Faile总是击败TSCP(我估计仅仅通过观察他们的动作就有200左右的ELO差异)?对于后者,这似乎是因为Faile正在搜索更深的几层。

简短的回答:TSCP非常简单(从它的名字可以猜到)。Faile更高级,开发人员花了一些时间对其进行优化。因此,Faile的速度更快是合理的,这意味着搜索更深入,ELO更高

详细回答:据我所知,使用alpha-beta搜索(对性能影响最大的部分)的程序最重要的部分是move generator。TSCP的移动生成器不会以任何特定顺序生成移动。Faile的生成器(正如您所注意到的)使用工件列表,该列表按工件值递减的顺序排序。这意味着它首先会产生更重要的动作。这使得alpha-beta修剪可以减少更多不必要的移动,并减少搜索树的分支。分支树越少,可能越深,节点数也一样,这样可以进行更深的搜索

下面是一个非常简单的示例,说明了移动顺序如何允许更快的搜索。假设,最后一个白人的举动很愚蠢——他们把一些碎片移到了不受保护的位置。如果我们发现一些黑人的移动删除这一块,我们可以忽略所有其他的,尚未估计的移动,并返回到处理白色的移动列表。皇后比棋子控制的空间要大得多,所以它有更多的机会移走这一块,所以如果我们先看皇后的动作,我们很可能会跳过更多不必要的动作

我没有比较这些程序的其他部分。但最有可能的是,Faile也能更好地优化它们。阿尔法-贝塔算法本身、搜索树的可变深度、静态位置分析等也可以进行优化。

TSCP没有哈希表(-75 ELO)。 TSCP没有用于订购的杀手招式(-50 ELO)。 TSCP没有空移动(-100 ELO)。 TSCP的攻击功能设计很差(-25 ELO)


在这四件事中,你的ELO分数相差250分左右。这将增加每秒的节点数,但您不能在不同的引擎上比较每秒的节点数,因为程序员可以对节点使用不同的解释。

谢谢您的回答。在此期间,我可以分享我对它的一些研究。我想我发现也许最大的原因,虽然你说的是一个很好的理由,是虽然TSCP起初似乎在使用转置表,但实际上并不是。它创建Zobrist关键点,但仅用于重复绘制。这意味着它可能会多次分析某些位置。据我所知,换位表可以将性能提高3-4倍。