显而易见,黑方已在劫难逃。红方只需车四进一就可绝杀。然而我的象棋AI却走出车五平六,虽然最后依然绝杀黑棋,却绕了一大圈。
问题出在两个地方,第一个是:
function search(){
var WINVALUE = 9000;
var best = 0;
var result = 0;
while(var step = nextStep()){
var vl = alphaBeta(1,step);
if(vl >= WINVALUE){//尽可能快的完成搜索,但如果"车四进一"排在"车五平六"后,则错失最优解。
return step; //所以要想得到最优解,需要注释掉这两行代码。
}
if(vl > best){
best = vl;
result = step;
}
}
return result;
}
第二个是:
var MATE_VALUE = 10000;
function alphaBeta(depth,prevstep){
if(killValue(prevstep) > 2000){return MATE_VALUE - depth;} //(1)将帅的权值大于2000
var best = -MATE_VALUE + depth;//以前只在(1)处关联上了depth,而忘了这里,导致得不到最优解。
var val = 0;
while(var step = nextStep()){//如果将帅已无路可逃,则nextStep不会返回值。
val = alphaBeta(depth + 1,step);
if(val >= WINVALUE){
return -MATE_VALUE + depth;
}
if(val > best){
best = val;
}
}
return -best;
}
注:以上代码是简略描述,真实的方法其参数和过程要更多更复杂。