Advertisement
vatman

Untitled

Oct 26th, 2023
648
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.73 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",
  29.     "rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR",
  30.     "rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R",
  31.     "r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R",
  32.     "r1bqkbnr/pp1ppppp/2n5/2p5/2B1P3/5N2/PPPP1PPP/RNBQK2R",
  33.     "r1bqkbnr/pp1p1ppp/2n1p3/2p5/2B1P3/5N2/PPPP1PPP/RNBQK2R",
  34.     "r1bqkbnr/pp1p1ppp/2n1p3/2p5/2B1P3/2P2N2/PP1P1PPP/RNBQK2R",
  35.     "r1bqkbnr/p2p1ppp/2n1p3/1pp5/2B1P3/2P2N2/PP1P1PPP/RNBQK2R",
  36.     "r1bqkbnr/p2p1ppp/2n1p3/1pp5/4P3/1BP2N2/PP1P1PPP/RNBQK2R",
  37.     "r1bqkbnr/p2p1ppp/2n1p3/1p6/2p1P3/1BP2N2/PP1P1PPP/RNBQK2R",
  38.     "r1bqkbnr/p2p1ppp/2n1p3/1p6/2p1P3/2P2N2/PPBP1PPP/RNBQK2R",
  39.     "r1bqkbnr/3p1ppp/2n1p3/pp6/2p1P3/2P2N2/PPBP1PPP/RNBQK2R",
  40.     "r1bqkbnr/3p1ppp/2n1p3/pp6/2pPP3/2P2N2/PPB2PPP/RNBQK2R",
  41.     "r1bqkbnr/3p1ppp/2n1p3/pp6/4P3/2Pp1N2/PPB2PPP/RNBQK2R",
  42.     "r1bqkbnr/3p1ppp/2n1p3/pp6/4P3/2PQ1N2/PPB2PPP/RNB1K2R",
  43.     "r1bqkb1r/3p1ppp/2n1pn2/pp6/4P3/2PQ1N2/PPB2PPP/RNB1K2R",
  44.     "r1bqkb1r/3p1ppp/2n1pn2/pp2P3/8/2PQ1N2/PPB2PPP/RNB1K2R",
  45.     "r1bqkb1r/3p1ppp/2n1p3/pp1nP3/8/2PQ1N2/PPB2PPP/RNB1K2R",
  46.     "r1bqkb1r/3p1ppp/2n1p3/pp1nP1B1/8/2PQ1N2/PPB2PPP/RN2K2R",
  47.     "r1b1kb1r/2qp1ppp/2n1p3/pp1nP1B1/8/2PQ1N2/PPB2PPP/RN2K2R",
  48.     "r1b1kb1r/2qp1ppp/2n1p3/pp1nP1B1/8/2PQ1N2/PPBN1PPP/R3K2R",
  49.     "r1b1kb1r/2qp1pp1/2n1p2p/pp1nP1B1/8/2PQ1N2/PPBN1PPP/R3K2R",
  50.     "r1b1kb1r/2qp1pp1/2n1p2p/pp1nP3/7B/2PQ1N2/PPBN1PPP/R3K2R",
  51.     "r3kb1r/2qp1pp1/b1n1p2p/pp1nP3/7B/2PQ1N2/PPBN1PPP/R3K2R",
  52.     "r3kb1r/2qp1pp1/b1n1p2p/pp1nP3/7B/1PPQ1N2/P1BN1PPP/R3K2R",
  53.     "r3kb1r/2qp1pp1/b1n1p2p/pp2P3/5n1B/1PPQ1N2/P1BN1PPP/R3K2R"
  54. ]
  55.  
  56. # Создаем массив векторов из ваших данных
  57. vectors = [notation_to_vector(notation.split()[0]) for notation in data]
  58.  
  59. # Выводим все векторы
  60. for i, vector in enumerate(vectors):
  61.     print(f'Вектор {i+1}:')
  62.     print(vector)
  63.     print()
  64.  
  65. # Выбираем три случайные точки (вектора)
  66. indices = np.random.choice(len(vectors), 3, replace=False)
  67. selected_vectors = [vectors[i] for i in indices]
  68.  
  69. # Создаем граф
  70. G = nx.Graph()
  71. for i in range(3):
  72.     G.add_node(i)
  73.  
  74. # Добавляем ребра так, чтобы получилось дерево (без циклов)
  75. G.add_edge(0, 1)
  76. G.add_edge(0, 2)
  77.  
  78. # Расчет энергии вершины
  79. def calculate_vertex_energy(vertex, vectors, k):
  80.     energy = 0
  81.     for vector in vectors:
  82.         energy += np.linalg.norm(vertex - vector)**2
  83.     return k * energy
  84.  
  85. # Расчет энергии ребра
  86. def calculate_edge_energy(edge, vectors, k):
  87.     v1, v2 = vectors[edge[0]], vectors[edge[1]]
  88.     return k * np.linalg.norm(v1 - v2)**2
  89.  
  90. # Расчет энергии клина
  91. def calculate_wedge_energy(wedge, vectors, k):
  92.     v1, v2, v3 = vectors[wedge[0]], vectors[wedge[1]], vectors[wedge[2]]
  93.     return k * np.linalg.norm(v1 + v3 - 2*v2)**2
  94.  
  95. # Расчет энергии графа
  96. def calculate_energy(graph, vectors):
  97.     vertex_k = 0.5 # Замените на ваше значение для коэффициента аппроксимации вершин
  98.     edge_k = 0.5 # Замените на ваше значение для коэффициента растяжения ребер
  99.     wedge_k = 0.5 # Замените на ваше значение для коэффициента изгиба клиньев
  100.    
  101.     energy = 0
  102.     for node in graph.nodes:
  103.         energy += calculate_vertex_energy(vectors[node], vectors, vertex_k)
  104.     for edge in graph.edges:
  105.         energy += calculate_edge_energy(edge, vectors, edge_k)
  106.        
  107.     # Добавляем энергию клина (только если в графе есть три вершины)
  108.     if len(graph.nodes) == 3:
  109.         energy += calculate_wedge_energy(graph.nodes, vectors, wedge_k)
  110.        
  111.     return energy
  112.  
  113. #energy = calculate_energy(G, selected_vectors)
  114. #print(f'Энергия графа: {energy}')
  115.  
  116. # Применяем PCA
  117. #pca = PCA(n_components=2)
  118. #projected_vectors = pca.fit_transform(vectors)
  119.  
  120. # Визуализация проекции графа и векторов
  121. fig = plt.figure()
  122. ax = fig.add_subplot(111, projection='3d')
  123.  
  124. # Отображаем все векторы на графике
  125. for vector in vectors:
  126.     ax.scatter(vector[0], vector[1], vector[2], color='b')
  127.  
  128. # Отображаем выбранные векторы на графике
  129. for vector in selected_vectors:
  130.     ax.scatter(vector[0], vector[1], vector[2], color='r')
  131.  
  132. # Добавляем ребра между вершинами
  133. for edge in G.edges:
  134.     ax.plot([selected_vectors[edge[0]][0], selected_vectors[edge[1]][0]],
  135.             [selected_vectors[edge[0]][1], selected_vectors[edge[1]][1]],
  136.             [selected_vectors[edge[0]][2], selected_vectors[edge[1]][2]], 'r-')
  137.  
  138. plt.show()
  139.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement