主变量导向搜索pvs(PrincipalVariationSearch)又称最小窗口搜索(minimal window search),是alpha-beta pruning的一个变种,其区别在于除主变量节点外的其他所有节点都用一个零窗口(alpha,beta)且alpha=beta 进行搜索,其理念是对浅层的节点进行整理使其基本有序,并假设第一个节点是最好的,做为主变量,进行全窗口搜索。通过零窗口搜索其他节点,判断是否存在这些节点是否比当前最优值要好。假如符合alpha-beta剪枝则进行剪枝,假如高值失败则证明当初的节点不是主变量,对当前节点重新进行一次全窗口搜索,作为新的主变量。例如对于一个(alpha,alpha+1)的零窗口,假设返回的值为alpha+1,这说明该节点存在比alpha要大的值,因此需要对其进行一次重新搜索,这次就会得到一个比alpha大的值,去更新alpha的值,假如alpha>beta则进行剪枝。假如返回值<=alpha,则说明该节点的价值较低,可以忽略。
算法通过使用小窗口,增加了剪枝率,提高了alphabeta剪枝的效率,但当节点以随机排序时,其效率可能会比alphabeta剪枝要低。零窗口也被用到了MTD-f算法中。
下面是伪代码
pvs(node, depth, alpha, beta, player)
if (depth = 0)
return valuation(player)
else
if (player = maxplayer)
for each child of node
if child is first child
value := pvs(child, depth-1, alpha, beta, minplayer)
else
value := pvs(child, depth-1, alpha, alpha+1, minplayer)
if alpha <value< beta
value := pvs(child, depth-1, value, beta, minplayer)
if (value >alpha)alpha:=value
if (alpha >=beta)break
return alpha
else
for each child of node
if child is first child
value := pvs(child, depth-1, alpha, beta, maxplayer)
else
value := pvs(child, depth-1, beta-1, beta, maxplayer)
if alpha < value < beta
value := pvs(child,depth-1,alpha,value,maxplayer)
if(value<beta)beta:=value
if (alpha >= beta)break
return alpha