Advertisement
vatman

Untitled

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