chessminmaxnegamax

Negamax Cut-off Return Value?


I have a problem with my Negamax algorithm and hope someone could help me.

I'm writing it in Cython

my search method is a following:

cdef _search(self, object game_state, int depth, long alpha, long beta, int max_depth):
    if depth == max_depth or game_state.is_terminated:
            value = self.evaluator.evaluate(game_state) evaluates based on current player
            return value, []

    moves = self.prepare_moves(depth, game_state) # getting moves and sorting 
    max_value = LONG_MIN

    for move in moves:
        new_board = game_state.make_move(move) 
       
        value, pv_moves = self._search(new_board, depth + 1, -beta, -alpha, max_depth, event)
        value = -value

        if max_value < value:
            max_value = value
            best_move = move
            best_pv_moves = pv_moves

        if alpha < max_value:
            alpha = max_value

        if max_value >= beta:
            return LONG_MAX, []

    best_pv_moves.insert(0, best_move)

    return alpha, best_pv_moves

In many examples you break after a cutoff is detected but when I do this the algorithm don't find the optimal solution. I'm testing against some chess puzzles and I was wondering why this is the case. If I return the maximum number after a cutoff is detected It works fine but I takes a long time (252sec for depth 6)...

Speed: Nodes pre Second : 21550.33203125

Or if you have other improvements let me know (I use transposition table, pvs and killer heuristics)


Solution

  • Turn out I used the c limits

    cdef extern from "limits.h":
        cdef long LONG_MAX
        cdef long LONG_MIN
    

    and when you try to invert LONG_MIN, with -LONG_MIN you get LONG_MIN, because of an overflow?