четыре подключения ай альфа бета минмакс

Здравствуйте, во-первых, у меня очень хороший английский, так что извините, если что-то непонятно. Я написал алгоритм MinMax для крестиков-ноликов, и он отлично работал. Итак, я попробовал алгоритм MinMax для четырех подключений, к сожалению, он не работает так, как я хочу. Затем я нашел в гугле альфа-бету MinMax, и когда я, наконец, понял это, я попробовал, но это была катастрофа ^^. Вот мой MinMax, что я сделал для 4 коннекта, может кто-нибудь дать мне совет, как мне реализовать альфа и бета?

private int computerzug(Color[][] board, int depth, Color spielerFarbe) 
{

    if(getGameLogic().hasWon(board, spielerFarbe))
    {
        System.out.println("hy");
        return -10 -depth;
    }
    if(getGameLogic().hasDraw(board))
    {
        return 0;
    }
    if(depth==6)
    {
        return 0;
    }
    int max = Integer.MIN_VALUE;
    int index = 0;
    for(int i =0;i<board[0].length;i++)
    {
        if(board[0][i].equals(Color.WHITE))
        {
            Color[][] board1 = new Color[board.length][board[0].length];
            board1 = copy(board);
            board1[getRow(board, i)][i] = spielerFarbe;
            int moval = -computerzug(board1, depth+1, (spielerFarbe.equals(Color.BLUE)?Color.RED:Color.BLUE));
            if(moval> max)
            {
                max = moval;
                index = i;
            }
        }
    }
    if(depth==0)
    {
        col = index;
        row = getRow(this.board, index);
    }
    return max;
}   

Я работаю с 2D-массивами цветов для имитации платы.


person Philipp Schweizer    schedule 26.03.2017    source источник
comment
Я также ценю некоторые общие советы по Java или алгоритму :) Я всегда готов узнать что-то новое.   -  person Philipp Schweizer    schedule 26.03.2017


Ответы (1)


Предполагая, что ваш код работает для минимакса, вариант альфа-бета должен выглядеть так (я не смог его протестировать):

private int computerzug(Color[][] board, int depth, Color spielerFarbe, int alpha, int beta) 
{

    if(getGameLogic().hasWon(board, spielerFarbe))
    {
        System.out.println("hy");
        return -10 -depth;
    }
    if(getGameLogic().hasDraw(board))
    {
        return 0;
    }
    if(depth==6)
    {
        return 0;
    }
    int max = Integer.MIN_VALUE;
    int index = 0;
    for(int i =0;i<board[0].length;i++)
    {
        if(board[0][i].equals(Color.WHITE))
        {
            Color[][] board1 = new Color[board.length][board[0].length];
            board1 = copy(board);
            board1[getRow(board, i)][i] = spielerFarbe;
            int moval = -computerzug(board1, depth+1, (spielerFarbe.equals(Color.BLUE)?Color.RED:Color.BLUE), -beta, -alpha);
            if( moval >= beta )
                return moval;  // fail-soft beta-cutoff
            if( moval > max ) {
                max = moval;
                index = i;
                if( moval > alpha )
                    alpha = moval;
            }           
        }
    }
    if(depth==0)
    {
        col = index;
        row = getRow(this.board, index);
    }
    return max;
} 

для начального вызова вы используете очень высокое значение для альфа и очень низкое (отрицательное) значение для бета

person ZzetT    schedule 24.05.2017