Perché questa funzione di valutazione funziona in un gioco di connessione quattro in java

0

Sto esplorando come un algoritmo Minimax può essere utilizzato in un gioco Connect quattro. Stavo guardando un programma e ho trovato questa funzione di valutazione.

private static int[][] evaluationTable = {{3, 4, 5, 7, 5, 4, 3}, 
                                          {4, 6, 8, 10, 8, 6, 4},
                                          {5, 8, 11, 13, 11, 8, 5}, 
                                          {5, 8, 11, 13, 11, 8, 5},
                                          {4, 6, 8, 10, 8, 6, 4},
                                          {3, 4, 5, 7, 5, 4, 3}};

//here is where the evaluation table is called
public int evaluateContent() {
        int utility = 128;
        int sum = 0;
        for (int i = 0; i < rows; i++)
            for (int j = 0; j <columns; j++)
                if (board[i][j] == 'O')
                    sum += evaluationTable[i][j];
                else if (board[i][j] == 'X')
                    sum -= evaluationTable[i][j];
        return utility + sum;
    }

E poi un MiniMax algo viene utilizzato per valutare le possibili soluzioni.

Non sono sicuro di come / perché funzioni. Qualcuno sarebbe in grado di spiegare?

    
posta Michael James 22.11.2014 - 15:40
fonte

2 risposte

2

I numeri nella tabella indicano il numero di quattro posizioni collegate che includono lo spazio ad esempio:

  • il 3 nell'angolo in alto a sinistra è per ognuna delle linee orizzontali, verticali e diagonali di quattro che possono essere fatte con esso.
  • il 4 accanto è per due orizzontali (uno incluso nell'angolo, uno che inizia, uno verticale e uno in diagonale)

Questo dà una misura di quanto sia utile ogni quadrato per vincere la partita, quindi aiuta a decidere la strategia.

Credo che la funzione evaluateBoard restituisca un numero < 0 se

int utility = 128

è un refuso - dovrebbe essere inizializzato a 138 (poiché la somma di tutti i valori nella tabella è 276 = 2 x 138). Ciò renderebbe la funzione evaluateBoard return:

  • < 0 se il giocatore il cui segnalino è "X" è probabile che vinca (ha i posti più strategici in base alla funzione di utilità)
  • = 0 se i giocatori hanno ugualmente probabilità di vincere
  • > 0 se il giocatore il cui segnalino è "O" rischia di vincere.
risposta data 22.11.2014 - 15:51
fonte
1

Questa funzione di valutazione non è altro che la distribuzione normale gaussiana centrata attorno alla posizione media della tavola. Quello con posizioni più centrate ottiene un punteggio più alto da questa funzione eval. Se tracciate questa matrice in MATLAB, scoprirete che i valori formano una tenda e quindi danno la polarizzazione alla posizione centrale. Tuttavia, devo dire che esiste una modalità di valutazione migliore di questa in quanto esegue una valutazione totale e non esegue analisi spaziali.

score = board.longest_chain(board.get_current_player_id()) * 10
        # Prefer having your pieces in the center of the board.
        # score boost
        for row in range(6):
            for col in range(7):
                if board.get_cell(row, col) == board.get_current_player_id():
                    score -= abs(3-col)
                elif board.get_cell(row, col) == board.get_other_player_id():
                    score += abs(3-col)

Above è solo un esempio in cui applica un'idea centrata sul risultato dell'analisi spaziale ottenuta tramite longest_chain.

    
risposta data 09.10.2015 - 09:02
fonte

Leggi altre domande sui tag