我对只能提高少数百分比速度的微小优化不感兴趣。 我对alpha-beta搜索中最重要的启发式和评估函数的最重要组成部分感兴趣。
我特别关注具有最高(改进/代码大小)比率的算法。(而不是改进/复杂性)。
谢谢。
附言 杀手着法启发式是一个完美的例子——易于实现且功能强大。 启发式数据库太过复杂。
我对只能提高少数百分比速度的微小优化不感兴趣。 我对alpha-beta搜索中最重要的启发式和评估函数的最重要组成部分感兴趣。
我特别关注具有最高(改进/代码大小)比率的算法。(而不是改进/复杂性)。
谢谢。
附言 杀手着法启发式是一个完美的例子——易于实现且功能强大。 启发式数据库太过复杂。
MTD(f)或其它MTD变体是对标准的alpha-beta算法的大幅改进,前提是你的评估函数没有太多细节,并且假定你正在使用killer heuristic。此外,历史启发式也很有用。
排名靠前的国际象棋程序Rybka显然已经放弃了MTD(f),转而采用PVS,在非PV节点上使用零抽奖窗口。
扩展失败剪枝理论上不可靠,但实践中效果显著,它包括正常的失败剪枝和深度削减。
迭代加深是另一种有用的技术。我在这里列出了很多编写国际象棋程序的好资源。
使用Zobrist哈希的置换表
实现它只需要很少的代码(每次移动或撤销一次XOR,以及在递归游戏树之前添加一个if语句),而且好处相当不错,特别是如果您已经在使用迭代加深,并且它非常易于调整(使用更大的表、更小的表、替换策略等)。
杀手着法是小代码尺寸和着法排序的巨大改进的良好示例。
大多数棋盘游戏的AI算法都是基于http://en.wikipedia.org/wiki/Minmax MinMax。目标是最小化对手的选择,同时最大化自己的选择。虽然在国际象棋中这是一个非常庞大且昂贵的运行时问题。为了帮助减少这个问题,可以将minmax与以前玩过的游戏的数据库相结合。任何具有类似棋盘位置并已经建立了如何赢得该布局的模式的游戏都可以用于“分析”下一步要移动到哪里。
我有点困惑你所说的improvement/code_size是什么意思。你真的是指改进/运行时分析(big O(n) vs. o(n))吗?如果是这样,请与IBM和Big Blue或Microsoft的Parallels团队联系。在PDC上,我曾与一个人交谈过(他的名字现在我忘记了),他正在使用每个对手8个核心来演示麻将,并赢得了游戏算法设计比赛的第一名(这个比赛的名称也我忘记了)。
我认为目前没有任何“现成”的算法可以始终赢得棋局并且速度非常快。你需要做的是将每一场可能的先前比赛都索引到一个非常大的基于字典的数据库中,并预先缓存每场比赛的分析结果。这将是一个非常复杂的算法,而且在我看来,它只会带来很小的改进和更高的复杂度问题。我可能有点跑题,但是“最先进”的国际象棋程序,比如Deep Blue使用MPI进行大规模并行计算。
只需考虑到并行处理在现代国际象棋中扮演着重要角色。