Advertisement
max2201111

petr hloubka rekurze vez

May 3rd, 2024
780
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.23 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.     key = (board.fen(), maximizing_player, depth)  # Odstraněny alpha a beta z klíče pro jednodušší ukládání výsledků
  14.     if key in memo:
  15.         return memo[key]
  16.  
  17.     if depth == 0 or board.is_game_over():
  18.         eval = evaluate_board(board, depth2)
  19.         memo[key] = (None, eval)
  20.         return None, eval
  21.    
  22.     best_move = None
  23.     if maximizing_player:
  24.         max_eval = float('-inf')
  25.         for move in board.legal_moves:
  26.             board.push(move)
  27.             _, eval = minimax(board, depth - 1, alpha, beta, False, depth2 + 1, depths, position_count, memo)
  28.             board.pop()
  29.             if eval > max_eval:
  30.                 max_eval = eval
  31.                 best_move = move
  32.             alpha = max(alpha, eval)
  33.             if beta <= alpha:
  34.                 break
  35.         memo[key] = (best_move, max_eval)
  36.        
  37.         if depth2 not in depths:  # Přidáváme hloubku do seznamu po dokončení rekurze
  38.             depths.append(depth2)
  39.             print(f"Hloubka rekurze: {depth2}")
  40.        
  41.         return best_move, max_eval
  42.     else:
  43.         min_eval = float('inf')
  44.         for move in board.legal_moves:
  45.             board.push(move)
  46.             _, eval = minimax(board, depth - 1, alpha, beta, True, depth2 + 1, depths, position_count, memo)
  47.             board.pop()
  48.             if eval < min_eval:
  49.                 min_eval = eval
  50.                 best_move = move
  51.             beta = min(beta, eval)
  52.             if beta <= alpha:
  53.                 break
  54.         memo[key] = (best_move, min_eval)
  55.        
  56.         if depth2 not in depths:  # Přidáváme hloubku do seznamu po dokončení rekurze
  57.             depths.append(depth2)
  58.             print(f"Hloubka rekurze: {depth2}")
  59.        
  60.         return best_move, min_eval
  61.  
  62. def evaluate_board(board, depth):
  63.     if board.is_checkmate():
  64.         return -1000 + depth if board.turn == chess.WHITE else 1000 - depth
  65.     elif board.is_stalemate() or board.is_insufficient_material() or board.can_claim_fifty_moves():
  66.         return 0
  67.     return 0
  68.  
  69. # Nastavení startovní pozice
  70. board = chess.Board("8/5k2/8/8/8/8/8/1KQ5 w - - 0 1")
  71. board = chess.Board("8/8/8/8/8/2k5/1R6/K7 w - - 0 1")
  72.  
  73. # Inicializace seznamu pro sledování hloubek, proměnné pro počet pozic, a memoizačního slovníku
  74. depths = []
  75. position_count = [0]
  76. memo = {}
  77.  
  78. # Spuštění minimaxu s maximální hloubkou 16
  79. best_move, best_score = minimax(board, 33, float('-inf'), float('inf'), True, 0, depths, position_count, memo)
  80. if best_move:
  81.     move_san = board.san(best_move)
  82.     print(f"Nejlepší tah z pozice {board.fen()} je {move_san} s hodnocením {best_score}.")
  83. else:
  84.     print("Nebyl nalezen žádný tah, nebo je hra u konce. Skóre: ", best_score)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement