Advertisement
vatman

Untitled

Mar 13th, 2024
394
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 24.25 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.  
  362.     # Заменяем случайные q векторов mutant_vectors на соответствующие векторы из selected_vectors
  363.  
  364.     # Для оставшихся векторов
  365.     for l in range(q, len(selected_vectors_list)):
  366.         for j in range(len(selected_vectors_list[l])):
  367.             # Выбираем случайное число
  368.             p = np.random.rand()
  369.             # Вычисляем CR_{l,g}
  370.             CR_lg = 0.9 if p > 0.1 else p
  371.             # Для каждой координаты j в векторе
  372.             if np.random.rand() < 1.0 - CR_lg:
  373.                 mutant_vectors[l], [j] = selected_vectors_list[l], [j]
  374.  
  375.     return mutant_vectors
  376.  
  377.  
  378. def generate_offspring(selected_vectors_list, support_vector, g, NP):
  379.     # Вычисляем x_min и x_max для каждой координаты
  380.     x_min = []
  381.     x_max = []
  382.     for i in range(len(selected_vectors_list)):
  383.         x_min_i = []
  384.         x_max_i = []
  385.         for j in range(len(selected_vectors_list[i])):
  386.             x_min_i.append(np.min(selected_vectors_list[i][j]))
  387.             x_max_i.append(np.max(selected_vectors_list[i][j]))
  388.         x_min.append(x_min_i)
  389.         x_max.append(x_max_i)
  390.  
  391.     # Создаем список для хранения потенциальных потомков
  392.     potential_offspring = []
  393.  
  394.     # Для каждого вектора в selected_vectors
  395.     for i in range(len(selected_vectors_list)):
  396.         # Для каждой координаты в векторе
  397.         potential_offspring_i = []
  398.         for j in range(len(selected_vectors_list[i])):
  399.             # Вычисляем x_r, e и A
  400.             x_r = support_vector[j]
  401.             e = calculate_e(i, g, NP, len(selected_vectors_list[i]))
  402.             A = calculate_A(-1, 1, x_r, e)
  403.  
  404.             # Генерируем потенциального потомка
  405.             x_star = generate_potential_offspring(x_r, e, A)
  406.  
  407.             # Добавляем потенциального потомка в список
  408.             potential_offspring_i.append(x_star)
  409.         potential_offspring.append(potential_offspring_i)
  410.  
  411.     return potential_offspring
  412.  
  413.  
  414. def selection(G, vectors, selected_vectors, mutant_vectors, energy):
  415.     # Для каждого вектора в selected_vectors
  416.     for i in range(len(selected_vectors)):
  417.         vec = selected_vectors
  418.         vec[i] = mutant_vectors[i]
  419.         en = calculate_energy1(G, vectors, vec)
  420.  
  421.         if en < energy:
  422.             selected_vectors[i] = mutant_vectors[i]
  423.  
  424.     return selected_vectors
  425.  
  426.  
  427. def data():
  428.     n = 12
  429.  
  430.     # Создаем случайную последовательность n-2 от 0 до n-1
  431.     prufer_sequence = np.random.randint(0, n, n - 2)
  432.  
  433.     # Восстанавливаем дерево по коду Прюфера
  434.     G1 = nx.from_prufer_sequence(prufer_sequence)
  435.  
  436.     # Укладываем вершины графа на плоскость методом Фрухтермана-Рейнгольда
  437.     pos = fruchterman_reingold_layout(G1, dim=3)
  438.  
  439.     # Берем точки на ребрах графа
  440.     edge_points = [pos[node] for node in G1.nodes]
  441.     # [(pos[edge[0]] + pos[edge[1]]) / 2 for edge in G.edges]
  442.  
  443.     # Смещаем каждую точку на случайный вектор с нормальным распределением
  444.     vectors = []
  445.     for point in edge_points:
  446.         for _ in range(5):  # Создаем три смещенные точки для каждой точки на ребре
  447.             vectors.append(point + np.random.normal(size=3) * 0.05)
  448.     return vectors
  449.  
  450.  
  451. def visualize_graphs(vectors, graphs, selected_vectors_list):
  452.     fig = plt.figure()
  453.     ax = fig.add_subplot(111, projection="3d")
  454.  
  455.     # Отображаем все векторы на графике
  456.     for vector in vectors:
  457.         ax.scatter(vector[0], vector[1], vector[2], color="b")
  458.     color_i = [
  459.         "red",
  460.         "blue",
  461.         "green",
  462.         "yellow",
  463.         "orange",
  464.         "lightcoral",
  465.         "darkorange",
  466.         "olive",
  467.         "teal",
  468.         "violet",
  469.         "skyblue",
  470.     ]
  471.     # Отображаем выбранные векторы на графике
  472.     for i in range(len(selected_vectors_list)):
  473.         for vector in selected_vectors_list[i]:
  474.             ax.scatter(vector[0], vector[1], vector[2], color=color_i[i % len(color_i)])
  475.  
  476.     # Добавляем ребра между вершинами
  477.     for i in range(len(graphs)):
  478.         for edge in graphs[i].edges:
  479.             ax.plot(
  480.                 [
  481.                     selected_vectors_list[i][edge[0]][0],
  482.                     selected_vectors_list[i][edge[1]][0],
  483.                 ],
  484.                 [
  485.                     selected_vectors_list[i][edge[0]][1],
  486.                     selected_vectors_list[i][edge[1]][1],
  487.                 ],
  488.                 [
  489.                     selected_vectors_list[i][edge[0]][2],
  490.                     selected_vectors_list[i][edge[1]][2],
  491.                 ],
  492.                 color_i[i % len(color_i)],
  493.             )
  494.  
  495.     # Добавляем оси
  496.     ax.set_xlabel("X")
  497.     ax.set_ylabel("Y")
  498.     ax.set_zlabel("Z")
  499.     plt.show()
  500.  
  501.  
  502. def create_auxiliary_variables(NP):
  503.     max_wedge_energy = [-np.inf] * NP
  504.     max_energy_wedge = [None] * NP
  505.     edge_combination = [0] * NP
  506.     max_vertex_energy = [-np.inf] * NP
  507.     max_edge_energy = [-np.inf] * NP
  508.     max_energy_vertex = [0] * NP
  509.     max_energy_edge = [None] * NP
  510.     return (
  511.         max_wedge_energy,
  512.         max_energy_wedge,
  513.         edge_combination,
  514.         max_vertex_energy,
  515.         max_edge_energy,
  516.         max_energy_vertex,
  517.         max_energy_edge,
  518.     )
  519.  
  520.  
  521. def DFS(G, v, visited=None):
  522.     if visited is None:
  523.         visited = set()
  524.     visited.add(v)
  525.     for neighbour in G[v]:
  526.         if neighbour not in visited:
  527.             DFS(G, neighbour, visited)
  528.     return visited
  529.  
  530.  
  531. def generate_graphs(vectors, NP):
  532.     graphs = []
  533.     selected_vectors_list = []
  534.     remaining_indices_list = []
  535.  
  536.     for _ in range(NP):
  537.         indices = np.random.choice(len(vectors), 3, replace=False)
  538.         selected_vectors = [vectors[i] for i in indices]
  539.         all_indices = set(range(len(vectors)))
  540.         remaining_indices = list(all_indices - set(indices))
  541.  
  542.         distances = distance_matrix(selected_vectors, selected_vectors)
  543.         np.fill_diagonal(distances, np.inf)
  544.  
  545.         dist_vector_pairs = [
  546.             (np.min(dist), vec) for dist, vec in zip(distances, selected_vectors)
  547.         ]
  548.         dist_vector_pairs.sort(key=lambda x: x[0])
  549.         sorted_vectors = [pair[1] for pair in dist_vector_pairs]
  550.         selected_vectors = sorted_vectors
  551.  
  552.         distances = distance_matrix(selected_vectors, selected_vectors)
  553.         np.fill_diagonal(distances, np.inf)
  554.  
  555.         G = nx.Graph()
  556.         for i in range(len(selected_vectors)):
  557.             G.add_node(i)
  558.  
  559.         visited = set()
  560.         for i in range(len(selected_vectors)):
  561.             nearest_vertex = np.argmin(distances[i])
  562.             if i not in visited:
  563.                 G.add_edge(i, nearest_vertex)
  564.                 visited.add(nearest_vertex)
  565.  
  566.         connected = len(DFS(G, 0)) == len(G)
  567.         if not connected:
  568.             components = [list(c) for c in nx.connected_components(G)]
  569.             for i in range(len(components) - 1):
  570.                 G.add_edge(components[i][0], components[i + 1][0])
  571.  
  572.         graphs.append(G)
  573.         selected_vectors_list.append(selected_vectors)
  574.         remaining_indices_list.append(remaining_indices)
  575.  
  576.     return graphs, selected_vectors_list, remaining_indices_list
  577.  
  578.  
  579. if __name__ == "__main__":
  580.     vertex_k = 10  # Замените на ваше значение для коэффициента аппроксимации вершин
  581.     edge_k = 100  # Замените на ваше значение для коэффициента растяжения ребер
  582.     wedge_k = 10  # Замените на ваше значение для коэффициента изгиба клиньев
  583.     NP = 5
  584.     np.random.seed(8)
  585.  
  586.     vectors = []
  587.     vectors = data()
  588.  
  589.     graphs, selected_vectors_list, remaining_indices_list = generate_graphs(vectors, NP)
  590.     (
  591.         max_wedge_energy,
  592.         max_energy_wedge,
  593.         edge_combination,
  594.         max_vertex_energy,
  595.         max_edge_energy,
  596.         max_energy_vertex,
  597.         max_energy_edge,
  598.     ) = create_auxiliary_variables(NP)
  599.     # visualize_graphs(vectors, graphs,selected_vectors_list)
  600.     # print(calculate_probabilities(vectors,graphs, selected_vectors_list, vertex_k,edge_k,wedge_k, 1, NP, 1))
  601.     for i in range(2250):
  602.         support_vector = select_support_vector(
  603.             vectors, graphs, selected_vectors_list, vertex_k, edge_k, wedge_k, 1, NP, 1
  604.         )
  605.         potential_offspring = generate_offspring(
  606.             selected_vectors_list, support_vector, 1, NP
  607.         )
  608.         # visualize_graphs(vectors, graphs, potential_offspring)
  609.         mutant_vectors = crossover(selected_vectors_list, potential_offspring, 3)
  610.         for j in range(len(mutant_vectors)):
  611.             energy_mutant = calculate_energy1(graphs[j], vectors, mutant_vectors[j])
  612.             energy_selected = calculate_energy1(
  613.                 graphs[j], vectors, selected_vectors_list[j]
  614.             )
  615.             if energy_mutant < energy_selected:
  616.                 selected_vectors_list[j] = mutant_vectors[j]
  617.     visualize_graphs(vectors, graphs, mutant_vectors)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement