Таблицы транспонирования и сокращение альфа-бета

У меня возникла следующая проблема. Я реализовал таблицы транспонирования, которые, кажется, работают хорошо или, по крайней мере, я не вижу, что они не работают.

Кроме того, я хотел реализовать некоторый порядок перемещения.

По сути, я сначала ищу ход, сохраненный в моей таблице транспонирования. По какой-то причине это совсем не улучшает поиск. Либо я неправильно реализовал порядок перемещения, либо моя реализация альфа-бета-алгоритма вместе с таблицами транспонирования просто неверна.

Чтобы измерить производительность, я подсчитал количество узлов, посещенных во время поиска. Моя реализация порядка перемещения не имела никакого эффекта.

Вот Java-код, который я придумал:

public  int alphabeta(final CheckerBoard board,int alpha,int beta,int depth,boolean nullMoveAvailable){
  nodeCount++;

 int alphaOrig=alpha;
    Transposition entry =table.find(board.key);
    if(entry!=null && entry.depth>=depth){
        if(entry.flag==Transposition.EXACT){
            return entry.value;
        }else if(entry.flag==Transposition.UPPER){
            beta = Math.min(beta,entry.value);
        }else if(entry.flag == Transposition.LOWER){
            alpha =Math.max(alpha,entry.value);
        }
        if(alpha>=beta){
            return entry.value;
        }
    }

    if(depth==0 || board.isTerminalState()){
        return quiesceneSearch2(board,alpha,beta);
    }

ArrayList<Move>sucessors =MGenerator.getMoves(board);
Move currentBest =null;
for( int i=0;i<sucessors.size();i++){
        if(entry!=null && entry.depth<depth && (entry.flag == Transposition.UPPER || entry.flag == Transposition.EXACT) &&  sucessors.get(i).equals(entry.best)){
          Collections.swap(sucessors,0,i);
            break;
        }
    }

    int bestValue =Integer.MIN_VALUE;
    for(Move  move : sucessors){
        board.makeMove(move);
        int value =-alphabeta(board, -beta, -alpha, depth - 1, true);
        board.undoMove(move);
        if(value>bestValue){
            bestValue =value;
            currentBest = move;
        }
        alpha =Math.max(alpha,value);
        if(alpha>=beta){
            break;
        }
    }

    Transposition next =new Transposition();
    next.depth=depth;
    next.value =bestValue;
    next.zobrisKey=board.key;
    next.best = currentBest;
    if(bestValue<=alphaOrig){
        next.flag =Transposition.UPPER;
    }else if(bestValue>=beta){
        next.flag = Transposition.LOWER ;
    }else{
        next.flag = Transposition.EXACT;

    }
    table.insert(next);

    return alpha;
}

и следующий код для начала поиска:

    public int findBestMove(int depth){
    if (table != null) {
        table.clear();
    }
    ArrayList<Move> sucessors =MGenerator.getMoves(board);
    int max = Integer.MIN_VALUE;
    for(Move m : sucessors){
        board.makeMove(m);
        int value =-alphabeta(board, -1000000, 1000000, depth, true);
        board.undoMove(m);
        if(value>max){
            max=value;
            bestMove=m;
        }
    }

    board.makeMove(bestMove);
    return max;
}

Был бы признателен, если бы кто-нибудь посмотрел мой код. Может быть, в этой части моего кода нет ничего плохого, но я не хотел публиковать все, так как кода уже довольно много, на который нужно смотреть.


person Peng1993    schedule 07.06.2016    source источник


Ответы (1)


Я вижу пару вещей "неправильными" по сравнению с этим справочным сайтом по алфавиту: https://web.archive.org/web/20071031100051/http://www.brucemo.com/compchess/programming/hashing.htm

1) Вы не сохраняете записи транспонирования для глубины 0; а также

2) Вы сохраняете значение транспонирования альфа вместо бета, когда альфа> = бета.

Не знаю, будет ли это иметь значение, но...

И, о, 3) Вы также возвращаете альфа вместо бета из функции, когда альфа>=бета.

person Jeff Y    schedule 07.06.2016