Advertisement
max2201111

kod Petr K

Jun 21st, 2024
558
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.37 KB | Science | 0 0
  1. import chess
  2. import random
  3. from itertools import combinations, permutations
  4. from concurrent.futures import ThreadPoolExecutor, as_completed
  5. import time
  6. import threading
  7.  
  8. def simplify_fen_string(fen):
  9.     parts = fen.split(' ')
  10.     simplified_fen = ' '.join(parts[:4])  # Zachováváme pouze informace o pozici
  11.     return simplified_fen
  12.  
  13. def generate_chess_positions(pieces):
  14.     all_squares = [chess.SQUARES[i] for i in range(64)]
  15.     unique_fens = set()
  16.    
  17.     for squares in combinations(all_squares, len(pieces)):
  18.         for square_perm in permutations(squares):
  19.             board = chess.Board(None)
  20.             board.clear_board()
  21.             for piece, square in zip(pieces, square_perm):
  22.                 board.set_piece_at(square, chess.Piece.from_symbol(piece))
  23.            
  24.             # Kontrola platnosti pro tah bílého
  25.             board.turn = chess.WHITE
  26.             if board.is_valid() or board.is_checkmate():
  27.                 unique_fens.add(simplify_fen_string(board.fen()))
  28.  
  29.             # Kontrola platnosti pro tah černého
  30.             board.turn = chess.BLACK
  31.             if board.is_valid() or board.is_checkmate():
  32.                 unique_fens.add(simplify_fen_string(board.fen()))
  33.    
  34.     return unique_fens
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41. # Funkce pro kontrolu matu a aktualizaci hodnocení
  42. def evaluate_checkmate(fen):
  43.     board = chess.Board(fen)
  44.     if board.is_checkmate():
  45.         if board.turn == chess.WHITE:
  46.             return {"to_end": -1000, "score": -1}  # Bílý je v matu
  47.         else:
  48.             return {"to_end": 1000, "score": 1}  # Černý je v matu
  49.     return {"to_end": None, "score": 0}
  50.  
  51. # Funkce pro paralelní zpracování
  52. def process_position(fen, dot_event):
  53.     evaluation = evaluate_checkmate(fen)
  54.     dot_event.set()  # Nastavit událost pro tisk tečky
  55.     return fen, evaluation
  56.  
  57. # Funkce pro výpis uplynulého času
  58. def print_elapsed_time(stop_event):
  59.     start_time = time.time()
  60.     while not stop_event.is_set():
  61.         time.sleep(1)
  62.         elapsed_time = time.time() - start_time
  63.         days, remainder = divmod(elapsed_time, 86400)
  64.         hours, remainder = divmod(remainder, 3600)
  65.         minutes, seconds = divmod(remainder, 60)
  66.         print(f"\rUplynulý čas: {int(days)}d {int(hours):02}h {int(minutes):02}m {int(seconds):02}s", end='', flush=True)
  67.  
  68. # Funkce pro tisk teček
  69. def print_dots(dot_event, stop_event):
  70.     while not stop_event.is_set():
  71.         if dot_event.wait(0.1):  # Čekat na nastavení události s timeoutem
  72.             print(".", end='', flush=True)
  73.             dot_event.clear()
  74.  
  75. # Hlavní část kódu
  76. initial_pieces = ['K', 'k', 'Q']  # Můžete změnit figury podle potřeby
  77. unique_positions = generate_chess_positions(initial_pieces)
  78. evaluations = []
  79.  
  80. print("Počet unikátních pozic:", len(unique_positions))
  81.  
  82. # Nastavení a spuštění vlákna pro výpis času
  83. stop_event = threading.Event()
  84. dot_event = threading.Event()
  85. time_thread = threading.Thread(target=print_elapsed_time, args=(stop_event,))
  86. dot_thread = threading.Thread(target=print_dots, args=(dot_event, stop_event))
  87.  
  88. time_thread.start()
  89. dot_thread.start()
  90.  
  91. # Paralelní zpracování pozic
  92. batch_size = 100  # Zpracovat menší dávky paralelně
  93. with ThreadPoolExecutor(max_workers=16) as executor:
  94.     for i in range(0, len(unique_positions), batch_size):
  95.         batch_positions = list(unique_positions)[i:i + batch_size]
  96.         futures = [executor.submit(process_position, fen, dot_event) for fen in batch_positions]
  97.         for future in as_completed(futures):
  98.             fen, evaluation = future.result()
  99.             evaluations.append({
  100.                 "fen_string": fen,
  101.                 "to_end": evaluation["to_end"],
  102.                 "score": evaluation["score"],
  103.                 "parent": None  # Přidání parent, může být aktualizováno později, pokud je třeba
  104.             })
  105.             dot_event.set()  # Nastavit událost pro tisk tečky po dokončení úlohy
  106.  
  107. # Zastavení vlákna pro výpis času a teček
  108. stop_event.set()
  109. time_thread.join()
  110. dot_thread.join()
  111.  
  112. # Print results
  113. print()
  114. for evaluation in evaluations:
  115.     fen = evaluation["fen_string"]
  116.     score = evaluation["score"]
  117.     to_end = evaluation["to_end"]
  118.     if to_end != None:
  119.         turn = "White" if chess.Board(fen).turn == chess.WHITE else "Black"
  120.         print(f"FEN: {fen}, Turn: {turn}, Score: {score}, To End: {to_end}")
  121.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement