国际象棋AI如何确定其中任何一个球员是否可以申请平局?

时间:2015-07-17 17:59:35

标签: algorithm optimization artificial-intelligence chess minimax

我正在试验国际象棋AI,目前正试图实现对抽签的可能性的检测。

如果出现以下情况,玩家可以申请平局:

  1. 每位玩家在过去的五十步中都没有捕捉或典当行动。
  2. 同样的董事会职位已经发生过三次。
  3. 因此,程序必须存储先前位置的历史记录才能验证这些条件。在人类玩家宣称平局的情况下,这是可以的。但AI正在评估数百万个职位。因此,一方面它应该能够检测到这种声明的可能性本身或由对手x前进以便能够阻止它处于获胜位置或试图在失败位置强制执行它。另一方面,由于在深度搜索期间创建的历史表的所有副本,此验证可能导致性能的巨大损失。

    是否有此类功能的标准实施/优化?

    注意:如果答案是特定于实现的,那么我的AI是基于alpha-beta修剪的极小极大变体。

3 个答案:

答案 0 :(得分:1)

对于第1项,标准解决方案是将计数器存储在当前状态;每次有典当移动或捕获时,计数器重置为0,每次没有时加1,并在每次移动时检查是否大于50。

对于第2项,某些程序会在每次移动时跟踪和检查,但是如您所述,这会花费时间和空间。因此,许多程序只跟踪过去的动作,并忽略了在游戏树中向前看三次重复绘制的可能性。另一种可能性是跟踪已经发生的任何重复位置,并仅检查前瞻位置是否与其中一个位置相同。

答案 1 :(得分:1)

对于第1项,我建议每当发生捕获/ pawn移动时重置一个计数器。 (如前所述)

对于第2项,我建议在你的Board类中使用Zobrist Hashes数组,在那里你可以跟踪已经出现的位置。如果找到这样的位置(当前zobrist == [遍历所有变异zobrists]],则将相应的计数器加1。 如果计数器达到3,则其draw =>将0作为位置值返回。

这个方法在运行时会很快运行,因为你可以比较obly~50个最大值。我已经有了tts / hashtables,它很容易实现,因为你已经拥有了zobrist代码的代码。

[编辑]: 顺便说一句,这些不是唯一的吸引力,见“僵局”。

答案 2 :(得分:0)

国际象棋程序无论如何都要跟踪相同的位置以避免评估成本 - e4e5,g4与g4e5,e4的位置相同,因此具有相同的值,完全避免了评估后者的成本。你所做的只是跟踪位置产生的移动次数,如果它与至少两次移动不同,你会做一些特殊的案例处理。