Advertisement
vatman

somecode

Feb 9th, 2024
870
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 26.12 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_matrix
  6. import itertools
  7. from networkx.drawing.layout import fruchterman_reingold_layout
  8.  
  9.  
  10. def add_unique_vector(vectors, selected_vectors, remaining_indices):
  11.  
  12.     # Выбираем случайный индекс из оставшихся
  13.     new_index = np.random.choice(remaining_indices)
  14.  
  15.     # Добавляем новый выбранный вектор
  16.     selected_vectors.append(vectors[new_index])
  17.     remaining_indices = list(remaining_indices - new_index)
  18.  
  19.     return selected_vectors, remaining_indices
  20.  
  21.  
  22. def DFS(graph, start, visited=None):
  23.     if visited is None:
  24.         visited = set()
  25.     visited.add(start)
  26.     for next_node in set(graph[start]) - visited:
  27.         DFS(graph, next_node, visited)
  28.     return visited
  29.  
  30.  
  31. # Расчет энергии вершины
  32. def calculate_vertex_energy(vertex, vectors, k):
  33.     energy = 0
  34.     for vector in vectors:
  35.         energy += np.linalg.norm(vertex - vector) ** 2
  36.     return k * energy
  37.  
  38.  
  39. def calculate_vertex_energy(vertex, vectors, k, num_nearest):
  40.     # Вычисляем расстояния от вершины до каждого вектора
  41.     distances = [np.linalg.norm(vertex - vector) for vector in vectors]
  42.  
  43.     # Получаем индексы векторов, отсортированных по расстоянию
  44.     sorted_indices = np.argsort(distances)
  45.  
  46.     # Выбираем num_nearest ближайших векторов
  47.     nearest_vectors = [vectors[i] for i in sorted_indices[:num_nearest]]
  48.  
  49.     # Вычисляем энергию вершины
  50.     energy = 0
  51.     for vector in nearest_vectors:
  52.         energy += k * np.linalg.norm(vertex - vector) ** 2
  53.     return energy
  54.  
  55.  
  56. # Расчет энергии ребра
  57. def calculate_edge_energy(edge, vectors, k):
  58.     v1, v2 = vectors[edge[0]], vectors[edge[1]]
  59.     return k * np.linalg.norm(v1 - v2) ** 2
  60.  
  61.  
  62. # Расчет энергии клина
  63. def calculate_wedge_energy(wedge, vectors, k):
  64.     v1, v2, v3 = vectors[wedge[0]], vectors[wedge[1]], vectors[wedge[2]]
  65.     return k * np.linalg.norm(v1 + v3 - 2 * v2) ** 2
  66.  
  67.  
  68. # Расчет энергии графа
  69. def calculate_energy(
  70.     graph,
  71.     vectors,
  72.     selected_vectors,
  73.     max_vertex_energy,
  74.     max_edge_energy,
  75.     max_wedge_energy,
  76.     max_energy_vertex,
  77.     max_energy_edge,
  78.     max_energy_wedge,
  79.     edge_combination,
  80. ):
  81.     # vertex_k = 0.5 # Замените на ваше значение для коэффициента аппроксимации вершин
  82.     # edge_k = 0.5 # Замените на ваше значение для коэффициента растяжения ребер
  83.     # wedge_k = 0.5 # Замените на ваше значение для коэффициента изгиба клиньев
  84.     max_wedge_energy = (
  85.         -np.inf
  86.     )  # Инициализируем максимальную энергию клина как минус бесконечность
  87.     max_energy_wedge = None  # Инициализируем клин с максимальной энергией как None
  88.     edge_combination = 0
  89.     max_vertex_energy = -np.inf
  90.     max_edge_energy = -np.inf
  91.     max_energy_vertex = 0
  92.     max_energy_edge = None
  93.  
  94.     energy = 0
  95.     for node in graph.nodes:
  96.         vertex_energy = calculate_vertex_energy(
  97.             selected_vectors[int(node)], vectors, vertex_k, 2
  98.         )
  99.         if vertex_energy > max_vertex_energy:
  100.             max_vertex_energy = vertex_energy
  101.             max_energy_vertex = node
  102.         energy += vertex_energy
  103.     for edge in graph.edges:
  104.         edge_energy = calculate_edge_energy(edge, selected_vectors, edge_k)
  105.         if edge_energy > max_edge_energy:
  106.             max_edge_energy = edge_energy
  107.             max_energy_edge = edge
  108.         energy += edge_energy
  109.  
  110.     # Добавляем энергию клина для всех подграфов из трех вершин
  111.     for nodes in itertools.combinations(graph.nodes, 3):
  112.         # print(nodes)
  113.         if graph.has_edge(nodes[0], nodes[1]) and graph.has_edge(nodes[0], nodes[2]):
  114.             wedge_energy = calculate_wedge_energy(nodes, selected_vectors, wedge_k)
  115.             # print("Энергия клина:")
  116.             # print(p1)
  117.             if wedge_energy > max_wedge_energy:
  118.                 max_wedge_energy = wedge_energy
  119.                 max_energy_wedge = nodes
  120.                 edge_combination = 1
  121.             energy += wedge_energy
  122.         elif graph.has_edge(nodes[0], nodes[1]) and graph.has_edge(nodes[1], nodes[2]):
  123.             wedge_energy = calculate_wedge_energy(nodes, selected_vectors, wedge_k)
  124.             if wedge_energy > max_wedge_energy:
  125.                 max_wedge_energy = wedge_energy
  126.                 max_energy_wedge = nodes
  127.                 edge_combination = 2
  128.                 # print("Энергия клина:")
  129.             # print(p1)
  130.             energy += wedge_energy
  131.         elif graph.has_edge(nodes[0], nodes[2]) and graph.has_edge(nodes[1], nodes[2]):
  132.             wedge_energy = calculate_wedge_energy(nodes, selected_vectors, wedge_k)
  133.             if wedge_energy > max_wedge_energy:
  134.                 max_wedge_energy = wedge_energy
  135.                 max_energy_wedge = nodes
  136.                 edge_combination = 3
  137.             # print("Энергия клина:")
  138.             # print(p1)
  139.             energy += wedge_energy
  140.     return (
  141.         energy,
  142.         max_vertex_energy,
  143.         max_edge_energy,
  144.         max_wedge_energy,
  145.         max_energy_vertex,
  146.         max_energy_edge,
  147.         max_energy_wedge,
  148.         edge_combination,
  149.     )
  150.  
  151.  
  152. # Расчет энергии графа
  153. def calculate_energy1(graph, vectors, selected_vectors):
  154.     vertex_k = 2  # Замените на ваше значение для коэффициента аппроксимации вершин
  155.     edge_k = 1  # Замените на ваше значение для коэффициента растяжения ребер
  156.     wedge_k = 0.25
  157.     energy = 0
  158.     for node in graph.nodes:
  159.         vertex_energy = calculate_vertex_energy(
  160.             selected_vectors[int(node)], vectors, vertex_k, 2
  161.         )
  162.         energy += vertex_energy
  163.     for edge in graph.edges:
  164.         edge_energy = calculate_edge_energy(edge, selected_vectors, edge_k)
  165.         energy += edge_energy
  166.  
  167.     # Добавляем энергию клина для всех подграфов из трех вершин
  168.     for nodes in itertools.combinations(graph.nodes, 3):
  169.         # print(nodes)
  170.         if graph.has_edge(nodes[0], nodes[1]) and graph.has_edge(nodes[0], nodes[2]):
  171.             wedge_energy = calculate_wedge_energy(nodes, selected_vectors, wedge_k)
  172.             energy += wedge_energy
  173.         elif graph.has_edge(nodes[0], nodes[1]) and graph.has_edge(nodes[1], nodes[2]):
  174.             wedge_energy = calculate_wedge_energy(nodes, selected_vectors, wedge_k)
  175.             energy += wedge_energy
  176.         elif graph.has_edge(nodes[0], nodes[2]) and graph.has_edge(nodes[1], nodes[2]):
  177.             wedge_energy = calculate_wedge_energy(nodes, selected_vectors, wedge_k)
  178.             energy += wedge_energy
  179.     return energy
  180.  
  181.  
  182. def visualize_graph(vectors, selected_vectors, G):
  183.     fig = plt.figure()
  184.     ax = fig.add_subplot(111, projection="3d")
  185.  
  186.     # Отображаем все векторы на графике
  187.     for vector in vectors:
  188.         ax.scatter(vector[0], vector[1], vector[2], color="b")
  189.  
  190.     # Отображаем выбранные векторы на графике
  191.     for vector in selected_vectors:
  192.         ax.scatter(vector[0], vector[1], vector[2], color="r")
  193.  
  194.     # Добавляем ребра между вершинами
  195.     for edge in G.edges:
  196.         ax.plot(
  197.             [selected_vectors[edge[0]][0], selected_vectors[edge[1]][0]],
  198.             [selected_vectors[edge[0]][1], selected_vectors[edge[1]][1]],
  199.             [selected_vectors[edge[0]][2], selected_vectors[edge[1]][2]],
  200.             "r-",
  201.         )
  202.  
  203.     # Добавляем оси
  204.     ax.set_xlabel("X")
  205.     ax.set_ylabel("Y")
  206.     ax.set_zlabel("Z")
  207.     plt.show()
  208.  
  209.  
  210. def modify_graph(
  211.     G,
  212.     selected_vectors,
  213.     max_vertex_energy,
  214.     max_edge_energy,
  215.     max_wedge_energy,
  216.     max_energy_wedge,
  217.     edge_combination,
  218.     vectors,
  219.     remaining_indices,
  220. ):
  221.     if max_vertex_energy >= max_edge_energy and max_vertex_energy >= max_wedge_energy:
  222.         print("hello1")
  223.         # Добавляем новую вершину к вершине с наибольшей энергией
  224.         # max_energy_vertex = vertex_energies.index(max_vertex_energy)
  225.         G.add_node(len(selected_vectors))
  226.         G.add_edge(max_energy_vertex, len(selected_vectors))
  227.         selected_vectors, remaining_indices = add_unique_vector(
  228.             vectors, selected_vectors, remaining_indices
  229.         )
  230.         # selected_vectors.append(np.random.randint(-6, 7, 3))  # Добавляем новый вектор
  231.     elif max_edge_energy >= max_vertex_energy and max_edge_energy >= max_wedge_energy:
  232.         print("hello2")
  233.         # Разбиваем ребро с наибольшей энергией новой вершиной
  234.         # edges = list(G.edges)  # Получаем список всех ребер
  235.         # max_energy_edge = edges[edge_energies.index(max_edge_energy)]  # Находим ребро с максимальной энергией
  236.         G.add_node(len(selected_vectors))
  237.         G.add_edge(max_energy_edge[0], len(selected_vectors))
  238.         G.add_edge(max_energy_edge[1], len(selected_vectors))
  239.         G.remove_edge(max_energy_edge[0], max_energy_edge[1])
  240.         selected_vectors, remaining_indices = add_unique_vector(
  241.             vectors, selected_vectors, remaining_indices
  242.         )  # Добавляем новый вектор
  243.     else:
  244.         print("hello3")
  245.         if edge_combination == 1:
  246.             old_edge_length = np.linalg.norm(
  247.                 selected_vectors[max_energy_wedge[0]]
  248.                 - selected_vectors[max_energy_wedge[1]]
  249.             )
  250.             new_edge_length = np.linalg.norm(
  251.                 selected_vectors[max_energy_wedge[0]]
  252.                 - selected_vectors[max_energy_wedge[2]]
  253.             )
  254.             if new_edge_length < old_edge_length:
  255.                 # Удаляем старое ребро и добавляем новое
  256.                 G.remove_edge(max_energy_wedge[0], max_energy_wedge[1])
  257.                 G.add_edge(max_energy_wedge[2], max_energy_wedge[1])
  258.             else:
  259.                 G.remove_edge(max_energy_wedge[0], max_energy_wedge[2])
  260.                 G.add_edge(max_energy_wedge[2], max_energy_wedge[1])
  261.         elif edge_combination == 2:
  262.             old_edge_length = np.linalg.norm(
  263.                 selected_vectors[max_energy_wedge[0]]
  264.                 - selected_vectors[max_energy_wedge[1]]
  265.             )
  266.             new_edge_length = np.linalg.norm(
  267.                 selected_vectors[max_energy_wedge[1]]
  268.                 - selected_vectors[max_energy_wedge[2]]
  269.             )
  270.             print(f"длина старого ребра: {old_edge_length}")
  271.             print(f"длина нового ребра: {new_edge_length }")
  272.             if new_edge_length < old_edge_length:
  273.                 # Удаляем старое ребро и добавляем новое
  274.                 G.remove_edge(max_energy_wedge[0], max_energy_wedge[1])
  275.                 G.add_edge(max_energy_wedge[0], max_energy_wedge[2])
  276.             else:
  277.                 G.remove_edge(max_energy_wedge[1], max_energy_wedge[2])
  278.                 G.add_edge(max_energy_wedge[0], max_energy_wedge[2])
  279.         elif edge_combination == 3:
  280.             old_edge_length = np.linalg.norm(
  281.                 selected_vectors[max_energy_wedge[0]]
  282.                 - selected_vectors[max_energy_wedge[2]]
  283.             )
  284.             new_edge_length = np.linalg.norm(
  285.                 selected_vectors[max_energy_wedge[1]]
  286.                 - selected_vectors[max_energy_wedge[2]]
  287.             )
  288.             if new_edge_length < old_edge_length:
  289.                 # Удаляем старое ребро и добавляем новое
  290.                 G.remove_edge(max_energy_wedge[0], max_energy_wedge[2])
  291.                 G.add_edge(max_energy_wedge[0], max_energy_wedge[1])
  292.             else:
  293.                 G.remove_edge(max_energy_wedge[2], max_energy_wedge[1])
  294.                 G.add_edge(max_energy_wedge[0], max_energy_wedge[1])
  295.         # print(max_energy_wedge[0])
  296.         # print(max_energy_wedge[1])
  297.         # print(max_energy_wedge[2])
  298.     return G, selected_vectors, remaining_indices
  299.  
  300.  
  301. # for edges in G.edges:
  302. # print(edges)
  303.  
  304.  
  305. def calculate_psi(g, NP, lambda_):
  306.     return ((g - 1) * NP + 1) ** (1 / lambda_)
  307.  
  308.  
  309. def calculate_probabilities(vectors, selected_vectors, k, num_nearest, g, NP, lambda_):
  310.     # Вычисляем psi
  311.     psi_g = calculate_psi(g, NP, lambda_)
  312.  
  313.     # Вычисляем энергии для всех векторов
  314.     energies = [
  315.         calculate_vertex_energy(vertex, vectors, k, num_nearest) ** psi_g
  316.         for vertex in selected_vectors
  317.     ]
  318.  
  319.     # Вычисляем сумму энергий
  320.     sum_energies = sum(energies)
  321.  
  322.     # Вычисляем вероятности
  323.     probabilities = [energy / sum_energies for energy in energies]
  324.     # print(probabilities)
  325.     return probabilities
  326.  
  327.  
  328. def select_support_vector(vectors, selected_vectors, k, num_nearest, g, NP, lambda_):
  329.     # Вычисляем вероятности
  330.     probabilities = calculate_probabilities(
  331.         vectors, selected_vectors, k, num_nearest, g, NP, lambda_
  332.     )
  333.  
  334.     # Выбираем опорный вектор на основе вероятностей
  335.     id = np.random.choice(len(selected_vectors), p=probabilities)
  336.     support_vector = selected_vectors[id]
  337.  
  338.     return support_vector
  339.  
  340.  
  341. def calculate_A(x_min, x_max, x_r, e):
  342.     return (np.arctan((x_max - x_r) / e) - np.arctan((x_min - x_r) / e)) ** -1
  343.  
  344.  
  345. def calculate_e(i, g, NP):
  346.     return 1 / ((g - 1) * NP + i + 1) ** (1 / 6)
  347.  
  348.  
  349. def generate_potential_offspring(x_min, x_max, x_r, e, A):
  350.     return x_r + e * np.tan((np.random.rand() - 0.5) * A)
  351.  
  352.  
  353. def crossover(selected_vectors, support_vector, potential_offspring, q):
  354.     # Создаем mutant_vectors, равный по размеру selected_vectors
  355.     mutant_vectors = np.copy(selected_vectors)
  356.  
  357.     # Выбираем случайные q индексов
  358.     random_indices = np.random.choice(len(selected_vectors), q, replace=False)
  359.  
  360.     # Заменяем случайные q векторов mutant_vectors на соответствующие векторы из selected_vectors
  361.     for i in random_indices:
  362.         mutant_vectors[i] = selected_vectors[i]
  363.  
  364.     # Для оставшихся векторов
  365.     for l in range(len(selected_vectors)):
  366.         if l not in random_indices:
  367.             # Выбираем случайное число
  368.             p = np.random.rand()
  369.  
  370.             # Вычисляем CR_{l,g}
  371.             CR_lg = 0.9 if p > 0.1 else p
  372.  
  373.             # Для каждой координаты j в векторе
  374.             for j in range(3):
  375.                 # Применяем операцию в зависимости от rand(0,1) и CR_{l,g}
  376.                 if np.random.rand() < 1.0 - CR_lg:
  377.                     mutant_vectors[l, j] = potential_offspring[l, j]
  378.  
  379.     # Заменяем вектор в mutant_vectors, соответствующий support_vector в selected_vectors, на support_vector
  380.     for i in range(len(selected_vectors)):
  381.         if np.array_equal(selected_vectors[i], support_vector):
  382.             mutant_vectors[i] = support_vector
  383.  
  384.     return mutant_vectors
  385.  
  386.  
  387. def generate_offspring(selected_vectors, support_vector, g, NP, lambda_):
  388.     # Вычисляем x_min и x_max для каждой координаты
  389.     x_min = np.min(selected_vectors, axis=0)
  390.     x_max = np.max(selected_vectors, axis=0)
  391.  
  392.     # Создаем список для хранения потенциальных потомков
  393.     potential_offspring = []
  394.  
  395.     # Для каждого вектора в selected_vectors
  396.     for i in range(NP):
  397.         # Для каждой координаты в векторе
  398.         for j in range(3):
  399.             # Вычисляем x_r, e и A
  400.             x_r = support_vector[j]
  401.             e = calculate_e(i, g, NP)
  402.             A = calculate_A(x_min[j], x_max[j], x_r, e)
  403.  
  404.             # Генерируем потенциального потомка
  405.             x_star = generate_potential_offspring(x_min[j], x_max[j], x_r, e, A)
  406.  
  407.             # Добавляем потенциального потомка в список
  408.             potential_offspring.append(x_star)
  409.  
  410.     # Преобразуем список потенциальных потомков в массив NumPy
  411.     potential_offspring = np.array(potential_offspring).reshape(NP, 3)
  412.  
  413.     return potential_offspring
  414.  
  415.  
  416. def selection(G, vectors, selected_vectors, mutant_vectors, energy):
  417.     # Для каждого вектора в selected_vectors
  418.     for i in range(len(selected_vectors)):
  419.         vec = selected_vectors
  420.         vec[i] = mutant_vectors[i]
  421.         en = calculate_energy1(G, vectors, vec)
  422.         # print(f'Энергия главная: {energy}')
  423.         # print(f'Энергия пересчитанная: {en}')
  424.         # Если энергия mutant_vectors[i] меньше, чем энергия selected_vectors[i]
  425.         if en < energy:
  426.             # Заменяем selected_vectors[i] на mutant_vectors[i]
  427.             selected_vectors[i] = mutant_vectors[i]
  428.  
  429.     return selected_vectors
  430.  
  431.  
  432. def data():
  433.     n = 12
  434.  
  435.     # Создаем случайную последовательность n-2 от 0 до n-1
  436.     prufer_sequence = np.random.randint(0, n, n - 2)
  437.  
  438.     # Восстанавливаем дерево по коду Прюфера
  439.     G1 = nx.from_prufer_sequence(prufer_sequence)
  440.  
  441.     # Укладываем вершины графа на плоскость методом Фрухтермана-Рейнгольда
  442.     pos = fruchterman_reingold_layout(G1, dim=3)
  443.  
  444.     # Берем точки на ребрах графа
  445.     edge_points = [pos[node] for node in G1.nodes]
  446.     # [(pos[edge[0]] + pos[edge[1]]) / 2 for edge in G.edges]
  447.  
  448.     # Смещаем каждую точку на случайный вектор с нормальным распределением
  449.     vectors = []
  450.     for point in edge_points:
  451.         for _ in range(5):  # Создаем три смещенные точки для каждой точки на ребре
  452.             vectors.append(point + np.random.normal(size=3) * 0.05)
  453.     return vectors
  454.  
  455.  
  456. vertex_k = 2  # Замените на ваше значение для коэффициента аппроксимации вершин
  457. edge_k = 1  # Замените на ваше значение для коэффициента растяжения ребер
  458. wedge_k = 0.25  # Замените на ваше значение для коэффициента изгиба клиньев
  459. np.random.seed(8)
  460.  
  461. vectors = []
  462. vectors = data()
  463.  
  464. max_wedge_energy = (
  465.     -np.inf
  466. )  # Инициализируем максимальную энергию клина как минус бесконечность
  467. max_energy_wedge = None  # Инициализируем клин с максимальной энергией как None
  468. edge_combination = 0
  469. max_vertex_energy = -np.inf
  470. max_edge_energy = -np.inf
  471. max_energy_vertex = 0
  472. max_energy_edge = None
  473.  
  474.  
  475. # Выбираем три случайные точки (вектора)
  476. indices = np.random.choice(len(vectors), 3, replace=False)
  477. selected_vectors = [vectors[i] for i in indices]
  478. # print(indices)
  479. # Создаем список всех индексов
  480. all_indices = set(range(len(vectors)))
  481.  
  482. # Удаляем уже выбранные индексы
  483. remaining_indices = list(all_indices - set(indices))
  484.  
  485. # Вычисляем матрицу расстояний между всеми векторами
  486. distances = distance_matrix(selected_vectors, selected_vectors)
  487.  
  488. # Заменяем диагональные элементы на бесконечность
  489. np.fill_diagonal(distances, np.inf)
  490. # print(distances)
  491. # Создаем список пар (расстояние, вектор)
  492. dist_vector_pairs = [
  493.     (np.min(dist), vec) for dist, vec in zip(distances, selected_vectors)
  494. ]
  495. # print(dist_vector_pairs)
  496. # Сортируем список пар по расстоянию
  497. dist_vector_pairs.sort(key=lambda x: x[0])
  498. # print(dist_vector_pairs)
  499. # Извлекаем отсортированные векторы
  500. sorted_vectors = [pair[1] for pair in dist_vector_pairs]
  501. # print(sorted_vectors)
  502. selected_vectors = sorted_vectors
  503. # Создаем граф
  504. # Вычисляем матрицу расстояний между всеми векторами
  505. distances = distance_matrix(selected_vectors, selected_vectors)
  506. # Заменяем диагональные элементы на бесконечность
  507. np.fill_diagonal(distances, np.inf)
  508. # print(distances)
  509. G = nx.Graph()
  510.  
  511. # Добавляем вершины в граф
  512. for i in range(len(selected_vectors)):
  513.     G.add_node(i)
  514.  
  515. visited = set()  # Создаем множество для хранения посещенных вершин
  516. for i in range(len(selected_vectors)):
  517.     # Находим ближайшую вершину к текущей вершине
  518.     nearest_vertex = np.argmin(distances[i])
  519.     # print("ближайшие вершины")
  520.     # print(i, nearest_vertex)
  521.  
  522.     # Проверяем, была ли уже посещена ближайшая вершина
  523.     if i not in visited:
  524.         # Если вершина не была посещена, добавляем ребро
  525.         G.add_edge(i, nearest_vertex)
  526.         # Добавляем вершину в множество посещенных вершин
  527.         visited.add(nearest_vertex)
  528.         # print(visited)
  529.     else:
  530.         # Если вершина уже была посещена, пропускаем ее
  531.         # print("пропуск вершины")
  532.         # print(i, nearest_vertex)
  533.         continue
  534.  
  535. # Проверяем, является ли граф связным
  536. connected = len(DFS(G, 0)) == len(G)
  537.  
  538. if not connected:
  539.     # Граф не связный, находим несвязанные компоненты
  540.     components = [list(c) for c in nx.connected_components(G)]
  541.     # Соединяем компоненты, добавляя ребра между их вершинами
  542.     for i in range(len(components) - 1):
  543.         G.add_edge(components[i][0], components[i + 1][0])
  544. # print(f'входные данные: {selected_vectors}')
  545. # visualize_graph(vectors, selected_vectors, G)
  546.  
  547.  
  548. # global max_wedge_energy
  549.  
  550. # print(max_vertex_energy)
  551.  
  552. (
  553.     energy,
  554.     max_vertex_energy,
  555.     max_edge_energy,
  556.     max_wedge_energy,
  557.     max_energy_vertex,
  558.     max_energy_edge,
  559.     max_energy_wedge,
  560.     edge_combination,
  561. ) = calculate_energy(
  562.     G,
  563.     vectors,
  564.     selected_vectors,
  565.     max_vertex_energy,
  566.     max_edge_energy,
  567.     max_wedge_energy,
  568.     max_energy_vertex,
  569.     max_energy_edge,
  570.     max_energy_wedge,
  571.     edge_combination,
  572. )
  573. print(f"Энергия графа: {energy}")
  574. print(f"Энергия точки: {max_vertex_energy}")
  575. print(f"Энергия ребра: {max_edge_energy}")
  576. print(f"Энергия клина: {max_wedge_energy}")
  577. print(f"Энергия комбинация клина: {edge_combination}")
  578.  
  579. # visualize_graph(vectors, selected_vectors, G)
  580. # remaining_indices=modify_graph(G, selected_vectors, max_vertex_energy, max_edge_energy, max_wedge_energy, max_energy_wedge, edge_combination,vectors,remaining_indices)
  581. # visualize_graph(vectors, selected_vectors, G)
  582. NP = 10
  583. # Для каждой итерации g от 1 до NP
  584. # Для каждой итерации от 0 до 10
  585. for iteration in range(5):
  586.     # Для каждой итерации g от 1 до NP
  587.     for g in range(1, NP + 1):
  588.         # Выбираем опорный вектор
  589.         support_vector = select_support_vector(
  590.             vectors, selected_vectors, vertex_k, 2, g, NP, 4
  591.         )
  592.  
  593.         # Генерируем потенциальных потомков
  594.         potential_offspring = generate_offspring(
  595.             selected_vectors, support_vector, g, NP, 1
  596.         )
  597.  
  598.         # Выполняем операцию кроссовера
  599.         mutant_vectors = crossover(
  600.             selected_vectors,
  601.             support_vector,
  602.             potential_offspring,
  603.             int(len(selected_vectors) / 3),
  604.         )
  605.  
  606.         # Выполняем операцию отбора
  607.         selected_vectors = selection(
  608.             G, vectors, selected_vectors, mutant_vectors, energy
  609.         )
  610.     G, selected_vectors, remaining_indices = modify_graph(
  611.         G,
  612.         selected_vectors,
  613.         max_vertex_energy,
  614.         max_edge_energy,
  615.         max_wedge_energy,
  616.         max_energy_wedge,
  617.         edge_combination,
  618.         vectors,
  619.         remaining_indices,
  620.     )
  621.     # visualize_graph(vectors, selected_vectors, G)
  622.     (
  623.         energy,
  624.         max_vertex_energy,
  625.         max_edge_energy,
  626.         max_wedge_energy,
  627.         max_energy_vertex,
  628.         max_energy_edge,
  629.         max_energy_wedge,
  630.         edge_combination,
  631.     ) = calculate_energy(
  632.         G,
  633.         vectors,
  634.         selected_vectors,
  635.         max_vertex_energy,
  636.         max_edge_energy,
  637.         max_wedge_energy,
  638.         max_energy_vertex,
  639.         max_energy_edge,
  640.         max_energy_wedge,
  641.         edge_combination,
  642.     )
  643.     print(f"Энергия графа: {energy}")
  644.     print(f"Энергия точки: {max_vertex_energy}")
  645.     print(f"Энергия ребра: {max_edge_energy}")
  646.     print(f"Энергия клина: {max_wedge_energy}")
  647.     print(f"Энергия комбинация клина: {edge_combination}")
  648. visualize_graph(vectors, selected_vectors, G)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement