vatman

Untitled

Oct 26th, 2023
664
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.76 KB | None | 0 0
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from mpl_toolkits.mplot3d import Axes3D
  4. import networkx as nx
  5. from scipy.spatial import distance
  6. from sklearn.decomposition import PCA
  7.  
  8. # Функция для преобразования шахматной нотации в вектор
  9. def notation_to_vector(notation):
  10.     piece_dict = {'P': 1, 'N': 2, 'B': 3, 'R': 4, 'Q': 5, 'K': 6}
  11.     board_vector = [0]*64
  12.     rows = notation.split('/')
  13.     for i, row in enumerate(rows):
  14.         col = 0
  15.         for char in row:
  16.             if char.isdigit():
  17.                 col += int(char)
  18.             else:
  19.                 if char.isupper():
  20.                     board_vector[i*8 + col] = piece_dict[char]
  21.                 else:
  22.                     board_vector[i*8 + col] = -piece_dict[char.upper()]
  23.                 col += 1
  24.     return np.array(board_vector)
  25.  
  26. # Ваши данные
  27. data = [
  28.     "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1",
  29.     "rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq c6 0 2",
  30.     "rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 2",
  31.     "r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - 2 3",
  32.     "r1bqkbnr/pp1ppppp/2n5/2p5/2B1P3/5N2/PPPP1PPP/RNBQK2R b KQkq - 3 3",
  33.     "r1bqkbnr/pp1p1ppp/2n5/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R w KQkq e6 0 4",
  34.     "r1bqkbnr/pp1p1ppp/2n5/4P3/2B5/5N2/PPPP1PPP/RNBQK2R b KQkq - 0 4",
  35.     "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1",
  36.     "rnbqkb1r/pppppppp/7n/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 1 2",
  37.     "rnbqkb1r/pppppppp/7n/N7/P3P3/P7/PBPPBPPP/RNQQKBRR b KQkq - 0 10"
  38. ]
  39.  
  40. # Создаем массив векторов из ваших данных
  41. vectors = [notation_to_vector(notation.split()[0]) for notation in data]
  42.  
  43. # Выводим все векторы
  44. for i, vector in enumerate(vectors):
  45.     print(f'Вектор {i+1}:')
  46.     print(vector)
  47.     print()
  48.  
  49. # Выбираем три случайные точки (вектора)
  50. indices = np.random.choice(len(vectors), 3, replace=False)
  51. selected_vectors = [vectors[i] for i in indices]
  52.  
  53. # Создаем граф
  54. G = nx.Graph()
  55. for i in range(3):
  56.     G.add_node(i)
  57.  
  58. # Добавляем ребра так, чтобы получилось дерево (без циклов)
  59. G.add_edge(0, 1)
  60. G.add_edge(0, 2)
  61.  
  62. # Расчет энергии вершины
  63. def calculate_vertex_energy(vertex, vectors, k):
  64.     energy = 0
  65.     for vector in vectors:
  66.         energy += np.linalg.norm(vertex - vector)**2
  67.     return k * energy
  68.  
  69. # Расчет энергии ребра
  70. def calculate_edge_energy(edge, vectors, k):
  71.     v1, v2 = vectors[edge[0]], vectors[edge[1]]
  72.     return k * np.linalg.norm(v1 - v2)**2
  73.  
  74. # Расчет энергии клина
  75. def calculate_wedge_energy(wedge, vectors, k):
  76.     v1, v2, v3 = vectors[wedge[0]], vectors[wedge[1]], vectors[wedge[2]]
  77.     return k * np.linalg.norm(v1 + v3 - 2*v2)**2
  78.  
  79. # Расчет энергии графа
  80. def calculate_energy(graph, vectors):
  81.     vertex_k = 0.5 # Замените на ваше значение для коэффициента аппроксимации вершин
  82.     edge_k = 0.5 # Замените на ваше значение для коэффициента растяжения ребер
  83.     wedge_k = 0.5 # Замените на ваше значение для коэффициента изгиба клиньев
  84.    
  85.     energy = 0
  86.     for node in graph.nodes:
  87.         energy += calculate_vertex_energy(vectors[node], vectors, vertex_k)
  88.     for edge in graph.edges:
  89.         energy += calculate_edge_energy(edge, vectors, edge_k)
  90.        
  91.     # Добавляем энергию клина (только если в графе есть три вершины)
  92.     if len(graph.nodes) == 3:
  93.         energy += calculate_wedge_energy(graph.nodes, vectors, wedge_k)
  94.        
  95.     return energy
  96.  
  97. #energy = calculate_energy(G, selected_vectors)
  98. #print(f'Энергия графа: {energy}')
  99.  
  100. # Применяем PCA
  101. pca = PCA(n_components=2)
  102. projected_vectors = pca.fit_transform(vectors)
  103.  
  104. # Визуализация проекции графа и векторов
  105. fig, ax = plt.subplots()
  106.  
  107. # Отображаем все векторы на графике
  108. for vector in vectors:
  109.     ax.scatter(vector[0], vector[1], color='b')
  110.  
  111. # Отображаем выбранные векторы на графике
  112. for vector in selected_vectors:
  113.     ax.scatter(vector[0], vector[1], color='r')
  114.  
  115. # Добавляем ребра между вершинами
  116. for edge in G.edges:
  117.     ax.plot([selected_vectors[edge[0]][0], selected_vectors[edge[1]][0]],
  118.             [selected_vectors[edge[0]][1], selected_vectors[edge[1]][1]],
  119.             [selected_vectors[edge[0]][2], selected_vectors[edge[1]][2]], 'r-')
  120.  
  121. plt.show()
  122.  
Advertisement
Add Comment
Please, Sign In to add comment