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

标签 c optimization chess

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

可以在这里找到 faile 的源代码:http://faile.sourceforge.net/download.php . TSCP 源代码可在此处找到:http://www.tckerrigan.com/Chess/TSCP .

在浏览它们之后,我发现了一些相似之处:都使用阵列板表示(尽管 Faile 使用 144 尺寸的板),都使用带有某种换位表的 alpha beta 搜索,两者都具有非常相似的评估功能。我能发现的主要区别是 Faile 通过还具有棋子位置数组来使用棋盘的冗余表示。这意味着当生成移动时(通过两个程序的非常相似的函数),Faile 必须循环遍历更少的坏 block ,同时维护这个数组花费的资源要少得多。

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

最佳答案

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

长答案:据我所知,该程序最重要的部分是移动生成器,它使用 alpha beta 搜索(对性能影响最大的部分)。 TSCP 的着法生成器不会以任何特定顺序生成着法。 Faile 的生成器(正如您所注意到的)使用 block 列表,该列表按 block 值递减的顺序排序。这意味着它首先生成更重要的 Action 。这允许 alpha-beta 修剪来减少更多不需要的移动,并使搜索树的分支更少。更少的分支树可能更深并且仍然具有相同数量的节点,这允许更深入的搜索。

这是一个非常简单的示例,说明移动顺序如何加快搜索速度。假设,最后一个白棋的举动很愚蠢 - 他们将一些棋子移到了不 protected 位置。如果我们发现一些黑棋移除了这颗棋子,我们可以忽略所有其他尚未估计的棋步并返回处理白棋的棋步列表。皇后比兵控制更多的空间,所以它有更多机会移除这颗棋子,所以如果我们先看皇后的着法,我们更有可能跳过更多不需要的着法。

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

关于c - 为什么 Faile 比简单国际象棋程序 (TSCP) 快得多? (国际象棋引擎优化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9746632/

相关文章:

c++ - 如何将字符串转换为任意长度的整数

javascript - 当我尝试使用 jQuery 将标题归因于 DropDownlist 时出现性能问题

c - llvm优化

machine-learning - 国际象棋评价函数的训练

machine-learning - 实现一个国际象棋引擎有多难?

c - 为什么不能从 C 语言的文件中打印整数

c - 如何检测 C 文件流是指向文件还是串行设备?

c - 这是未定义的行为(使用字符串文字)

python - 删除列表中条目的最有效方法

java - 格式化 JPanel 内的 JButton