棋AI MiniMax算法不起作用
我在我的国际象棋AI中实现了minimax算法,我知道它不能正常工作,因为它只是一遍又一遍地来回移动。
getPieces(true)返回当前板状态下的所有白色块
getPieces(false)返回当前板状态下的所有黑块
ChessPiece.getAllPotentialMoves()非常自我解释,为特定的片断获取所有可能的移动
PieceMovements.move()将块(p)移动到位置(m - >表示移动)
PieceMovements.undo()解除了以前的移动
searchDepth是首次调用miniMax时作为深度值传递的变量,换句话说,它是您想要搜索的距离。 的原因...
if(depth == searchDepth) {
piece = p;
move = m;
}
...是要记录片断并移动。 我将这个值记录在搜索树的顶层。 块和移动代表实际的块运动算法认为是最有效的。
当调用miniMax时,它看起来像这样:miniMax(searchDepth,false)。 因为AI是黑色的,所以是最小的。
这是我的方法
public int miniMax(int depth, boolean maxi) {
if(maxi) {
if(depth == 0) return evaluateBoard();
int max = -9999; //negative infinity
for(ChessPiece p : getPieces(maxi)) for(Vector2 m : p.getAllPotentialMoves()) {
PieceMovements.move(board, p, (int)m.x, (int)m.y);
max = Math.max(max, miniMax(depth-1, !maxi));
PieceMovements.undo();
if(depth == searchDepth) {
piece = p;
move = m;
}
}
return max;
} else {
if(depth == 0) return -evaluateBoard();
int min = 9999; //positive infinity
for(ChessPiece p : getPieces(maxi)) for(Vector2 m : p.getAllPotentialMoves()) {
PieceMovements.move(board, p, (int)m.x, (int)m.y);
min = Math.min(min, miniMax(depth-1, !maxi));
PieceMovements.undo();
if(depth == searchDepth) {
piece = p;
move = m;
}
}
return min;
}
}
还有我的评价功能,它目前只是将每件作品的相关部分值加起来:
public int evaluateBoard() {
int total = 0;
for(ChessPiece[] row : board)
for(ChessPiece piece : row)
if(piece != null)
switch(piece.getPiece()) {
case WPAWN:
case BPAWN:
total += RelativePieceValues.PAWN;
//a pawn about to be promoted takes on more value
if(piece.getPosition().y == 1 || piece.getPosition().y == 6)
total += 50; //50 + 10 = 60
break;
case WKNIGHT:
case BKNIGHT:
total += RelativePieceValues.KNIGHT;
break;
case WBISHOP:
case BBISHOP:
total += RelativePieceValues.BISHOP;
break;
case WROOK:
case BROOK:
total += RelativePieceValues.ROOK;
break;
case WQUEEN:
case BQUEEN:
total += RelativePieceValues.QUEEN;
break;
case WKING:
case BKING:
total += RelativePieceValues.KING;
break;
}
return total;
}
和RelativePieceValues类:
public class RelativePieceValues{
//piece value constants
public static final int PAWN = 10;
public static final int KNIGHT = 30;
public static final int BISHOP = 30;
public static final int ROOK = 50;
public static final int QUEEN = 90;
public static final int KING = 900;
}
如果您有任何疑问,请询问。 谢谢任何回应,我一直坚持这一点。 我想知道是否实际上我的迷你最大算法或评估函数有问题,或者在我的程序中可能出现了其他问题,您不能看到。 谢谢。
链接地址: http://www.djcxy.com/p/84683.html