Advertisement
max2201111

very good minimax depth with memo and depth2 print last

May 1st, 2024
677
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.54 KB | Science | 0 0
  1. import chess
  2.  
  3. def simplify_fen_string(fen):
  4.     parts = fen.split(' ')
  5.     simplified_fen = ' '.join(parts[:4])  # Zachováváme informace o pozici, hráči na tahu, rošádách a en passant
  6.     return simplified_fen
  7.  
  8. def minimax(board, depth, alpha, beta, maximizing_player, depth2, depths, position_count, memo):
  9.     position_count[0] += 1  # Přidáváme počet prozkoumaných pozic
  10.     if position_count[0] % 1000000 == 0:  # Každých 1 000 000 pozic
  11.         print(f"Prozkoumano {position_count[0]} pozic.")
  12.    
  13. #     if depth2 not in depths:  # Přidáváme hloubku do seznamu, pokud tam není
  14. #         depths.append(depth2)
  15. #         print(f"Hloubka rekurze: {depth2}")
  16.  
  17.     key = (board.fen(), maximizing_player, depth, alpha, beta)
  18.     if key in memo:
  19.         return memo[key]
  20.  
  21.     if depth == 0 or board.is_game_over():
  22.         eval = evaluate_board(board, depth2)
  23.         memo[key] = (None, eval)
  24.         return None, eval
  25.    
  26.     best_move = None
  27.    
  28.     if maximizing_player:
  29.         max_eval = float('-inf')
  30.         for move in board.legal_moves:
  31.             board.push(move)
  32.             _, eval = minimax(board, depth - 1, alpha, beta, False, depth2 + 1, depths, position_count, memo)
  33.             board.pop()
  34.             if eval > max_eval:
  35.                 max_eval = eval
  36.                 best_move = move
  37.             alpha = max(alpha, eval)
  38.             if beta <= alpha:
  39.                 break
  40.         memo[key] = (best_move, max_eval)
  41.        
  42.         if depth2 not in depths:
  43.             depths.append(depth2)  # Přidáváme hloubku do seznamu, pokud je následující v pořadí
  44.             print(f"Hloubka rekurze: {depth2}")  # Vytiskne aktuální hloubku rekurze pouze pokud byla přidána
  45.        
  46.      
  47.         return best_move, max_eval
  48.     else:
  49.         min_eval = float('inf')
  50.         for move in board.legal_moves:
  51.             board.push(move)
  52.             _, eval = minimax(board, depth - 1, alpha, beta, True, depth2 + 1, depths, position_count, memo)
  53.             board.pop()
  54.             if eval < min_eval:
  55.                 min_eval = eval
  56.                 best_move = move
  57.             beta = min(beta, eval)
  58.             if beta <= alpha:
  59.                 break
  60.         memo[key] = (best_move, min_eval)
  61.        
  62.         if depth2 not in depths:
  63.             depths.append(depth2)  # Přidáváme hloubku do seznamu, pokud je následující v pořadí
  64.             print(f"Hloubka rekurze: {depth2}")  # Vytiskne aktuální hloubku rekurze pouze pokud byla přidána
  65.        
  66.  
  67.        
  68.         return best_move, min_eval
  69.  
  70. def evaluate_board(board, depth):
  71.     if board.is_checkmate():
  72.         return -1000 + depth if board.turn == chess.WHITE else 1000 - depth
  73.     elif board.is_stalemate() or board.is_insufficient_material() or board.can_claim_fifty_moves():
  74.         return 0
  75.     return 0
  76.  
  77. # Nastavení startovní pozice
  78. start_fen = "8/4Q1K1/8/8/3k4/8/2q5/8 w - - 0 1"
  79. board = chess.Board(start_fen)
  80.  
  81. # Inicializace seznamu pro sledování hloubek, proměnné pro počet pozic, a memoizačního slovníku
  82. depths = []
  83. position_count = [0]  # Pole, které umožňuje sledování počtu volání
  84. memo = {}
  85.  
  86. # Spuštění minimaxu s maximální hloubkou 52
  87. best_move, best_score = minimax(board, 52, float('-inf'), float('inf'), True, 0, depths, position_count, memo)
  88. if best_move:
  89.     move_san = board.san(best_move)
  90.     print(f"Nejlepší tah z pozice {start_fen} je {move_san} s hodnocením {best_score}.")
  91. else:
  92.     print("Nebyl nalezen žádný tah, nebo je hra u konce. Skóre: ", best_score)
  93.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement