当前位置: 首页 > 知识库问答 >
问题:

如何使用 alpha beta 修剪实现转置表

林德华
2023-03-14

我试图在我的negamax中实现转置表。但首先我想理解伪代码中的所有思想:

' 函数 negamax(节点, 深度, α, β, 颜色) 是 alphaOrig := α

(* Transposition Table Lookup; node is the lookup key for ttEntry *)
ttEntry := transpositionTableLookup(node)
if ttEntry is valid and ttEntry.depth ≥ depth then
    if ttEntry.flag = EXACT then
        return ttEntry.value
    else if ttEntry.flag = LOWERBOUND then
        α := max(α, ttEntry.value)
    else if ttEntry.flag = UPPERBOUND then
        β := min(β, ttEntry.value)

    if α ≥ β then
        return ttEntry.value

if depth = 0 or node is a terminal node then
    return color × the heuristic value of node

childNodes := generateMoves(node)
childNodes := orderMoves(childNodes)
value := −∞
for each child in childNodes do
    value := max(value, −negamax(child, depth − 1, −β, −α, −color))
    α := max(α, value)
    if α ≥ β then
        break

(* Transposition Table Store; node is the lookup key for ttEntry *)
ttEntry.value := value
if value ≤ alphaOrig then
    ttEntry.flag := UPPERBOUND
else if value ≥ β then
    ttEntry.flag := LOWERBOUND
else
    ttEntry.flag := EXACT
ttEntry.depth := depth  
transpositionTableStore(node, ttEntry)

return value

但我想知道的一件事是旗帜是什么?喜欢精确上限下限

共有1个答案

柴嘉禧
2023-03-14

在使用alpha beta的Nagamax搜索中,您通常从无限窗口(alpha=-inf,beta=inf)开始。然后在搜索过程中,由于截止值,此窗口变窄,这导致要么提高alpha,要么降低beta。

这些标志指示您找到的节点类型。如果您在搜索窗口中找到了一个节点(alpha

你可以在这里阅读更多关于它的信息,这也是一个很好的页面,可以找到国际象棋编程所需的一切。

 类似资料:
  • 我有以下奥赛罗(reversi)游戏的阿尔法-贝塔极小值的实现。我已经修复了这个线程中的一些问题。这一次我想改进这个函数的性能。MAX_DEPTH=8需要很长的时间。在保持AI有点体面的同时,可以做些什么来加快性能? } 实用功能:

  • 我不明白为什么表条目的标志被原样使用。例如,考虑具有α-β修剪和转置表的Negamax的伪代码,并集中于TT部分。 没关系。如果条目包含确切值的下限,我们尝试从左侧缩小窗口,依此类推。 而这部分我不明白。如果值太小,为什么我们设置上限标志?值位于搜索窗口的左侧 - 它小于已知的下限 - alpha。所以看起来值应该是一个下限。 从我的测试和每个人都使用那个版本的事实来看,我肯定是错的。但我不明白为

  • 问题内容: 我有一个StringBuilder对象,需要修剪(即,从任一端删除所有空白字符/ u0020及以下)。 我似乎找不到在字符串生成器中可以做到这一点的方法。 这是我现在正在做的事情: 这恰好给出了所需的输出,但是它需要分配两个字符串,而不是一个。当字符串仍在StringBuilder中时,有没有更有效的方法来修剪字符串? 问题答案: 您不应使用deleteCharAt方法。 正如鲍里斯指

  • 问题内容: 是否有Python函数可以从字符串中修剪空白(空格和制表符)? 例如:→ 问题答案: 对于两侧的空格,请使用: 对于右侧的空格,请使用: 对于左侧的空格: 正如thedz所指出的,您可以提供一个参数来将任意字符剥离到以下任何函数中: 这将去除任何空间,,,或从左侧字符,右手侧,或该字符串的两侧。 上面的示例仅从字符串的左侧和右侧删除字符串。如果还要从字符串中间删除字符,请尝试: 那应该

  • 我得到了 致命信号11(SIGSEGV),代码1,tid 5823中的故障地址0x 5(e . mypc . video cut) 当我试着调试应用程序时,当我读到这一行时崩溃了: 视频修剪屏幕:

  • 问题内容: 是否有Python函数可以从字符串中修剪空格(空格和制表符)? 例如: 问题答案: 两侧的空格: 右侧的空格: 左侧的空白: 正如thedz所指出的,你可以提供一个参数来将任意字符剥离到以下任何函数中: 这将去除任何空间,,或从左侧字符,右手侧,或该字符串的两侧。 上面的示例仅从字符串的左侧和右侧删除字符串。如果还要从字符串中间删除字符,请尝试: 那应该打印出来: