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