Advertisement
Guest User

Untitled

a guest
Jan 27th, 2020
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.89 KB | None | 0 0
  1. from algorithm.connectedness import isConnected
  2. from graph.graph import Graph
  3. import numpy as np
  4.  
  5.  
  6. def search_min(tr, vizited):  # 1 место для оптимизации
  7.     min = np.inf
  8.     for ind in vizited:
  9.         for index, elem in enumerate(tr[ind]):
  10.             if 0 < elem < min and index not in vizited:
  11.                 min = elem  # веса путей
  12.                 index2 = index  # индекс города
  13.                 index3 = ind
  14.     return [min, index2, index3]
  15.  
  16.  
  17. def prima(matr, oriented):
  18.     if not oriented:
  19.         sv = isConnected(matr, oriented)
  20.         if sv == "Граф не связный":
  21.             return sv
  22.     else:
  23.         return "Граф ориентированный"
  24.     toVisit = [i for i in range(1, len(matr))]  # города кроме начального(0)
  25.     vizited = [0]
  26.     result = [0]  # начнем с минска
  27.     size = len(matr)
  28.     g = [[0]*size for i in range(size)]
  29.     for index in toVisit:
  30.         weight, ind1, ind2 = search_min(matr, vizited)
  31.         g[ind1][ind2] = weight
  32.         g[ind2][ind1] = weight
  33.         result.append(weight)  # в результат будут заноситься веса
  34.         vizited.append(ind1)  # содержит карту пути
  35.  
  36.     gr = Graph.from_matrix(g)
  37.     gr.oriented = False
  38.     return gr
  39.  
  40.  
  41. def kruscal(graph):
  42.     if not graph.oriented:
  43.         sv = isConnected(graph.to_matrix(), graph.oriented)
  44.         if sv == "Граф не связный":
  45.             return sv
  46.     else:
  47.         return "Граф ориентированный"
  48.     size = graph.size()
  49.     edges = []
  50.     for v in graph.vertexes:
  51.         for to in graph.vertexes[v]:
  52.             edge = []
  53.             edge.append(graph.vertexes[v][to][0][0])
  54.             edge.append(int(v) - 1)
  55.             edge.append(int(to) - 1)
  56.             edges.append(edge)
  57.  
  58.     for i in edges:
  59.         for j in edges:
  60.             if i[0] == j[0] and i[1] == j[2] and i[2] == j[1] and i != j:
  61.                 edges.remove(j)
  62.     edges.sort()
  63.  
  64.     tree = []
  65.     cost = 0
  66.     g = [[0]*size for i in range(size)]
  67.     for i in range(size):
  68.         tree.append(i)
  69.     for i in range(len(edges)):
  70.         a = edges[i][1]
  71.         b = edges[i][2]
  72.         l = edges[i][0]
  73.         if tree[a] != tree[b]:
  74.             cost += l
  75.             g[a][b] = l
  76.             g[b][a] = l
  77.             old_id = tree[b]
  78.             new_id = tree[a]
  79.             for j in range(size):
  80.                 if tree[j] == old_id:
  81.                     tree[j] = new_id
  82.  
  83.     gr = Graph.from_matrix(g)
  84.     gr.oriented = graph.oriented
  85.  
  86.     return gr
  87.  
  88.  
  89. def boruvki(graph):
  90.     if not graph.oriented:
  91.         sv = isConnected(graph.to_matrix(), graph.oriented)
  92.         if sv == "Граф не связный":
  93.             return sv
  94.     else:
  95.         return "Граф ориентированный"
  96.     size = graph.size()
  97.     edges = []
  98.     for v in graph.vertexes:
  99.         for to in graph.vertexes[v]:
  100.             edge = []
  101.             edge.append(graph.vertexes[v][to][0][0])
  102.             edge.append(int(v) - 1)
  103.             edge.append(int(to) - 1)
  104.             edges.append(edge)
  105.  
  106.     for i in edges:
  107.         for j in edges:
  108.             if i[0] == j[0] and i[1] == j[2] and i[2] == j[1] and i != j:
  109.                 edges.remove(j)
  110.     edges.sort()
  111.  
  112.     tree = []
  113.     cost = 0
  114.     g = [[0]*size for i in range(size)]
  115.     for i in range(size):
  116.         tree.append(i)
  117.     for i in range(len(edges)):
  118.         a = edges[i][1]
  119.         b = edges[i][2]
  120.         l = edges[i][0]
  121.         if tree[a] != tree[b]:
  122.             cost += l
  123.             g[a][b] = l
  124.             g[b][a] = l
  125.             old_id = tree[b]
  126.             new_id = tree[a]
  127.             for j in range(size):
  128.                 if tree[j] == old_id:
  129.                     tree[j] = new_id
  130.  
  131.     gr = Graph.from_matrix(g)
  132.     gr.oriented = graph.oriented
  133.  
  134.     return gr
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement