Negamax:怎么做" partial"取消搜索后的结果?

时间:2018-02-10 17:31:40

标签: chess negamax

我使用基于伪代码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. 深度= 6搜索需要很长时间,所以我保释。
  3. 我最终在换位表中返回最佳移动,这是我在深度= 5搜索期间发现的移动。问题是,如果我开始一个新的深度= 6搜索,感觉就像我从头开始。但是,如果我保存了我发现的任何部分结果,我担心我会损坏我的TT,可能会覆盖已完成的深度= 5条目,但深度= 6条目不完整。

1 个答案:

答案 0 :(得分:2)

如果搜索未完成,则分数不准确,很可能不会添加到TT。如果你从前一个中获得了最好的移动,那么它仍然是最好的,并且得分没有显着下降,你可以发挥它。

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

这会让你花更少的时间进行剩下的动作(如果有的话......),但是时间稍短可能比留下足够的剩余时间更好。 : - )