0

私の Minimax Algorithm はうまく機能します。値の階層をログに記録して確認しました。しかし、ボードを評価しようとしたイベント (最初に関数のパラメーターとして指定した深さに達したとき) は、私が行っていた方法は非効率的でした。別の方法も試しました (このテキストの下に記載します) が、今回は間違っています。

評価の最初のコードは次のとおりです(ボード全体ではなく、実行可能な潜在的な動きを評価するため、原始的な(一種の)ものだと思います):

// Here's the board with every square evaluated
const sq_val = [
    [160, -20,  20,   5,   5,  20, -20, 160],
    [-20, -40,  -5,  -5,  -5,  -5, -40, -20],
    [20,  -5,  15,   3,   3,  15,  -5,  20],
    [5,  -5,   3,   3,   3,   3,  -5,   5],
    [5,  -5,   3,   3,   3,   3,  -5,   5],
    [20,  -5,  15,   3,   3,  15,  -5,  20], 
    [-20, -40,  -5,  -5,  -5,  -5, -40, -20],   
    [160, -20,  20,   5,   5,  20, -20, 160]
]

let elementVals = (AI === "black") ? 0 : 1
if (!isMaximizing) {
    elementVals = (AI === "black") ? 1 : 0
}
const movesAvailable = checkSquaresForSides(my_game_board)[elementVals] //All the potential moves for the current player (AI if it is the maximizing player's turn, our player if not)
let bestScore = 0 // The value that we'll return

// In this code, it checks the value of every potential move and set the value of bestScore to the highest one
for (var moveMax=0;moveMax<movesAvailable.length;moveMax++) {
    const coord = movesAvailable[moveMax].coordinates
    if (coord) {
        const value = sq_val[coord[0]][coord[1]]
        bestScore += value
    }
}

// If it is the minimizing player's turn, since it's best move would be the worst case for us, get the opposite of the value
bestScore = (isMaximizing) ? bestScore : -bestScore

// Return the value
return bestScore

これが私がそれをやろうとした別の方法です:

// declare the maximizing evaluation board
const sq_val = [
    [100, -20,  20,   5,   5,  20, -20, 100],
    [-20, -40,  -5,  -5,  -5,  -5, -40, -20],
    [20,  -5,  15,   3,   3,  15,  -5,  20],
    [5,  -5,   3,   3,   3,   3,  -5,   5],
    [5,  -5,   3,   3,   3,   3,  -5,   5],
    [20,  -5,  15,   3,   3,  15,  -5,  20], 
    [-20, -40,  -5,  -5,  -5,  -5, -40, -20],   
    [100, -20,  20,   5,   5,  20, -20, 100]
]
// Get all the stones on the board (black and white seperated)
const allStonesSep = []
for (var row=0;row<8;row++) {
    for (var col=0;col<8;col++) {
        let elem = board[row][col]
        if (isMaximizing) {
            if (elem === AI) {allStonesSep.push(sq_val[row][col])}
        } else {
            if (elem !== ourPlayer) {allStonesSep.push(sq_val[row][col])}
        }

    }
}

// declare the bestScore
let bestScore = allStonesSep.reduce((a, b) => a + b, 0)

if (!isMaximizing) {
    bestScore = -bestScore
}
// Handle the value depending on the maximizing player color and the value of maximizing
// Return the value
return bestScore

Minimax Algorithm コードを入れる必要はないと思います。ただし、必要だと思われる場合は、コメントしてください。

4

0 に答える 0