计算机象棋树搜索的最新技术是什么?

时间:2009-02-07 12:38:37

标签: algorithm search heuristics chess

我对微小的优化并不感兴趣,因为速度很低。 我对alpha-beta搜索最重要的启发式方法感兴趣。评估功能最重要的组成部分。

我对具有最大(改进/ code_size)比率的算法特别感兴趣。 (不是(改进/复杂性))。

感谢。

PS 杀手移动启发式是一个完美的例子 - 易于实现和强大。 启发式数据库太复杂了。

8 个答案:

答案 0 :(得分:13)

不确定你是否已经知道它,但查看Chess Programming Wiki - 这是一个很好的资源,涵盖了现代象棋AI的各个方面。特别是,与您的问题相关,请参阅主页上的“搜索和评估”部分(在“主题”下)。您也可以在here列出的某些程序中发现一些有趣的技巧。如果你的问题仍未得到解答,我肯定会建议你在Chess Programming Forums询问,那里可能会有更多的专家来回答。 (并不是说你不一定会在这里得到好的答案,只是在主题专家论坛上更有可能)。

答案 1 :(得分:4)

MTD(f)MTD variants之一是对标准alpha-beta的重大改进,假设您在评估函数中没有非常精细的细节,并假设您正在使用killer heuristichistory heuristic也很有用。

排名最高的国际象棋程序Rybka显然放弃了MDT(f),转而支持PVS,在非PV节点上有一个零愿望窗口。

Extended futility pruning,包括正常的无效修剪和深度剃刀,理论上不健全,但在实践中非常有效。

Iterative deepening是另一项有用的技巧。我列出了很多good chess programming links here

答案 2 :(得分:2)

尽管在国际象棋编程文献中讨论过许多基于启发式的优化(我的意思是在没有实际搜索的情况下增加树深度的方法),但我认为它们中的大多数都很少使用。原因在于它们在理论上是良好的表现助推器,但在实践中并非如此。

有时这些启发式方法也可以返回坏的(我的意思不是最好)。

我与之交谈过的人总是建议优化alpha-beta搜索并在代码中实现迭代深化,而不是尝试添加其他启发式方法。

主要原因是计算机的处理能力正在提高,研究[需要引用我猜]已经表明,利用其全部CPU时间来强制将alpha-beta树推向最大深度的程序总是超过了程序将他们的时间分成一定水平的alpha-beta和一些启发式,。

尽管使用一些启发式方法来扩展树深度可能会带来更多弊大于利,但是您可以添加到alpha-beta搜索算法中的许多性能提升器。

我确信你知道,为了使alpha-beta完全按照预期的方式工作,你应该有一个移动排序机制(迭代加深)。迭代加深可以为您提供大约10%的性能提升。

主变差searc h技术添加到alpha beta可能会额外增加10%。

尝试 MTD(f )算法。它还可以提高引擎的性能。

答案 3 :(得分:1)

未提及的一种启发式是Null move pruning

另外,EdSchröder有一个很好的页面,解释了他在Rebel引擎中使用的一些技巧,以及每个技巧对速度/性能的贡献有多大:Inside Rebel

答案 4 :(得分:1)

使用带有zobrist hash

的转置表

实现[每次移动或移除时一个XOR,并且在游戏树中递归之前的if语句]需要很少的代码,并且好处非常好,特别是如果您已经在使用迭代加深,并且它很漂亮可调整(使用更大的表,更小的表,替换策略等)

答案 5 :(得分:0)

杀手动作是小代码大小和移动排序方面的重大改进的好例子。

答案 6 :(得分:0)

大多数棋盘游戏AI算法都基于http://en.wikipedia.org/wiki/Minmax MinMax。目标是尽量减少他们的选择,同时最大化您的选择。虽然使用Chess,但这是一个非常庞大且昂贵的运行时问题。为了减少这种情况,您可以将minmax与以前玩过的游戏数据库结合起来。任何具有类似棋盘位置且具有基于如何为您的颜色赢得布局的模式的游戏都可以用于“分析”下一步移动的位置。

我对改进/ code_size的意思有点困惑。你真的是指改进/运行时分析(大O(n)对o(n))吗?如果是这种情况,请与IBM和大蓝,或微软的Parallels团队交谈。在PDC,我与一个人(他的名字现在逃脱了我)进行了交谈,他们使用每个对手8个核心来演示麻将,他们在游戏算法设计竞赛中获得了第一名(他的名字也逃脱了我)。

我认为没有任何“罐头”算法可以永远赢得国际象棋并且速度非常快。你必须要做的就是让一个以前玩过的游戏在一个非常大的字典数据库中编入索引,并预先缓存了每个游戏的分析。这将是一个非常复杂的算法,在我看来是一个非常糟糕的改进/复杂性问题。

答案 7 :(得分:0)

我可能稍微偏离主题,但“最先进的”国际象棋程序使用深蓝色等MPI来获得大规模并行功率。

考虑并行处理在现代国际象棋中扮演重要角色