• Source
    1.  
    2. def cria(G, pesos, pos):
    3.  
    4. """
    5. Descrição
    6. mesma funçao de plot_weighted_graph, mas nao eh necessario calcular
    7. os pesos das arestas, que ja foram definidos em plot_weighted_graph
    8. e agora serão reutilizados.
    9. tambem são reaproveitados as posiçoes dos vertices e arestas
    10. definidas na outra função
    11. """
    12. plt.figure();
    13.  
    14. # plotar vertices
    15. nx.draw_networkx_nodes(G, pos);
    16. # plotar rótulos dos vertices
    17. nx.draw_networkx_labels(G, pos);
    18. # plotar arestas
    19. nx.draw_networkx_edges(G, pos);
    20.  
    21.  
    22. # plotar rótulos das arestas
    23. nx.draw_networkx_edge_labels(
    24. G, pos, edge_labels=pesos, font_size=10, font_family='sans-serif');
    25. # plotar G
    26. plt.show();
    27.  
    28.  
    29.  
    30. a = np.loadtxt('cidades2.txt')
    31.  
    32. # Obtem as coordenadas em que o peso é não-nulo
    33. rows, cols = np.where(a>0)
    34.  
    35. # Cria lista de arestas
    36. edges = zip(rows.tolist(), cols.tolist())
    37.  
    38. # Cria um grafo vazio usando NetworkX
    39. g = nx.Graph()
    40.  
    41. # Insere arestas (cria vértices automaticamente)
    42. g.add_edges_from(edges)
    43.  
    44.  
    45. G = nx.Graph()
    46.  
    47. G.add_edge(1,2 , weighted = 4)
    48. G.add_edge(1,8 , weighted = 8)
    49. G.add_edge(8,2, weighted = 11)
    50. G.add_edge(8,9 , weighted = 7)
    51. G.add_edge(8,7 , weighted = 1)
    52. G.add_edge(9,3 , weighted = 2)
    53. G.add_edge(9,7 , weighted = 6)
    54. G.add_edge(2,3 , weighted = 8)
    55. G.add_edge(3,4 , weighted = 7)
    56. G.add_edge(3,6 , weighted = 4)
    57. G.add_edge(4,6 , weighted = 14)
    58. G.add_edge(4,5 , weighted = 9)
    59. G.add_edge(5,6 , weighted = 10)
    60. G.add_edge(6,7 , weighted = 2)
    61.  
    62. # Mostra vértices e arestas
    63.  
    64.  
    65. x, pos = Prim_Algorithm(g, 1, a)
    66. # x = MST, pos = posiçao definitiva dos vertices e arestas
    67.  
    68.  
    69. pesos = { (u, v): data['weight'] for u, v, data in x.edges(data=True) }
    70. #dicionario com os pesos das arestas da MST
    71.  
    72.  
    73. p_ordenado = sorted(pesos.items(), key=operator.itemgetter(1))
    74. # transforma em lista e ordena as arestas do menor para maior peso
    75.  
    76. #gera com 4 comudidades
    77. #for x in range(1, 4):
    78. # gera 3 comunidades
    79. for x in range(1, 3):
    80. # com tres grupos: range(1, 3) ---- com quatro grupos: range(1, 4)
    81. del p_ordenado[len(p_ordenado) -1]
    82. # retira as k arestas mais custosas
    83.  
    84. d = dict(p_ordenado)
    85. # transforma novamente em dicionario após retirar as arestas
    86.  
    87. grafo = nx.Graph()
    88. grafo.add_edges_from(d)
    89. cria(grafo, d, pos)
    90. # esse eh o grafo em que estão mostrados os grupos