Advertisement
max2201111

funkcni wrong plies better output

Apr 18th, 2024
707
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.04 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 print_draw_positions(AR):
  131.     """
  132.    Vytiskne všechny remízové pozice (hodnota 0) zaznamenané v slovníku AR.
  133.    """
  134.     print("Remízové pozice:")
  135.     for fen, value in AR.items():
  136.         if True or (value > 990 and value < 1000):
  137.             print(f"FEN>: {fen}, Hodnota: {value}","\n",chess.Board(fen),"<\n")
  138.  
  139. def find_path_to_end(AR, fen):
  140.     if AR[fen]['result'] is None:
  141.         print(f"Unfortunately, there is no path that is known to be the best")
  142.    
  143.     fen_i = fen
  144.     print(chess.Board(fen_i),"\n<")
  145.     path = fen
  146.     while AR[fen_i]['best_child'] is not None:
  147.         fen_i = AR[fen_i]['best_child']
  148.         print(chess.Board(fen_i),AR[fen_i],"\n\n<<<<")
  149.        
  150.         path = path + ", " + fen_i
  151.    
  152.     print(f"Path is: {path}")
  153.    
  154.  
  155.            
  156. def main():
  157.  
  158.     initial_fen = "1k6/5P2/2K5/8/8/8/8/8 w - - 0 1"
  159.     initial_fen_original = "8/8/8/8/3Q4/5K2/8/4k3 w - - 0 1"
  160.     initial_fen_mate_in_one_aka_one_ply = "3r1k2/5r1p/5Q1K/2p3p1/1p4P1/8/8/8 w - - 2 56"
  161.     initial_fen_mate_in_two_aka_three_plies = "r5k1/2r3p1/pb6/1p2P1N1/3PbB1P/3pP3/PP1K1P2/3R2R1 b - - 4 28"
  162.     initial_fen_mated_in_two_plies = "r5k1/2r3p1/p7/bp2P1N1/3PbB1P/3pP3/PP1K1P2/3R2R1 w - - 5 29"
  163.    
  164.     mate_in_two_aka_three_plies_simple = "8/8/8/8/3R4/5K2/8/4k3 w - - 0 1"
  165.     mated_in_one_aka_two_plies_simple = "8/8/3R4/8/8/5K2/8/4k3 b - - 1 1"
  166.     mate_in_one_aka_one_ply_simple = "8/8/3R4/8/8/5K2/8/5k2 w - - 2 2"
  167.  
  168.     initial_fen = mate_in_two_aka_three_plies_simple
  169.    
  170.    
  171.     initial_fen = "1k6/5P2/2K5/8/8/8/8/8 w - - 0 1"
  172.     initial_fen = "1k6/8/2K5/8/8/8/8/8 w - - 0 1"
  173.     initial_fen = "8/8/8/8/8/7N/1k5K/6B1 w - - 0 1"
  174.     initial_fen = "7K/8/k1P5/7p/8/8/8/8 w - - 0 1"
  175.     initial_fen = "8/3k4/8/2K2R2/8/8/8/8 w - - 0 1"
  176.    
  177.     simplified_fen = simplify_fen_string(initial_fen)
  178.    
  179.     board = chess.Board(initial_fen)
  180.     AR = {simplified_fen: {"result": None, "last_move": None, "children": None, "best_child": None}}  # Inicializace AR s počáteční pozicí
  181.    
  182.     update_AR_for_mate_in_k(board, AR, simplified_fen, max_k=58)  # Aktualizace AR
  183.    
  184.     #print_draw_positions(AR)
  185.     print(f"AR for initial fen is = {AR[simplified_fen]}")
  186.     find_path_to_end(AR, simplified_fen)
  187.    
  188.  
  189. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement