Advertisement
max2201111

posledni vereze USEK NE se spravnymi remizamy 5

Sep 1st, 2024
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 12.74 KB | Science | 0 0
  1. def simplify_fen(fen):
  2.     return ' '.join(fen.split()[:4])
  3.  
  4. def calculate_optimal_moves(start_fen: str) -> Dict[str, Tuple[int, str]]:
  5.     print("Funkce calculate_optimal_moves byla zavolána")
  6.     print(f"Počáteční FEN: {start_fen}")
  7.    
  8.     board = CustomBoard(start_fen)
  9.     POZ = {1: simplify_fen(start_fen)}
  10.     AR = {simplify_fen(start_fen): {'used': 0, 'to_end': None, 'depth': 0, 'type': 'normal'}}
  11.     N = 1
  12.     M = 0
  13.  
  14.     start_time = time.time()
  15.     current_depth = 0
  16.     positions_at_depth = {0: 0}
  17.     depth_start_time = start_time
  18.  
  19.     stop_event = threading.Event()
  20.     timer_thread = threading.Thread(target=print_elapsed_time, args=(stop_event, start_time))
  21.     timer_thread.start()
  22.  
  23.     try:
  24.         print("Začínám generovat pozice...")
  25.         print("Počáteční pozice:")
  26.         print_board(start_fen)
  27.        
  28.         depth_1_positions = []  # Seznam pro ukládání pozic v hloubce 1
  29.  
  30.         # Generate all positions
  31.         while M < N:
  32.             M += 1
  33.             current_fen = POZ[M]
  34.             board.set_custom_fen(current_fen)
  35.             simplified_current_fen = simplify_fen(current_fen)
  36.             current_depth = AR[simplified_current_fen]['depth']
  37.  
  38.             if current_depth not in positions_at_depth:
  39.                 positions_at_depth[current_depth] = 0
  40.                 if current_depth > 0:
  41.                     depth_time = time.time() - depth_start_time
  42.                     total_time = time.time() - start_time
  43.                     print(f"\nHloubka {current_depth - 1}: {positions_at_depth[current_depth - 1]} pozic, "
  44.                           f"Čas hloubky: {format_time(depth_time)} / Celkový čas: {format_time(total_time)}")
  45.                    
  46.                     if current_depth == 1:
  47.                         print("Všechny pozice v hloubce 1:")
  48.                         for pos in depth_1_positions:
  49.                             print_board(pos)
  50.                             print()
  51.                
  52.                 depth_start_time = time.time()
  53.  
  54.             positions_at_depth[current_depth] += 1
  55.  
  56.             if current_depth == 1:
  57.                 depth_1_positions.append(current_fen)
  58.  
  59.             if AR[simplified_current_fen]['used'] == 0:
  60.                 AR[simplified_current_fen]['used'] = 1
  61.                 legal_moves = list(board.legal_moves)
  62.                 for move in legal_moves:
  63.                     board.push(move)
  64.                     POZ2 = board.fen()
  65.                     simplified_POZ2 = simplify_fen(POZ2)
  66.                     if simplified_POZ2 not in AR:
  67.                         N += 1
  68.                         POZ[N] = simplified_POZ2
  69.                         AR[simplified_POZ2] = {'used': 0, 'to_end': None, 'depth': current_depth + 1, 'type': 'normal'}
  70.                     board.pop()
  71.    
  72.         # Print last depth
  73.         depth_time = time.time() - depth_start_time
  74.         total_time = time.time() - start_time
  75.         print(f"\nHloubka {current_depth}: {positions_at_depth[current_depth]} pozic, "
  76.               f"Čas hloubky: {format_time(depth_time)} / Celkový čas: {format_time(total_time)}")
  77.         print(f"Příklad pozice v hloubce {current_depth}:")
  78.         print_board(current_fen)
  79.  
  80.         print(f"Generování pozic dokončeno. Celkový počet pozic: {N}")
  81.  
  82.         # Initial evaluation
  83.         print("\nZačínám počáteční ohodnocení...")
  84.         F_checkmate = 0
  85.         F_stalemate = 0
  86.         F_drawing = 0
  87.         F_check = 0
  88.         F_normal = 0
  89.         for i in range(1, N + 1):
  90.             current_fen = POZ[i]
  91.             board.set_custom_fen(current_fen)
  92.             simplified_current_fen = simplify_fen(current_fen)
  93.  
  94.             if board.is_checkmate():
  95.                 AR[simplified_current_fen]['to_end'] = -1000
  96.                 AR[simplified_current_fen]['type'] = 'checkmate'
  97.                 F_checkmate += 1
  98.             elif board.is_stalemate():
  99.                 AR[simplified_current_fen]['to_end'] = 0
  100.                 AR[simplified_current_fen]['type'] = 'stalemate'
  101.                 F_stalemate += 1
  102.             elif board.is_insufficient_material():
  103.                 AR[simplified_current_fen]['to_end'] = 0
  104.                 AR[simplified_current_fen]['type'] = 'drawing'
  105.                 F_drawing += 1
  106.             elif board.is_check():
  107.                 AR[simplified_current_fen]['to_end'] = None
  108.                 AR[simplified_current_fen]['type'] = 'check'
  109.                 F_check += 1
  110.             else:
  111.                 AR[simplified_current_fen]['to_end'] = None
  112.                 AR[simplified_current_fen]['type'] = 'normal'
  113.                 F_normal += 1
  114.  
  115.         print(f"Počet pozic v matu je {F_checkmate}")
  116.         print(f"Počet pozic v patu je {F_stalemate}")
  117.         print(f"Počet pozic v remíze je {F_drawing}")
  118.         print(f"Počet pozic v šachu je {F_check}")
  119.         print(f"Počet normálních pozic je {F_normal}")
  120.  
  121.         # Iterative evaluation
  122.         print("\nZačínám iterativní ohodnocení...")
  123.         uroven = 0
  124.         while True:
  125.             uroven += 1
  126.             level_start_time = time.time()
  127.             print(f"Výpočet v úrovni {uroven}")
  128.            
  129.             changed = False
  130.             current_level_positions = 0
  131.             for i in range(1, N + 1):
  132.                 current_fen = POZ[i]
  133.                 board.set_custom_fen(current_fen)
  134.                 simplified_current_fen = simplify_fen(current_fen)
  135.                 if AR[simplified_current_fen]['to_end'] is None or AR[simplified_current_fen]['to_end'] == 0:
  136.                     hod = -2000
  137.                     for move in board.legal_moves:
  138.                         board.push(move)
  139.                         POZ2 = board.fen()
  140.                         simplified_POZ2 = simplify_fen(POZ2)
  141.                         if simplified_POZ2 in AR and AR[simplified_POZ2]['to_end'] is not None:
  142.                             hod2 = -AR[simplified_POZ2]['to_end']
  143.                             if hod2 > hod:
  144.                                 hod = hod2
  145.                         board.pop()
  146.                    
  147.                     if hod == 1001 - uroven:
  148.                         new_to_end = 1000 - uroven
  149.                         new_type = 'winning'
  150.                     elif hod == -1001 + uroven:
  151.                         new_to_end = -1000 + uroven
  152.                         new_type = 'losing'
  153.                     elif hod == 0:
  154.                         new_to_end = 0
  155.                         new_type = 'drawing'
  156.                     elif hod > -2000:  # Pokud byl nalezen alespoň jeden platný tah
  157.                         new_to_end = hod
  158.                         new_type = 'normal'
  159.                     else:
  160.                         new_to_end = None
  161.                         new_type = None
  162.                    
  163.                     if new_to_end is not None and (AR[simplified_current_fen]['to_end'] != new_to_end or AR[simplified_current_fen]['type'] != new_type):
  164.                         AR[simplified_current_fen]['to_end'] = new_to_end
  165.                         AR[simplified_current_fen]['type'] = new_type
  166.                         changed = True
  167.                         current_level_positions += 1
  168.            
  169.             level_end_time = time.time()
  170.             total_elapsed_time = level_end_time - start_time
  171.             level_elapsed_time = level_end_time - level_start_time
  172.             print(f"Nalezeno {current_level_positions} pozic v úrovni {uroven}")
  173.             print(f"Čas úrovně: {format_time(level_elapsed_time)} / Celkový čas: {format_time(total_elapsed_time)}")
  174.            
  175.             if not changed:
  176.                 print("Hodnocení ukončeno - žádné další změny.")
  177.                 break
  178.        
  179.         print(f"Celkem nalezeno {sum(1 for data in AR.values() if data['to_end'] is not None)} ohodnocených pozic")
  180.  
  181.         print("\nVýpočet dokončen.")
  182.         return {fen: (data['to_end'], data['type']) for fen, data in AR.items() if data['to_end'] is not None}
  183.  
  184.     finally:
  185.         stop_event.set()
  186.         timer_thread.join()
  187.  
  188.  
  189. # Helper function to print the board
  190. def print_board(fen):
  191.     board = CustomBoard(fen)
  192.     print(board)
  193.  
  194. # Najděte nejmenší kladnou hodnotu to_end ve všech FEN záznamech v AR
  195. def find_min_positive_value(AR):
  196.     min_positive_value = float('inf')
  197.     min_fen = None
  198.    
  199.     for fen, (value, type_pozice) in AR.items():
  200.         if value is not None and value > 0 and value < min_positive_value:
  201.             min_positive_value = value
  202.             min_fen = fen
  203.    
  204.     if min_positive_value == float('inf'):
  205.         print("Žádná kladná hodnota nebyla nalezena.")
  206.     else:
  207.         print(f"Nejmenší kladná hodnota: {min_positive_value}, FEN: {min_fen}")
  208.  
  209. # Main execution
  210. # Main execution
  211. if __name__ == "__main__":
  212.     start_fen = "7K/8/k1P5/7p/8/8/8/8 w - - 0 1"
  213.  
  214.     start_fen = "7K/8/8/8/8/k7/8/7A w - - 0 1"
  215.  
  216.  #   start_fen = "7K/8/8/2a5/8/1k6/8/7A w - - 0 1"
  217.  
  218.     start_fen = "7K/8/k1P5/7p/8/8/8/8 w - - 0 1"
  219.  
  220.     start_fen = "6K1/3E4/8/8/8/k7/8/8 w - - 0 1"
  221.  
  222.     start_fen = "8/5A2/8/8/2K5/8/ka6/8 w - - 0 1"
  223.  
  224.     start_fen = "8/8/8/2k5/8/8/1K6/3Q4 w - - 0 1"
  225.  
  226.    
  227.     AR = calculate_optimal_moves(start_fen)
  228.  
  229.     find_min_positive_value(AR)
  230.  
  231.     # print("\nVýsledky:")
  232.     # for hodnota in range(-996, -1001, -1):  # Generuje hodnoty -996, -997, -998, -999, -1000
  233.     #     for fen, (fen_hodnota, typ_pozice) in AR.items():
  234.     #         if fen_hodnota == hodnota:
  235.     #             print(f"FEN: {fen}")
  236.     #             print(f"Hodnota: {fen_hodnota}")
  237.     #             print(f"Typ pozice: {typ_pozice}")
  238.                
  239.     #             temp_board = CustomBoard(fen)
  240.                
  241.     #             if temp_board.is_checkmate():
  242.     #                 print("Stav: Mat")
  243.     #             elif temp_board.is_stalemate():
  244.     #                 print("Stav: Pat")
  245.     #             elif temp_board.is_insufficient_material():
  246.     #                 print("Stav: Nedostatečný materiál")
  247.     #             elif temp_board.is_check():
  248.     #                 print("Stav: Šach")
  249.     #             else:
  250.     #                 print("Stav: Normální pozice")
  251.      
  252.     #             print_board(fen)
  253.                
  254.     #             print()
  255.  
  256.     # Print optimal moves
  257. # Print optimal moves
  258.     current_fen = start_fen
  259.     simplified_current_fen = simplify_fen(current_fen)
  260.     simplified_current_fen1 = simplified_current_fen
  261.     optimal_moves = []
  262.    
  263.     while True:
  264.         board = CustomBoard(current_fen)
  265.         if board.is_checkmate():
  266.             print("Mat detekován!")
  267.             break
  268.        
  269.         # Opravená část
  270.         half_move_clock = current_fen.split()[-2]
  271.         if board.is_insufficient_material() or (half_move_clock != '-' and int(half_move_clock) >= 100):
  272.             if board.is_insufficient_material():
  273.                 print("Nedostatečný materiál detekován!")
  274.             else:
  275.                 print("Remíza pravidlem 50 tahů detekována!")
  276.             AR[simplified_current_fen] = (0, 'drawing')  # Aktualizujeme AR pro tuto pozici
  277.             break
  278.        
  279.         if simplified_current_fen not in AR:
  280.             print(f"Pozice {simplified_current_fen} není v AR.")
  281.             break
  282.        
  283.         current_value = AR[simplified_current_fen][0]
  284.        
  285.         if current_value == 0:
  286.             print("Remíza dosažena!")
  287.             break
  288.        
  289.         hod = -2000 if current_value > 0 else 2000
  290.         best_fen = None
  291.         for move in board.legal_moves:
  292.             board.push(move)
  293.             POZ2 = board.fen()
  294.             simplified_POZ2 = simplify_fen(POZ2)
  295.             if simplified_POZ2 in AR:
  296.                 hod2 = -AR[simplified_POZ2][0]
  297.                 if current_value > 0:  # Silnější hráč
  298.                     if hod2 > hod:
  299.                         hod = hod2
  300.                         best_fen = simplified_POZ2
  301.                 else:  # Slabší hráč
  302.                     if hod2 < hod:
  303.                         hod = hod2
  304.                         best_fen = simplified_POZ2
  305.             board.pop()
  306.        
  307.         if best_fen is None:
  308.             print("Žádný další tah nebyl nalezen.")
  309.             break
  310.         optimal_moves.append(best_fen)
  311.         current_fen = best_fen
  312.         simplified_current_fen = simplify_fen(current_fen)
  313.            
  314.    
  315.     print("\nOptimální tahy:")
  316.     for fen in reversed(optimal_moves):
  317.         print_board(fen)
  318.         hodnota, typ_pozice = AR[simplify_fen(fen)]
  319.         print(f"Hodnota: {hodnota}, Typ: {typ_pozice}")
  320.         print(fen)
  321.         print("\n")
  322.        
  323.     print_board(simplified_current_fen1)
  324.     hodnota, typ_pozice = AR[simplified_current_fen1]
  325.     print(f"Hodnota: {hodnota}, Typ: {typ_pozice}")
  326.     print(simplified_current_fen1)
  327.     print("\n")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement