====== Chess - Programming - Evaluation ====== A requirement is to calculate the value of the board depending on the placement of pieces on the board. * This function is often known as Evaluation Function. * It is sometimes also called Heuristic Function. The evaluation function is unique for every type of game. The evaluation function is combined with the minimax function or alpha-beta pruning function and so on. ---- [[Chess:Programming:Evaluation:Tests|Tests]] ---- ===== Finding the Best Move ===== Evaluate all the available moves using minimax() or alpha-beta pruning() or similar. Then returns the best move the maximizer can make. function findBestMove(board): bestMove = NULL for each move in board : if current move is better than bestMove bestMove = current move return bestMove ---- ===== Checking for GameOver state ===== To check whether the game is over and to make sure there are no moves left. function isMovesLeft(board): for each cell in board: if current cell is empty: return true return false ---- ===== Considering Depth ===== Occasionally an evaluation function will return the identical value for two possible moves. * But one of these moves may result in a slower victory or a faster loss: * Move A could win in 2 moves. * Move B could win in 4 moves. Even though both moves evaluate to the same score, it is usually better to select the quicker move, i.e. in this case Move A. * To overcome this problem the depth value is subtracted from the evaluated score. * This means that in case of a victory it will choose a the victory which takes less number of moves. * In the case of a loss it will try to prolong the game and play as many moves as possible. So the new evaluated value will be: * Move A will have a value of +10 – 2 = 8 * Move B will have a value of +10 – 4 = 6 Since move A has a higher score compared to move B means select move A over move B. * The same thing must be applied to the minimizer. * Instead of subtracting the depth value, it is added as the minimizer always tries to get as negative a value as possible. * We can subtract the depth either inside the evaluation function or outside it. if maximizer has won: return WIN_SCORE – depth else if minimizer has won: return LOOSE_SCORE + depth ---- Consider both hits and misses: * evalHashHits * evalHashMiss * pawnHashHits * pawnHashMiss ---- Eval is adjusted towards 0 if a draw is likely. Pawns are valued slightly less but becomes a bit more valuable in endings. Rook & Queen on 7th rank only awarded if enemy king on 8th or enemy pawns still on 7th.