Alpha Beta修剪打破Minimax
所以我实现了我的基于国际象棋的益智游戏的极大极小搜索。 在这种情况下,搜索确定AI片段的下一步移动。
在它自己的作品上的极小值很好,它会返回预期的移动,但是当我执行alpha beta修剪时,极小极值每回合会为每一块返回相同的两个值。 例如,目前在(0,0)处的AI Rook可能会收到(1,0),因为它正在从最小极大值移动,并且下一次它询问极小极大值时它将接收(0,0)。 不管我在评估函数中改变了什么,都会发生这个循环。
游戏状态由用户的位置,棋子的位置和表示棋盘本身的棋盘阵列组成。 我在这里使用我自己的节点类(实际上应该称为Pair),以便将评估函数给出的各个值分别存储到每个Tile中。
我是如何实施Alpha测试修剪的吗? 任何意见是极大的赞赏。 如果需要更多信息,请提问并提供我所能提供的信息。
//Here is my call to the minimax
Min(depth, user, piece, new Node((int) (Double.NEGATIVE_INFINITY)), new Node((int) Double.POSITIVE_INFINITY), tiles));
Node Max(int depth, Piece user, Piece piece, Node alpha, Node beta, Tile[][] tiles)
{
if(depth <= 0||gameOver(piece))
{
return new Node(evaluation(user,piece,tiles));
}
LinkedList<Tile> moves = user.getMoves(tiles,1);
for(Tile t:moves)
{
Tile temp= new Tile(user);
tiles= user.changePos(t,tiles);
Node val = Min(depth - 1, user, piece, alpha, beta, tiles);
val.addTile(t);
tiles= user.changePos(temp,tiles);
if(val.getValue()>=beta.getValue())
return beta;
if(val.getValue() >= alpha.getValue())
{
if(alpha.getTile()==null)
alpha = val;
else if(val.getValue()==alpha.getValue()){
if(r.nextInt(2)==1)//adds an element of randomness
alpha=val;
}
else
alpha=val;
}
}
return alpha;
}
Node Min(int depth, Piece user, Piece piece, Node alpha, Node beta, Tile[][] tiles)
{
updateGoal(user);
if(depth <= 0||gameOver(piece))
{
return new Node(evaluation(user,piece,tiles));
}
LinkedList<Tile> moves = piece.getMoves(tiles,1);
for(Tile t:moves)
{
Tile temp= new Tile(piece);
tiles= piece.changePos(t,tiles);
Node val = Max(depth - 1, user, piece, alpha, beta,tiles);
val.addTile(t);
tiles= piece.changePos(temp,tiles);
if(val.getValue() <= alpha.getValue())
return alpha;
if(val.getValue() <= beta.getValue())
{
if(beta.getTile()==null)
beta = val;
else if(val.getValue()==beta.getValue()){
if(r.nextInt(2)==1)
beta=val;
}
else
beta=val;
}
}
return beta;
}
链接地址: http://www.djcxy.com/p/56343.html
上一篇: Alpha Beta Pruning Breaking Minimax
下一篇: minimax algorithm returning different value with alpha beta pruning