Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.02 KB | None | 0 0
  1. #функция, которая получает подграф из матрицы смежности matrix: numpy array, solution:list
  2. def subgraph(matrix, solution):
  3.     #лямбда для поиска индексов 0 и 1
  4.     get_indices = lambda x, xs: [i for (y, i) in zip(xs, range(len(xs))) if x == y]
  5.     #индексы на которых 0 и 1
  6.     indices_zero = get_indices(0,solution)
  7.     indices_one = get_indices(1,solution)
  8.     #переводим матрицу смежности в list
  9.     matrix = matrix.tolist()
  10. #     print (indices_zero, indices_one)
  11.     size = len(matrix)
  12.     shape = len(solution)
  13.     # вставляем нули в строках матрицы
  14.     for i in range (0, size):
  15.         for index in indices_zero:
  16.             matrix[i][index] = 0
  17.     # вставляем нулевые строки
  18.     for index in indices_zero:
  19.         matrix[index] = [0]*size
  20.     return np.array(matrix)
  21. # находим, сколько поимели с графа
  22. def profit(adjacency_matrix):
  23.     # инициализируем нулем
  24.     profit = 0
  25.     # находим размер матрицы смежности
  26.     m = adjacency_matrix.shape[0]
  27.     # идём по верхнему треугольнику
  28.     for i in range (0, m):
  29.         for j in range (i+1,m):
  30.             if i == j:
  31.                 # если это вершина, то прибавляем её вес на коэффициент
  32.                 profit+=0.5*adjacency_matrix[i][j]
  33.             else:
  34.                 # если ребро, то уменьшаем на коэффициент* вес ребра
  35.                 profit-=0.5*adjacency_matrix[i][j]
  36.     return profit
  37. # проверяем, удовлетворяет ли граф бюджетным ограничениям
  38. def check_budget(adjacency_matrix, budget_bound):
  39.     costs = 0
  40.     m = adjacency_matrix.shape[0]
  41.     for i in range (0, m):
  42.         for j in range (i+1,m):
  43.             if i != j:
  44.                 costs+=adjacency_matrix[i][j]
  45.             # вершины не считаем, считаем косты по рёбрам
  46.     if costs <= budget_bound:
  47.         return True
  48.     return False
  49. import itertools
  50. n = 5
  51. #генерим всевозможные комбинации вершин
  52. lst = [list(i) for i in itertools.product([0, 1], repeat=n)]
  53. n = 5
  54. subgraphs = [1]*2**n
  55. graph = Graph(n, 5 ,5)
  56. adj_matr = graph.adjacency_matrix()
  57. vertices = graph.vertices()
  58. # в цикле проходим по всем кандидатам и записываем, какой профит поимели и удовлетворяет ли бюджетным ограничениям
  59. for i in range (0, n):
  60.     adj_matr[i][i] = vertices[0][i]
  61. for i in range(0, 2**n):
  62.     cand = subgraph(adj_matr,lst[i])
  63. #     visualize_graph(cand,vertices)
  64.     subgraphs[i] = (profit(cand), check_budget(cand, 20))
  65. maximum = -np.inf
  66. indices = []
  67. for i in range(0, 2**n):
  68.     if subgraphs[i][1] == True and subgraphs[i][0] >= maximum:
  69.         indices.append(i)
  70.         maximum = subgraphs[i][0]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement