Крестики-нолики альфа-бета

Пишу игру в крестики-нолики на javascript. Я закончил с графическим интерфейсом и т. Д., Но у меня все еще есть проблема с ИИ. Я использую Alpha-beta-Prune, чтобы найти выигрышный ход. Однако мой код никогда не дает ход, который может выиграть игру. Я провел много исследований, но так и не понял, что не так с моим кодом. Можете ли вы, ребята, взглянуть на мою основную часть ИИ. Моя идея - создать 2D-массив, в котором будет храниться ход: 1 - человеческий, -1 - AI, а 0 - пустой. Вызов инициализации: var test = getBestMove (-1); `

Получите лучшую функцию перемещения:

function getBestMove(player)  {

    var alpha    = -maxValue;
    var beta     =  maxValue;

    var bestScore = -maxValue;
    var bestMove  = -1;

    for (var r = 0; r < boardSize; ++r)
    {
        for (var c = 0; c < boardSize; ++c)
        {
            if (gameArray[r][c] === 0)
            {
                gameArray[r][c] = player;
                var score = alphaBeta(gameArray, alpha,beta, r * boardSize + c, player);
                gameArray[r][c] = 0;

                if (score > bestScore)
                {
                    bestScore = score;
                    bestMove = r * boardSize + c;
                }
            }
        }
    }
    console.log(bestScore);
    return bestMove;
}

альфа-бета поиск:

// 1: human
// -1: AI
// 0: empty
function alphaBeta(board, alpha, beta,lastMove, player) {    
    var bestValue;
    //check if the last move make a win
    //checkwin return the winner / 0 if no winner
    var win = checkwin(board, 
                   Math.floor(lastMove / boardSize), 
                   lastMove % boardSize);

    if (win === - 1){
        return 1000;
    }
    else if (win === 1){
        return -1000;
    }
    else if (checktie(board) === true){
        //console.log(win);
        return 0;
    }
    else{
        //return evaluation(board);
    }
    if (player === -1) 
    {
        bestValue = alpha;
        // Recurse for all children of node.
        for (var r = 0; r < boardSize; r++)
        {
            for (var c = 0; c < boardSize; c++)
            {
                if (board[r][c] === 0)
                {            
                    board[r][c] = player;
                    var childValue = alphaBeta(board, bestValue, beta,r*boardSize+c, -player);
                    board[r][c] = 0;
                    bestValue = Math.max(bestValue, childValue);
                    if (beta <= bestValue) 
                    {
                        return bestValue;
                    }
                }
            }
        }
    }
    else {
        bestValue = beta;       
        // Recurse for all children of node.
        for (var r = 0; r < boardSize; r++)
        {
            for (var c = 0; c < boardSize; c++)
            {
                if (board[r][c] === 0)
                {
                    board[r][c] = player;
                    var childValue = alphaBeta(board, alpha, bestValue,r*boardSize+c, -player);
                    board[r][c] = 0;
                    bestValue = Math.min(bestValue, childValue);
                    if (bestValue <= alpha)
                    {
                        return bestValue;
                    }
                }
            }
        }        
    }
    return bestValue;
}

Я не использовал функцию оценки, так как считаю, что альфа-бета сможет найти победу и без нее.


person Rock Rach    schedule 10.03.2015    source источник
comment
Не могли бы вы привести несколько примеров неправильных ходов?   -  person seaotternerd    schedule 11.03.2015
comment
Привет, спасибо за ответ. Трудно объяснить, что случилось, но вы можете попробовать текущую версию здесь и получить представление о neokites.com/test   -  person Rock Rach    schedule 11.03.2015


Ответы (1)


Я выясняю проблему, дело не в алгоритме, а в моей реализации: поскольку ИИ всегда делает ход за человеком, поэтому if (player === -1) bestValue = beta; и если (player === 1) bestValue = alpha;

Вторая ошибка, дочерний ход принадлежит другому игроку, поэтому: board [r] [c] = -player; везде

Вот полная версия игры: www.neokites.com/gomoku/ Надеюсь, это кому-то поможет.

person Rock Rach    schedule 19.03.2015