findCompMove操作希望得到返回值中的极大值,而findHumanMove操作返回极小值。将findCompMove操作得到的尝试性的极大值(α)传给findHumanMove,如果findHumanMove尝试性的极小值(β)小于这个极大值,则立马返回,无需尝试后面的情况。此为α裁剪,对称情况即为β裁剪。尝试性的意思是指目前已经得到的极大值或者极小值。α-β裁剪能显著的改进搜索的范围。
代码如下,与不进行α-β裁剪相比只添加几行代码。
主例程调用时alpha=COMP_LOSS,beta=COMP_WIN。
int TicTacToe::findCompMove(int & bestMove,int alpha,int beta)
{
int i,responseValue;
int dc; //do not care
int value;
if(fullBoard())
value=DRAW;
else
{
if(immediateWin(bestMove, COMP))
return COMP_WIN;
else
{
value=alpha;bestMove=1;
for(i=1;i<=9&&value<beta;++i)//尝试性极小值beta,如果尝试性极大值大于这个值,立马返回
{
if(isEmpty(i))
{
place(i, COMP);
responseValue=findHumanMove(dc,value,beta);
unplace(i);
if(responseValue>value)
{
value=responseValue;
bestMove=i;
}
}
}
}
}
return value;
}
int TicTacToe::findHumanMove(int & bestMove,int alpha,int beta)
{
int i,responseValue;
int dc;
int value;
if(fullBoard())
value=DRAW;
else
{
if(immediateWin(bestMove, HUMAN))
return COMP_LOSS;
else
{
value=beta;bestMove=1;
for(i=1;i<=9&&value>alpha;++i) //尝试性极大值alpha,如果尝试性极小值低于这个值,立马返回
{
if(isEmpty(i))
{
place(i, HUMAN);
responseValue=findCompMove(dc,alpha,value);
unplace(i);
if(responseValue<value)
{
value=responseValue;
bestMove=i;
}
}
}
}
}
return value;
}