【问题标题】:Negamax: what to do with "partial" results after canceling a search?Negamax:取消搜索后如何处理“部分”结果?
【发布时间】:2018-02-10 17:31:40
【问题描述】:

我正在使用基于伪代码here 的 alpha/beta 转置表实现 negamax,大致采用以下算法:

NegaMax():
1. Transposition Table lookup
2. Loop through moves
  2a. **Bail if I'm out of time**
  2b. Make move, call -NegaMax, undo move
  2c. Update bestvalue, alpha/beta but if appropriate
3. Transposition table store/update
4. Return bestvalue

我也在使用迭代加深,调用 NegaMax 的深度越来越高。

我的问题是:当我确定我已经没有时间了(2a. 在移动循环的开始)时,正确的做法是什么?我是立即放弃(不更新转置表)还是只是打破循环(保存我所做的任何部分工作)?

目前,我在该点返回 null,表示搜索在“完成”该节点之前被取消(无论是通过尝试每一步还是通过 alpha/beta 切割)。 null 在堆栈中向上传播,向上传播的每个节点都通过返回来保释,因此第 3 步永远不会运行。

本质上,我只在节点“完成”时将值存储在 TT 中。我不断看到的迭代深化的场景:

  1. 我很快就能通过深度 1-5,因此 TT 的深度 = 5,类型 = 精确条目。
  2. depth = 6 搜索需要很长时间,所以我放弃了。

我最终返回转置表中的最佳着法,这是我在 depth = 5 搜索期间找到的着法。问题是,如果我开始一个新的 depth = 6 搜索,感觉就像我从头开始一样。但是,如果我保存我找到的任何部分结果,我担心我会损坏我的 TT,可能是通过用不完整的 depth = 6 条目覆盖完成的 depth = 5 条目。

【问题讨论】:

    标签: chess negamax


    【解决方案1】:

    如果搜索未完成,则分数不准确,可能不应添加到 TT。如果你在上一层有一个最好的移动并且它仍然是最好的并且分数没有显着下降,你可能会玩那个。

    另一方面,如果在深度 6 时您发现对手在 3 中拥有配偶(哎呀!)或者可以赢得您的女王,您可能需要花费更多时间来尝试解决这个问题。

    这会让你剩下的移动时间更少(如果有的话......),但时间稍微短一点可能比在剩余时间充足的情况下交配更好。 :-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 2023-02-11
      • 1970-01-01
      • 2018-08-27
      • 2020-12-26
      相关资源
      最近更新 更多