国际象棋引擎如何“思考”?


28

我想知道的是如何对引擎进行编程以查找运动。我确定他们首先会计算出最强制的行,例如捕获和检查。但是,微妙而深入的位置移动又如何呢?他们似乎也很快找到了它们(通常来说。当然,他们偶尔会错过这样的举动)。像这样,他们如何编程以寻找安静的动作/位置思想?他们不能仅仅强行采取任何行动,因为那会花费太长时间,因此应该有一些聪明的方法让他们真正迅速地达到最佳行动。我对了解这一点很感兴趣,因为我认为这也会帮助玩家思考现实世界中的棋盘。


国际象棋引擎每秒查看数百万个位置,因此它们实际上可以查看所有位置,直到它们深入一些为止。
RemcoGerlich

2
这是一个很棒的问题,我真的很喜欢答案。
Travis J

基本上,他们使用搜索算法(例如minimax)进行预先搜索,并使用预编程的试探法评估位置。尽管最近一些引擎(例如AlphaZero)通过玩自己的游戏开发了自己的评估方法。
惯性无知

Answers:


22

通常,国际象棋引擎使用决策树。树的根是当前位置,并且每个位置都有一个子节点,可以通过合法移动来建立子节点。这些节点中的每个节点都有一个子节点,用于通过从其合法移动可以到达的位置。引擎将树推送到由其功能和“思考”时间定义的深度。可以简单地交叉引用可以以多种方式到达的位置,因此不必考虑多个位置。一旦创建了树,计算机就会使用一组加权规则来分析树中的最终位置,并开始删除那些不需要的或对手可以阻止其到达的位置。以这种方式砍伐这棵树,直到只剩下一招,然后计算机执行该举动。

http://www.chess.com/blog/zaifrun提供了有关创建国际象棋引擎的系列或文章,如果您想更深入地了解它们的工作原理。


好的答案,所以当您看到深度为30时,是否表示引擎已搜索30个深度的节点?另外,Ply是什么意思?
xaisoft

我不确定在不做更多研究的情况下Ply代表什么,我从来都不擅长使用缩写词。深度是指有多少个节点深,每个节点将移动一半,或者要深入到某个节点,可能取决于程序员。但是,我认为惯例应该是采取更多措施。
爱德华·古德森

5
一层是一招的一半。国际象棋棋步是一个完整的“设定”,如果您将白色+黑色。一层是其中一半,所以只有一种颜色。
ErebusBat 2013年

21

您在问一个非常复杂的问题,但是回到基础知识是件好事。有两个概念需要考虑:

评价

如果显示(真实)玩家某个位置并询问“谁在这场比赛中获胜?”,他们将如何决定?他们很可能会检查一些基本的东西,例如:材质差异,零件的开发程度或“良好”定位,翻倍/隔离/连接/通过的棋子,(受控的)打开文件,距离多远在棋子上。

现在,如果需要的话,您可以根据上述方法,系统地计算排名得分。例如,您可以确定棋子的价值为1分,而经过的棋子的价值为0.3分多。孤立的或加倍的典当值可能会少一些,等等。如果将所有内容加起来,您将获得当前位置的估计值。

这称为评估,基本上所有国际象棋程序都具有一种评估位置的方法(忽略了通常非常薄弱的​​新颖AI国际象棋引擎)。

但是,微妙而深入的位置移动又如何呢?

好吧,我们只是勉强摸索了位置评估的表面。评估功能的实际实现可能是简单的,以允许每秒评估更多职位(尽管以粗略方式),或者更复杂,从而导致评估的职位更少,但置信度更高。评估功能通常会考虑成百上千的独立信息。

搜索

我从上面特别遗漏了一些东西,大多数真正的玩家会立即考虑-有什么方法可以让双方立即赢得比赛吗?有没有可见的搭档或“悬挂”件?尽管将其琐碎化很容易,但除琐碎琐事外,别无其他。

这是什么意思的球员有充分的信心相结合?最后,归结为已经计算了所有选项。真正的玩家通常不会这样做(除了琐碎的或非常强迫的队友),在大多数情况下,我们只会考虑少数选择,并排除其他似乎“无建设性”或明显导致亏损的选择。在计算过程中,我们经常会犯错误,例如,我们可能会意识到移动指令的更改会使威胁消失。等等。关键是要完全确定一个组合,实际上您需要一直计算得出其结论,并假设每个玩家只会向他们提供最好的移动(这称为“最小/最大”)。

