计算机国际象棋树搜索的最新技术是啥?
Posted
技术标签:
【中文标题】计算机国际象棋树搜索的最新技术是啥?【英文标题】:What is the state of the art in computer chess tree searching?计算机国际象棋树搜索的最新技术是什么? 【发布时间】:2010-10-06 03:19:56 【问题描述】:我对只提供百分之几速度的微小优化不感兴趣。 我对 alpha-beta 搜索最重要的启发式方法很感兴趣。以及评估函数最重要的组成部分。
我对具有最大(改进/代码大小)比率的算法特别感兴趣。 (不是(改进/复杂性))。
谢谢。
PS Killer move heuristic 就是一个完美的例子——易于实现且功能强大。 启发式数据库太复杂了。
【问题讨论】:
【参考方案1】:不确定您是否已经知道,但请查看Chess Programming Wiki - 这是一个很好的资源,几乎涵盖了现代国际象棋 AI 的各个方面。特别是,关于您的问题,请参阅主页上的“搜索和评估”部分(在“原则主题”下)。您可能还能够发现在here 列出的某些程序中使用的一些有趣技术。如果您的问题仍未得到解答,我绝对建议您在Chess Programming Forums 中提问,那里可能会有更多专家来回答。 (并不是说你不一定会在这里得到好的答案,只是更有可能在特定主题的专家论坛上)。
【讨论】:
【参考方案2】:尽管国际象棋编程文献中讨论了许多基于启发式的优化(我的意思是在不实际搜索的情况下增加树深度的方法),但我认为它们中的大多数很少使用。原因是它们在理论上是很好的性能提升器,但在实践中却不是。
有时这些启发式方法也会返回一个糟糕的(我的意思是不是最好的)举动。
与我交谈过的人总是建议优化 alpha-beta 搜索并在代码中实现迭代深化,而不是尝试添加其他启发式方法。
主要原因是计算机的处理能力正在提高,研究[我想需要引用]表明,使用其全部 CPU 时间将 alpha-beta 树强制到最大深度的程序总是超过程序在一定程度的 alpha-beta 和一些启发式之间分配时间。
尽管使用一些启发式方法来扩展树的深度可能弊大于利,但您可以将许多性能提升器添加到 alpha-beta 搜索算法中。
我相信您知道要让 alpha-beta 完全按照预期工作,您应该有一个移动排序机制(迭代深化)。迭代深化可以为您带来大约 10% 的性能提升。
在 alpha beta 中添加 主要变异搜索h 技术可能会给您额外的 10% 提升。
也试试 MTD(f) 算法。它还可以提高引擎的性能。
【讨论】:
【参考方案3】:Killer move 是小代码量和移动顺序的巨大改进的一个很好的例子。
【讨论】:
【参考方案4】:大多数棋盘游戏 AI 算法都基于 http://en.wikipedia.org/wiki/Minmax MinMax。目标是最大限度地减少他们的选择,同时最大限度地增加您的选择。尽管对于国际象棋,这是一个非常大且代价高昂的运行时问题。为了帮助减少这种情况,您可以将 minmax 与以前玩过的游戏的数据库结合起来。任何具有相似棋盘位置并建立了关于如何为您的颜色赢得该布局的模式的游戏都可以用于“分析”下一步移动的位置。
我对你所说的改进/代码大小有点困惑。您真的是指改进/运行时分析(大 O(n) 与 o(n))吗?如果是这种情况,请与 IBM 和 big blue 或 Microsoft 的 Parallels 团队联系。在 PDC,我和一个人(他的名字现在我不知道)交谈过,他正在使用每个对手使用 8 个核心来演示麻将,他们在游戏算法设计比赛中获得了第一名(他的名字也让我忘记了)。
我认为没有任何“固定”算法可以始终赢得国际象棋并且做得非常快。您必须这样做的方式是在一个非常大的基于字典的数据库中索引所有可能以前玩过的游戏,并预先缓存每个游戏的分析。这将是一个非常复杂的算法,并且在我看来将是一个非常糟糕的改进/复杂性问题。
【讨论】:
【参考方案5】:MTD(f) 或MTD variants 之一是对标准alpha-beta 的重大改进,前提是您在评估函数中没有非常精细的细节并假设您使用的是killer heuristic。 history heuristic 也很有用。
***国际象棋程序Rybka 显然已经放弃了MDT(f),转而支持PVS,在非PV 节点上具有零抽吸窗口。
Extended futility pruning 结合了正常的无效修剪和深度剃刀,理论上是不可靠的,但在实践中非常有效。
Iterative deepening 是另一种有用的技术。而且我列出了很多good chess programming links here。
【讨论】:
【参考方案6】:一个没有被提及的启发式是Null move pruning。
此外,Ed Schröder 有一个很棒的页面解释了他在 Rebel 引擎中使用的一些技巧,以及每个技巧对速度/性能的贡献:Inside Rebel
【讨论】:
【参考方案7】:我可能有点跑题了,但“最先进的”国际象棋程序使用 MPI(例如 Deep Blue)来获得强大的并行能力。
请考虑一下,并行处理在现代国际象棋中扮演着重要角色
【讨论】:
【参考方案8】:使用带有zobrist hash 的转置表
只需要很少的代码来实现[每次移动或取消移动一个 XOR,以及在游戏树中递归之前的一个 if 语句],而且好处非常好,特别是如果你已经在使用迭代深化,而且非常好可调整(使用更大的表、更小的表、替换策略等)
【讨论】:
以上是关于计算机国际象棋树搜索的最新技术是啥?的主要内容,如果未能解决你的问题,请参考以下文章