我想知道的是如何对引擎进行编程以查找运动。我确定他们首先会计算出最强制的行,例如捕获和检查。但是,微妙而深入的位置移动又如何呢?他们似乎也很快找到了它们(通常来说。当然,他们偶尔会错过这样的举动)。像这样,他们如何编程以寻找安静的动作/位置思想?他们不能仅仅强行采取任何行动,因为那会花费太长时间,因此应该有一些聪明的方法让他们真正迅速地达到最佳行动。我对了解这一点很感兴趣,因为我认为这也会帮助玩家思考现实世界中的棋盘。
我想知道的是如何对引擎进行编程以查找运动。我确定他们首先会计算出最强制的行,例如捕获和检查。但是,微妙而深入的位置移动又如何呢?他们似乎也很快找到了它们(通常来说。当然,他们偶尔会错过这样的举动)。像这样,他们如何编程以寻找安静的动作/位置思想?他们不能仅仅强行采取任何行动,因为那会花费太长时间,因此应该有一些聪明的方法让他们真正迅速地达到最佳行动。我对了解这一点很感兴趣,因为我认为这也会帮助玩家思考现实世界中的棋盘。
Answers:
通常,国际象棋引擎使用决策树。树的根是当前位置,并且每个位置都有一个子节点,可以通过合法移动来建立子节点。这些节点中的每个节点都有一个子节点,用于通过从其合法移动可以到达的位置。引擎将树推送到由其功能和“思考”时间定义的深度。可以简单地交叉引用可以以多种方式到达的位置,因此不必考虑多个位置。一旦创建了树,计算机就会使用一组加权规则来分析树中的最终位置,并开始删除那些不需要的或对手可以阻止其到达的位置。以这种方式砍伐这棵树,直到只剩下一招,然后计算机执行该举动。
http://www.chess.com/blog/zaifrun提供了有关创建国际象棋引擎的系列或文章,如果您想更深入地了解它们的工作原理。
您在问一个非常复杂的问题,但是回到基础知识是件好事。有两个概念需要考虑:
如果显示(真实)玩家某个位置并询问“谁在这场比赛中获胜?”,他们将如何决定?他们很可能会检查一些基本的东西,例如:材质差异,零件的开发程度或“良好”定位,翻倍/隔离/连接/通过的棋子,(受控的)打开文件,距离多远在棋子上。
现在,如果需要的话,您可以根据上述方法,系统地计算排名得分。例如,您可以确定棋子的价值为1分,而经过的棋子的价值为0.3分多。孤立的或加倍的典当值可能会少一些,等等。如果将所有内容加起来,您将获得当前位置的估计值。
这称为评估,基本上所有国际象棋程序都具有一种评估位置的方法(忽略了通常非常薄弱的新颖AI国际象棋引擎)。
但是,微妙而深入的位置移动又如何呢?
好吧,我们只是勉强摸索了位置评估的表面。评估功能的实际实现可能是简单的,以允许每秒评估更多职位(尽管以粗略方式),或者更复杂,从而导致评估的职位更少,但置信度更高。评估功能通常会考虑成百上千的独立信息。
我从上面特别遗漏了一些东西,大多数真正的玩家会立即考虑-有什么方法可以让双方立即赢得比赛吗?有没有可见的搭档或“悬挂”件?尽管将其琐碎化很容易,但除琐碎琐事外,别无其他。
这是什么意思的球员有充分的信心相结合?最后,归结为已经计算了所有选项。真正的玩家通常不会这样做(除了琐碎的或非常强迫的队友),在大多数情况下,我们只会考虑少数选择,并排除其他似乎“无建设性”或明显导致亏损的选择。在计算过程中,我们经常会犯错误,例如,我们可能会意识到移动指令的更改会使威胁消失。等等。关键是要完全确定一个组合,实际上您需要一直计算得出其结论,并假设每个玩家只会向他们提供最好的移动(这称为“最小/最大”)。
现在,由于国际象棋的搜索空间(这是“未来所有可能的移动”所指的空间)要比计算机可以计算的空间大得多,因此需要做出折衷。就像人类一样,计算机可以根据某些标准决定不考虑整个思路。这就是所谓的启发式。值得一提的是,虽然只有通过蛮力才能真正确定一个组合,但是复杂的评估功能通常可以检测到威胁的存在(例如,我们可以计算叉,串机会等,以指导该方向的搜索) )。
最后,尽管计算机速度极快,但启发式技术使它们能够进行如此深入的计算。话虽如此,您可能会惊讶于现代引擎如何全面计算,即使在快速游戏中,通常也超过了3个动作。
因此,总而言之-评估功能内置许多智能功能(例如,评估功能所考虑的因素比普通玩家要多),启发式技术可以使计算机消除其认为可能结局不佳的想法,而且计算机速度非常快。加上它们,它们很难被击败。
我同意答案。
我记得通用(Roman Dzindzichashvili)总经理在罗马的一个实验室视频中谈论它,我不记得它是什么视频(如果有人知道细节,请编辑我的答案)。
罗曼说,弗里茨发动机的开发商是他的朋友。因此,罗曼(Roman)对弗里茨(Fritz)进行了测试,看它有多好,开发人员告诉罗曼(Roman),为了让弗里茨做出复杂的决定(例如,牺牲材料以换取位置优势),他们必须改变零件的价值,例如告诉程序一个坏的主教值得一分,在对角线上的主教值得七分,骑士在近身位置值得五分...
我不知道每个零件的确切数字,但是这就是它的工作方式,现在您的引擎在牺牲一个糟糕的主教身上没有任何问题,或者您可以告诉他每个位置的价值。
编辑
另请参阅国际象棋编程维基。
计算机不可能看起来足够深(25层或更多)并检查所有可能的移动。
使得成为可能的是称为Alpha-beta修剪的技术,这意味着与人类相似(但更好)的计算机仅遵循有希望的延续。
他们不断评估位置(基于一些预先编码的规则,评估材料,国王安全,活动,当兵结构等),并研究可能导致其走向最佳位置的变化。
他们如何有效地做到足以在一秒钟内评估数百万个这样的职位,仍然接近魔术。
因此,总而言之,您是正确的,如果他们下战略棋,他们不会看所有举动,但是他们可以非常迅速地看一下体面的举动。问题仍然在于他们可以看到的长期计划和视野,但这正在研究中(Rybka的分析速度要慢得多,但是下棋更多,而Houdini则很浪漫,因为他的“机械心脏”计算了更多的动作并更具攻击性)。甚至计算机都有自己的风格!
Alpha-beta修剪只是意味着,如果您发现一条对您不利的行,您将不再关注该候选移动,而尝试其他移动。这是一种向后修剪,意味着您永远不会错过一个好的举动。相比之下,正向修剪更多地基于猜测。徒劳的修剪,后期裁员和剃刀都是正向修剪的类型,所有这些都取决于程序员对哪种类型的裁员的感觉。一个进行大量前期修剪的程序可能会错过导致交配的惊人牺牲,但另一方面,它消除了很多非常糟糕的举动,因此可以更深入地研究它喜欢的举动。
大多数引擎会全盘搜索前几步动作,并检查所有可能性。如果没有任何举动失败过高(即显然比您已经考虑过的举动更糟),则将搜索范围扩大一点。通常,您将继续探索每条线,直到到达静止位置(不进行检查,捕获,配合威胁等),然后进行评估。安静的动作在搜索树中很深时可能不会考虑,但是一旦您到达游戏中的实际位置,引擎就会查看所有动作,无论安静还是尖锐。实际上,有时在引擎输出中会看到这种情况,这是因为引擎突然偏向于未考虑向后移动的移动。
引擎计算速度如此之快,以至于对于他们而言,考虑首先要看哪个动作并不重要,但是对于人类来说,这是一个关键问题。乔纳森·提斯达尔(Jonathan Tisdall)在他的书《立即改善国际象棋》中回答了这个问题。当您受到攻击时,他建议您先看看最猛烈的动作。当您进行防守时,您首先要看最困难的路线。他在决定先看哪个动作时还引用了经验法则(例如集中化,协调性)。
其他可能相关的书是伊曼纽尔·内曼(Emmanuel Neimann)的《无形棋步》和查尔斯·黑尔坦(Charles Hertan)的《强迫棋步》,他们都认为考虑尖锐姿势中不太可能或令人惊讶的动作的重要性。Hertan甚至谈到要发展这种策略的“计算机眼”。