现在,由于国际象棋的搜索空间(这是“未来所有可能的移动”所指的空间)要比计算机可以计算的空间大得多,因此需要做出折衷。就像人类一样,计算机可以根据某些标准决定不考虑整个思路。这就是所谓的启发式。值得一提的是,虽然只有通过蛮力才能真正确定一个组合,但是复杂的评估功能通常可以检测到威胁的存在(例如,我们可以计算叉,串机会等,以指导该方向的搜索) )。

最后,尽管计算机速度极快,但启发式技术使它们能够进行如此深入的计算。话虽如此,您可能会惊讶于现代引擎如何全面计算,即使在快速游戏中,通常也超过了3个动作。

结论/全部结合

因此,总而言之-评估功能内置许多智能功能(例如,评估功能所考虑的因素比普通玩家要多),启发式技术可以使计算机消除其认为可能结局不佳的想法,而且计算机速度非常快。加上它们,它们很难被击败。


6

我同意答案。

我记得通用(Roman Dzindzichashvili)总经理在罗马的一个实验室视频中谈论它,我不记得它是什么视频(如果有人知道细节,请编辑我的答案)。

罗曼说,弗里茨发动机的开发商是他的朋友。因此,罗曼(Roman)对弗里茨(Fritz)进行了测试,看它有多好,开发人员告诉罗曼(Roman),为了让弗里茨做出复杂的决定(例如,牺牲材料以换取位置优势),他们必须改变零件的价值,例如告诉程序一个坏的主教值得一分,在对角线上的主教值得七分,骑士在近身位置值得五分...

我不知道每个零件的确切数字,但是这就是它的工作方式,现在您的引擎在牺牲一个糟糕的主教身上没有任何问题,或者您可以告诉他每个位置的价值。

编辑

另请参阅国际象棋编程维基


4

计算机不可能看起来足够深(25层或更多)并检查所有可能的移动。

使得成为可能的是称为Alpha-beta修剪的技术,这意味着与人类相似(但更好)的计算机仅遵循有希望的延续。

他们不断评估位置(基于一些预先编码的规则,评估材料,国王安全,活动,当兵结构等),并研究可能导致其走向最佳位置的变化。

他们如何有效地做到足以在一秒钟内评估数百万个这样的职位,仍然接近魔术。

因此,总而言之,您是正确的,如果他们下战略棋,他们不会看所有举动,但是他们可以非常迅速地看一下体面的举动。问题仍然在于他们可以看到的长期计划和视野,但这正在研究中(Rybka的分析速度要慢得多,但是下棋更多,而Houdini则很浪漫,因为他的“机械心脏”计算了更多的动作并更具攻击性)。甚至计算机都有自己的风格!


3

Alpha-beta修剪只是意味着,如果您发现一条对您不利的行,您将不再关注该候选移动,而尝试其他移动。这是一种向后修剪,意味着您永远不会错过一个好的举动。相比之下,正向修剪更多地基于猜测。徒劳的修剪,后期裁员和剃刀都是正向修剪的类型,所有这些都取决于程序员对哪种类型的裁员的感觉。一个进行大量前期修剪的程序可能会错过导致交配的惊人牺牲,但另一方面,它消除了很多非常糟糕的举动,因此可以更深入地研究它喜欢的举动。

大多数引擎会全盘搜索前几步动作,并检查所有可能性。如果没有任何举动失败过高(即显然比您已经考虑过的举动更糟),则将搜索范围扩大一点。通常,您将继续探索每条线,直到到达静止位置(不进行检查,捕获,配合威胁等),然后进行评估。安静的动作在搜索树中很深时可能不会考虑,但是一旦您到达游戏中的实际位置,引擎就会查看所有动作,无论安静还是尖锐。实际上,有时在引擎输出中会看到这种情况,这是因为引擎突然偏向于未考虑向后移动的移动。

引擎计算速度如此之快,以至于对于他们而言,考虑首先要看哪个动作并不重要,但是对于人类来说,这是一个关键问题。乔纳森·提斯达尔(Jonathan Tisdall)在他的书《立即改善国际象棋》中回答了这个问题。当您受到攻击时,他建议您先看看最猛烈的动作。当您进行防守时,您首先要看最困难的路线。他在决定先看哪个动作时还引用了经验法则(例如集中化,协调性)。

其他可能相关的书是伊曼纽尔·内曼(Emmanuel Neimann)的《无形棋步》和查尔斯·黑尔坦(Charles Hertan)的《强迫棋步》,他们都认为考虑尖锐姿势中不太可能或令人惊讶的动作的重要性。Hertan甚至谈到要发展这种策略的“计算机眼”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.