我尝试使用转置表来实现alpha-beta min-max prunning增强功能。我使用这个伪代码作为参考:
http://people.csail.mit.edu/plaat/mtdf.html#abmem
function AlphaBetaWithMemory(n : node_type; alpha , beta , d : integer) : integer;
if retrieve(n) == OK then /* Transposition table lookup */
if n.lowerbound >= beta then return n.lowerbound;
if n.upperbound <= alpha then return n.upperbound;
alpha := max(alpha, n.lowerbound);
beta := min(beta, n.upperbound);
if d == 0 then g := evaluate(n); /* leaf node */
else if n == MAXNODE then
g := -INFINITY; a := alpha; /* save original alpha value */
c := firstchild(n);
while (g < beta) and (c != NOCHILD) do
g := max(g, AlphaBetaWithMemory(c, a, beta, d - 1));
a := max(a, g);
c := nextbrother(c);
else /* n is a MINNODE */
g := +INFINITY; b := beta; /* save original beta value */
c := firstchild(n);
while (g > alpha) and (c != NOCHILD) do
g := min(g, AlphaBetaWithMemory(c, alpha, b, d - 1));
b := min(b, g);
c := nextbrother(c);
if g <= alpha then
n.upperbound := g;
store n.upperbound;
if g > alpha and g < beta then
n.lowerbound := g;
n.upperbound := g;
store n.lowerbound, n.upperbound;
if g >= beta then
n.lowerbound := g;
store n.lowerbound;
return g;
该算法有三个问题:
我相信我应该存储每个保存的转置表条目的深度(=叶级别的距离),并且仅当entry.depth&gt; = currentDepth(=条目离叶级别更远或更远时)才使用条目。这没有在上面的伪代码中显示,也没有在那里讨论,我想确保我理解正确。
我想为每个位置存储最佳移动以将其用于移动排序并在搜索停止后提取最佳移动。在纯粹的最小 - 最大值中,明显哪个移动是最好的,但是当使用alpha-beta截止值进行迭代时哪个移动最好?我可以假设给定位置的最佳移动是当循环结束时(截止或没有)时发现的最佳移动吗?
在迭代深化方案中执行此算法时 - 我应该在每次深度增加之前清除换位表吗?我想不是,我喜欢使用前一次迭代中的存储位置,但我不确定这些信息是否足以进行更深入的搜索(应该在检查表格入口深度时)?