2012-03-17 80 views
7

我希望这不是太大的任意问题的,但我一直在寻找通过Faile和TSCP的源代码,我一直在玩他们反目成仇。据我可以看到引擎有很多共同点,但Faile每秒搜索约130万个节点,而TSCP每秒仅搜索300k个节点。为什么Faile比简单国际象棋程序(TSCP)快得多? (国际象棋引擎优化)

为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正在深入寻找几层。

回答

4

TSCP没有哈希表(-75 ELO)。 TSCP没有杀手为了订购(-50 ELO)。 TSCP不为空(-100 ELO)。 TSCP有一个坏的攻击功能设计(-25 ELO)。

在这4件事情你有250点ELO的差异。这会增加每秒节点的数量,但不能在不同引擎上每秒比较节点,因为程序员可以对节点的不同解释使用不同的解释。

7

简短的回答: TSCP很简单(因为你可以从它的名字猜测)。 Faile更先进,开发人员花费了一些时间来优化它。所以Faile要更快,这意味着更深层次的搜索和更高的ELO也是合理的。

龙答:至于我记得,该计划中最重要的部分,采用α+β搜索(其中一部分影响性能的最),是移动发电机。 TSCP的移动生成器不会以任何特定顺序生成移动。 Faile的生成器(如您注意到的)使用片段列表,该列表按照片段值递减的顺序排序。这意味着它首先会产生更重要的举动。这允许alpha-beta修剪切割更多不需要的移动,并使搜索树减少分枝。较少分支树可能更深,并且仍然具有相同数量的节点,这允许更深入的搜索。

下面是一个非常简单的例子,说明移动顺序如何实现更快的搜索。假设,上届白人的举动是愚蠢的 - 他们将一些棋子移到了无保护的位置。如果我们发现一些黑棋移除了这块棋子,我们可以忽略所有其他棋子,但尚未估算棋步并返回到处理白棋的移动列表。女王控制的空间比棋子多得多,所以它有更多的机会去除这块棋子,所以如果我们先看皇后的棋步,我们更有可能跳过更多不必要的棋步。

我没有比较这些程序的其他部分。但最有可能的是,Faile也更好地优化它们。诸如alpha-beta算法本身,搜索树的可变深度,静态位置分析等可能也会得到优化。

+1

感谢您的回答。在此期间,我可以分享一些我研究过的研究。我认为我发现这也许是最大的原因,但你说的是一个很好的理由,虽然起初TSCP似乎使用换位表,但事实上并非如此。它会创建一个Zobrist键,但只能用于重复绘制。这意味着它可能会多次分析某些职位。根据我的阅读,转座表可以组成3-4倍的性能提升。 – 2012-03-17 23:51:25