我正在根据此处的伪代码使用 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-5 的深度,所以 TT 的深度 = 5,类型 = 精确条目。
- depth = 6 搜索需要很长时间,所以我放弃了。
我最终返回转置表中的最佳移动,这是我在深度 = 5 搜索期间找到的移动。问题是,如果我开始一个新的 depth = 6 搜索,感觉就像我从头开始一样。但是,如果我保存我发现的任何部分结果,我担心我会损坏我的 TT,可能是通过用不完整的深度 = 6 条目覆盖完成的深度 = 5 条目。