vatman

бмо графы

Nov 24th, 2023
1,003
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.28 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.  
  7. vectors = [np.random.randint(-6, 7, 64) for _ in range(10)]
  8.  
  9. # Выводим все векторы
  10. for i, vector in enumerate(vectors):
  11.     print(f'Вектор {i+1}:')
  12.     print(vector)
  13.     print()
  14.  
  15. # Выбираем три случайные точки (вектора)
  16. indices = np.random.choice(len(vectors), 3, replace=False)
  17. selected_vectors = [vectors[i] for i in indices]
  18.  
  19. # Создаем граф
  20. G = nx.Graph()
  21. for i in range(3):
  22.     G.add_node(i)
  23.  
  24. # Добавляем ребра так, чтобы получилось дерево (без циклов)
  25. G.add_edge(0, 1)
  26. G.add_edge(0, 2)
  27.  
  28. # Расчет энергии вершины
  29. def calculate_vertex_energy(vertex, vectors, k):
  30.     energy = 0
  31.     for vector in vectors:
  32.         energy += np.linalg.norm(vertex - vector)**2
  33.     return k * energy
  34.  
  35. # Расчет энергии ребра
  36. def calculate_edge_energy(edge, vectors, k):
  37.     v1, v2 = vectors[edge[0]], vectors[edge[1]]
  38.     return k * np.linalg.norm(v1 - v2)**2
  39.  
  40. # Расчет энергии клина
  41. def calculate_wedge_energy(wedge, vectors, k):
  42.     v1, v2, v3 = vectors[wedge[0]], vectors[wedge[1]], vectors[wedge[2]]
  43.     return k * np.linalg.norm(v1 + v3 - 2*v2)**2
  44.  
  45. # Расчет энергии графа
  46. def calculate_energy(graph, vectors):
  47.     vertex_k = 0.5 # Замените на ваше значение для коэффициента аппроксимации вершин
  48.     edge_k = 0.5 # Замените на ваше значение для коэффициента растяжения ребер
  49.     wedge_k = 0.5 # Замените на ваше значение для коэффициента изгиба клиньев
  50.    
  51.     energy = 0
  52.     for node in graph.nodes:
  53.         energy += calculate_vertex_energy(vectors[node], vectors, vertex_k)
  54.     for edge in graph.edges:
  55.         energy += calculate_edge_energy(edge, vectors, edge_k)
  56.        
  57.     # Добавляем энергию клина (только если в графе есть три вершины)
  58.     if len(graph.nodes) == 3:
  59.         nodes = list(graph.nodes)  # Преобразуем NodeView в список
  60.         energy += calculate_wedge_energy(nodes, vectors, wedge_k)
  61.        
  62.     return energy
  63.  
  64. energy = calculate_energy(G, selected_vectors)
  65. print(f'Энергия графа: {energy}')
  66.  
  67. # Визуализация проекции графа и векторов
  68. fig = plt.figure()
  69. ax = fig.add_subplot(111, projection='3d')
  70.  
  71. # Отображаем все векторы на графике
  72. for vector in vectors:
  73.     ax.scatter(vector[0], vector[1], vector[2], color='b')
  74.  
  75. # Отображаем выбранные векторы на графике
  76. for vector in selected_vectors:
  77.     ax.scatter(vector[0], vector[1], vector[2], color='r')
  78.  
  79. # Добавляем ребра между вершинами
  80. for edge in G.edges:
  81.     ax.plot([selected_vectors[edge[0]][0], selected_vectors[edge[1]][0]],
  82.             [selected_vectors[edge[0]][1], selected_vectors[edge[1]][1]],
  83.             [selected_vectors[edge[0]][2], selected_vectors[edge[1]][2]], 'r-')
  84.  
  85. plt.show()
  86.  
Advertisement
Add Comment
Please, Sign In to add comment