Advertisement
max2201111

nefunkcni none

Apr 9th, 2024
470
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.52 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 pouze informace o pozici
  6.     return simplified_fen
  7.  
  8. def evaluate_position(board):
  9.     #print(f"Position: {board.fen()}")
  10.     if board.is_checkmate():
  11.      ###   print(f"Position: {board.fen()}, return -1000")
  12.         return -1000  # Mat protihráči
  13.     elif board.is_stalemate() or board.is_insufficient_material() or board.can_claim_draw():
  14.      ###   print(f"Position: {board.fen()}, return 0")
  15.  
  16.         return 0  # Remíza
  17.     else:
  18.         #print(f"Position: {board.fen()}, return None")
  19.         return None  # Hra pokračuje
  20.  
  21.  
  22. def create_AR_entry(result, children, last_move):
  23.    return {"result": result, "children": children, "last_move": last_move, "best_child": None}
  24.  
  25.  
  26. def update_best_case(best_case):
  27.     if best_case == 0:
  28.         return best_case
  29.     if best_case > 0:
  30.         return best_case - 1
  31.     else:
  32.         return best_case + 1
  33.  
  34.  
  35. # def update_AR_for_mate_in_k(board, AR, simplified_initial_fen, max_k=1000):
  36.    
  37. #     evaluated_list = []
  38. #     #print(f"")
  39.    
  40. #     for k in range(1, max_k + 1):
  41. #         print(f"K = {k}")
  42. #         changed = False
  43. #         for _t in range(2):  # Zajistíme, že pro každé k proběhne aktualizace dvakrát
  44. #             print(f"_t = {_t}")
  45. #             for fen in list(AR.keys()):
  46.                
  47.                
  48. #                 #print(f"Fen = {fen}, looking for {simplified_initial_fen}, same = {fen == simplified_initial_fen}")
  49. #                 board.set_fen(fen)
  50.                
  51. #                 if AR[fen]['result'] is not None:
  52. #                     if fen == simplified_initial_fen:
  53. #                         print(f"Finally we found a mate! {AR[fen]['result']}")
  54. #                         return
  55. #                     continue  # Pokud již máme hodnocení, přeskočíme
  56.                
  57. #                 # Získáme výchozí hodnoty pro nejlepší a nejhorší scénář
  58. #                 best_case = float("-inf")
  59. #                 #worst_case = float("inf")
  60. #                 nones_present = False
  61. #                 best_child = None
  62.  
  63.                    
  64. #                 for move in board.legal_moves:
  65. #                     #print(f"Move = {move}")
  66. #                     board.push(move)
  67. #                     next_fen = simplify_fen_string(board.fen())
  68. #                     #AR[fen]['children'].append(next_fen)
  69.                    
  70. #                     if next_fen not in AR:
  71. #                         AR[next_fen] = create_AR_entry(evaluate_position(board), None, move)
  72. #                         evaluated_list.append(next_fen)
  73. #                         if ((len(evaluated_list)) % 100000 == 0):
  74. #                             print(f"Evaluated: {len(evaluated_list)}")
  75.                        
  76. #                     board.pop()
  77.                    
  78. #                     #for child in AR[fen]['children']:
  79. #                     next_eval = AR[next_fen]['result']
  80. #                     if next_eval is not None:
  81. #                         if (-next_eval > best_case):
  82. #                             best_case = max(best_case, -next_eval)
  83. #                             best_child = next_fen
  84.                        
  85. #                         #worst_case = min(worst_case, -next_eval)
  86. #                     else:
  87. #                         nones_present = True
  88.                
  89.                
  90.                
  91. #                 if nones_present:
  92. #                     if best_case > 0:
  93. #                         AR[fen]['result'] = update_best_case(best_case)
  94. #                         AR[fen]['best_child'] = best_child
  95. #                         changed = True
  96. #                 else:
  97. #                     # Aktualizace hodnocení podle nejlepšího a nejhoršího scénáře
  98. #                     #if worst_case == -1000:
  99. #                         # Pokud všechny tahy vedou k matu, hráč na tahu může být matován v k tazích
  100. #                     #    AR[fen] = -1000 + k
  101. #                     #    changed = True
  102. #                     #elif best_case <= 0:
  103. #                         # Pokud nejlepší scénář není lepší než remíza, znamená to remízu nebo prohru
  104. #                     #    AR[fen] = max(best_case, 0)  # Zabráníme nastavení hodnoty méně než 0, pokud je remíza možná
  105. #                     #    changed = True
  106. #                     #elif best_case == 1000:
  107. #                         # Pokud existuje alespoň jeden tah, který vede k matu protihráče, hráč na tahu může vynutit mat v k tazích
  108. #                     #    AR[fen] = 1000 - k
  109. #                     #    changed = True
  110. #                     AR[fen]['result'] = update_best_case(best_case)
  111. #                     AR[fen]['best_child'] = best_child
  112. #                     changed = True
  113.                    
  114. #              ###   print(f"Position = {fen}, results = {best_case} {nones_present} => {AR[fen]['result']}")
  115. #                 if (fen == "8/8/3R4/8/8/5K2/8/4k3 b - -" or fen == "8/8/3R4/8/8/5K2/8/5k2 w - -"):
  116. #                     print("^^^^^^^^")
  117.  
  118.            
  119. #             # remove here
  120. #             #break
  121.            
  122. #             #if not changed:
  123. #                 #break  # Pokud nedošlo k žádné změně, ukončíme smyčku
  124.  
  125. #         #if not changed:
  126. #             #break  # Ukončíme hlavní smyčku, pokud nedošlo ke změně v poslední iteraci
  127.    
  128.  
  129.    
  130. def update_AR_for_mate_in_k(board, AR, fen, max_k=1000):
  131.     k = 0
  132.     while True:
  133.         k += 1
  134.         changed = False
  135.         for _ in range(2):  # Dvakrát pro každou hodnotu k
  136.             for fen in list(AR.keys()):
  137.                 board.set_fen(fen)
  138.                 if AR[fen] is not None:
  139.                     continue  # Tato pozice již byla ohodnocena
  140.  
  141.                 evaluations = []
  142.                 for move in board.legal_moves:
  143.                     board.push(move)
  144.                     next_fen = simplify_fen_string(board.fen())
  145.                     if next_fen not in AR:
  146.                         AR[next_fen] = evaluate_position(board)  # Přidání nových pozic do AR
  147.                     board.pop()
  148.  
  149.                     if AR[next_fen] is not None:
  150.                         evaluations.append(AR[next_fen])
  151. #  pokud max=1001-k přiřaď nové ohodnocení jako 1000-k
  152.  
  153. # pokud max=0 přiřad nové ohodnocení jako 0
  154.  
  155. # tuto: pokud max=-1001+k, přiřaď nové ohodnocení jako -1000+k
  156. #                 # Výpočet nového hodnocení na základě následovníků
  157.                 if evaluations:
  158.                     max_eval = -min(evaluations)
  159.                     if max_eval == -1001+k:
  160.                         AR[fen] = 1000 - k
  161.                         changed = True
  162.                     elif max_eval == 1001-k and all(item is not None for item in evaluated):
  163.                         AR[fen] = -1000 + k
  164.                         chnaged = True
  165.                     elif max_eval == 0 and all(item is not None for item in evaluated):
  166.                         AR[fen] = 0
  167.                         changed = True
  168.  
  169.             if not changed:
  170.                 break  # Konec cyklu, pokud nedošlo k žádné změně
  171.  
  172.         if k >= max_k or not changed:
  173.             break  # Konec hlavního cyklu, pokud dosáhneme max_k nebo nedošlo k žádné změně
  174.      
  175.    
  176.  
  177. def print_draw_positions(AR):
  178.     """
  179.    Vytiskne všechny remízové pozice (hodnota 0) zaznamenané v slovníku AR.
  180.    """
  181.     print("Remízové pozice:")
  182.     for fen, value in AR.items():
  183.         if True or (value > 990 and value < 1000):
  184.             print(f"FEN>: {fen}, Hodnota: {value}","\n",chess.Board(fen),"<\n")
  185.  
  186. def find_path_to_end(AR, fen):
  187.     if AR[fen]['result'] is None:
  188.         print(f"Unfortunately, there is no path that is known to be the best")
  189.    
  190.     fen_i = fen
  191.     print(chess.Board(fen_i),"\n<")
  192.     path = fen
  193.     while AR[fen_i]['best_child'] is not None:
  194.         fen_i = AR[fen_i]['best_child']
  195.         print(chess.Board(fen_i),"\n<")
  196.        
  197.         path = path + ", " + fen_i
  198.    
  199.     print(f"Path is: {path}")
  200.    
  201.  
  202.            
  203. def main():
  204.  
  205.     initial_fen = "1k6/5P2/2K5/8/8/8/8/8 w - - 0 1"
  206.     initial_fen_original = "8/8/8/8/3Q4/5K2/8/4k3 w - - 0 1"
  207.     initial_fen_mate_in_one_aka_one_ply = "3r1k2/5r1p/5Q1K/2p3p1/1p4P1/8/8/8 w - - 2 56"
  208.     initial_fen_mate_in_two_aka_three_plies = "r5k1/2r3p1/pb6/1p2P1N1/3PbB1P/3pP3/PP1K1P2/3R2R1 b - - 4 28"
  209.     initial_fen_mated_in_two_plies = "r5k1/2r3p1/p7/bp2P1N1/3PbB1P/3pP3/PP1K1P2/3R2R1 w - - 5 29"
  210.    
  211.     mate_in_two_aka_three_plies_simple = "8/8/8/8/3R4/5K2/8/4k3 w - - 0 1"
  212.     mated_in_one_aka_two_plies_simple = "8/8/3R4/8/8/5K2/8/4k3 b - - 1 1"
  213.     mate_in_one_aka_one_ply_simple = "8/8/3R4/8/8/5K2/8/5k2 w - - 2 2"
  214.  
  215.     initial_fen = mate_in_two_aka_three_plies_simple
  216.    
  217.    
  218.     initial_fen = "1k6/5P2/2K5/8/8/8/8/8 w - - 0 1"
  219.     initial_fen = "1k6/8/2K5/8/8/8/8/8 w - - 0 1"
  220.     initial_fen = "8/8/8/8/8/7N/1k5K/6B1 w - - 0 1"
  221.     initial_fen = "7K/8/k1P5/7p/8/8/8/8 w - - 0 1"
  222.     initial_fen = "8/3k4/8/2K2R2/8/8/8/8 w - - 0 1"
  223.    
  224.     simplified_fen = simplify_fen_string(initial_fen)
  225.    
  226.     board = chess.Board(initial_fen)
  227.     AR = {simplified_fen: {"result": None, "last_move": None, "children": None, "best_child": None}}  # Inicializace AR s počáteční pozicí
  228.    
  229.     update_AR_for_mate_in_k(board, AR, simplified_fen, max_k=1058)  # Aktualizace AR
  230.    
  231.     #print_draw_positions(AR)
  232.     print(f"AR for initial fen is = {AR[simplified_fen]}")
  233.     find_path_to_end(AR, simplified_fen)
  234.    
  235.  
  236. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement