换位表?

时间:2013-11-15 20:13:33

标签: algorithm artificial-intelligence computer-science

我正在使用Minimax让计算机连接6.我也在使用Alpha-Beta修剪来加速算法。

我想添加一个转置表来使算法更快。我绝对没有经验。

有人可以解释换位表的基础知识,以及它们如何应用于Connect 6这样的游戏?指向有用资源的链接没问题。

我熟悉哈希表。

我找到了什么:

1)https://www.chessprogramming.org/Transposition_Table

链接给出了转置表的一个很好的解释,但完全集中在国际象棋上,因此很难弄清楚转置表如何独立于国际象棋。

2 个答案:

答案 0 :(得分:14)

首先启动minimax算法,如果天真应用,必须为将来可能遇到的每个棋盘位置计算最佳游戏(在极小极大的意义上)。 Alpha beta-pruning有助于减少不必要的计算,因为如果你知道你永远不会进行某种移动,那么你就不需要计算播放该移动的价值。

对于某些游戏,特定棋盘上的最佳游戏可以完全由该时刻的棋盘状态决定。国际象棋是这样的,所以去,其他一些游戏也是如此。关键的实现是,一旦你到达那个状态,你如何进入一个特定的游戏状态并不重要(从极小的角度来看)。

具体而言,国际象棋意义上的换位就是当你采取两种不同的动作路径从起始位置到终止位置时会发生的事情。

转置表只是让您在遇到不同播放导致电路板处于相同结束状态的情况时优化计算最佳移动。基本上,一旦您到达一个特定的板位置,您只需将最小极大值计算的结果存储在转置表中的该位置。这意味着稍后如果其他一些不同的动作列表到达同一个板上,那么突然之间你不需要完全重新计算该板上的极小极大值,因为你已经完成了这个并且你可以从中查找换位表。

因此,如果玩家可以通过多种方式玩到达相同的棋盘位置,那么如果您能够以某种方式保存该计算的结果,则不需要多次查看游戏树的那个分支。 。为了有效地执行此操作,您需要能够有效地表示电路板位置,然后具有一些数据结构,允许您在转置表中快速查找电路板位置。找到正确的表示形式将在很大程度上取决于您正在分析的游戏。

如果connect6 is this game也许一个例子是好的:

说董事会就这样开始(职位A):

X 0 
0 X

有多组动作可以帮助你(位置B):

X 0 0 0
0 X X X
0 X

说有从n位到B位的n种方法,如果你天真地这样做,你可能需要测试才能找到位置B最好的移动n次(取决于树alpha-beta的哪些分支)修剪掉)。但是,如果我们不必为B板位置多次执行完全相同的计算,那真的很棒,一旦希望足够了!

要利用这个想法,您需要做的是找到一种表示连接6板位置的方法。我们可以代表电路板的一种方法就是拥有一个N by N数组,其中N是电路板尺寸,只存储每个对应的单元格的枚举值,如果它是空的,则为{{1}在其中或其中有X。然而,这种天真的方法没有很好的查找位置的属性,因为我们总是绕过这些讨厌的0数组。更不用说必须始终存储大量这些N by N数组会占用大量内存。

因此,如果我们可以定义一个哈希函数,该函数采用N by N板并将其映射到一个几乎唯一的整数而没有大量的处理开销,那么我们可以简化这个过程。哈希董事会,看看它是否在表中应该更快这样。

因此,这就是人们尝试为他们正在分析的特定游戏制作散列函数的原因。对于连接6,我不知道最好的散列函数是什么,这是你必须解决的问题。

从这样的事情中获得最佳表现需要一大堆修补,但希望这篇文章能给你一些想法。如果您希望我扩展任何内容,请发表评论。

答案 1 :(得分:5)

This MediocreChess文章详细介绍了转置表。 Zobrist algorithm创建转置表非常简单。

zobrist系统用两个词表示:

  1. 为每一对[可能的片段,可能的单元格]生成一个随机数(比如32位)(对于它的2#9井井有条)并将它们存储在一个数组中
  2. 从hash = 0开始,并将每个[已播放的片段,播放片段的位置]存储的数字与哈希进行异或运算
  3. 你获得了Zobrist钥匙!
  4. 这是一个非常好的系统,允许删除一块!你只需要再次对同一个号码进行异或。它对negamax / alpha-beta算法非常有用,因为我们必须多次更改/恢复状态。保持Zobrist键是最新的很容易。

    换位表的系统是:

    • 对于某个游戏位置,您使用Zobrist算法生成一个哈希值,这是游戏位置的签名,您将获得一个整数(例如32位或64位)。
    • 这个" zobrist key"可以直接用于存储转置表中给定位置的最佳移动和得分。
    • 但您可能不想存储2 ^ 32或2 ^ 64个条目,因此您需要使用"哈希"为了限制换位表的输入,使用Zobrist键,对于2 ^ 16个游戏位置,我们说16位(实际上它可能> = 2 ^ 20)。要获得这个哈希值,一个简单的方法是" modulo" zobrist键,或做一个"二进制和" :

      转置表索引= zobrist_key& 0xFFFF的

    您获得0到2 ^ 16-1之间的整数,这是转置表中的索引! 当然,我们可以遇到碰撞,因此我们可以将完整的zobrist密钥存储在转置表中。

    总结一下:

    1. 对于给定的位置,计算zobrist键,然后计算zobrist键的哈希值,它将是您的换位表中的索引。让我们在此表条目中存储重要数据:score,best_move,zobrist_key,flag,depth。
    2. 当你需要在转置表中查找时,计算给定游戏位置的zobrist键,然后计算它的哈希值,并获得相应的条目。然后检查条目的zobrist键是否与你的相同,以避免"误报"的碰撞问题。
    3. 因此,对于连接6 ,您有2种石头颜色,让我们说59x59位置,因此您必须创建一个59x59x2 = 6962个随机数的数组。 要对Zobrist键中的游戏位置进行编码,请取出每块石头,并根据其颜色和位置,取出您生成的数字并将它们混合在一起。 将Zobrist密钥减少为索引(哈希,二进制"和",...),并将数据存储在转置表中的此索引处。