Advertisement
max2201111

very good minimax depth position count with depths count

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