我使用基于伪代码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中存储值。我一直看到迭代加深的情景:
我最终在换位表中返回最佳移动,这是我在深度= 5搜索期间发现的移动。问题是,如果我开始一个新的深度= 6搜索,感觉就像我从头开始。但是,如果我保存了我发现的任何部分结果,我担心我会损坏我的TT,可能会覆盖已完成的深度= 5条目,但深度= 6条目不完整。
答案 0 :(得分:2)
如果搜索未完成,则分数不准确,很可能不会添加到TT。如果你从前一个和中获得了最好的移动,那么它仍然是最好的,并且得分没有显着下降,你可以发挥它。
另一方面,如果在深度6你发现对手有3个配偶(哎呀!)或者可能赢得你的女王,你可能需要花更多的时间来解决这个问题。
这会让你花更少的时间进行剩下的动作(如果有的话......),但是时间稍短可能比留下足够的剩余时间更好。 : - )