负极大值搜索作为min-max博弈算法的优化,其本质上没有任何区别。
负极大值搜索它的效率也不会快多少,只是它的代码更加优雅简洁。更好进行代码的移植。
我们将min-max博弈算法与负极大值算法的伪代码发出来比较一下。不加那个剪枝的
int MinMax(int depth) {
if (SideToMove() == WHITE) { // 白方是“最大”者
return Max(depth);
}
else { // 黑方是“最小”者
return Min(depth);
}
}
int Max(int depth) {
int best = -INFINITY;
if (depth <= 0) {
return Evaluate();
}
GenerateLegalMoves();
while (MovesLeft()) {
MakeNextMove();
val = Min(depth - 1);
UnmakeMove();
if (val > best) {
best = val;
}
}
return best;
}
int Min(int depth) {
int best = INFINITY; // 注意这里不同于“最大”算法
if (depth <= 0) {
return Evaluate();
}
GenerateLegalMoves();
while (MovesLeft()) {
MakeNextMove();
val = Max(depth - 1);
UnmakeMove();
if (val < best) { // 注意这里不同于“最大”算法
best = val;
}
}
return best;
}
上面的代码可以这样调用:
val = MinMax(5);
对比负极大值算法的伪代码是不是代码更加风骚:
要从极大极小值过渡到负极大值搜索,需要理解几个方面:
1、极大极小值对每一个点的评估都是对于电脑来说的。而负极大值是对于本层来说的。如第一层是黑棋,那么这一层的分数是对于黑棋来说的,下一层是白棋层,那么这些点的分数是对于白棋的角度来看的。
2、max(deep-1)=-min(deep-1).假设本层为黑棋层,求本层某个点对于黑棋的分数,实际是求下一层白棋对于下一点的分数的负数。
3、每一层都是选的最大值,因为这个值是当前玩家的角度对于局势的评价。
看图说话:在这个局面,下面的点的得分是白棋对于局面的评价。
那么对于黑棋来说,上面的点的得分又是多少呢?
首先对于白棋来说,其会选择对其最有利的一个点:
黑棋对其取负数,就变成了黑棋对这个局势的评价: