def twice_around(G): mst = mst_prim(G) di_mst = mst.to_directed() euler = nx.eulerian_circuit(di_mst,random.randint(0, len(G.nodes())-1)) # o problema está aqui edges = list(euler) weight = 0 for i in edges: weight += G.edge[i[0]][i[1]]['weight'] path = [] for i in list(edges): if i[0] not in path: path.append(i[0]) if i[1] not in path: path.append(i[1]) return weight, path
def twice_around(G): mst = mst_prim(G) di_mst = mst.to_directed() euler = nx.eulerian_circuit(di_mst, random.randint( 0, len(G.nodes()) - 1)) # o problema está aqui edges = list(euler) weight = 0 for i in edges: weight += G.edge[i[0]][i[1]]['weight'] path = [] for i in list(edges): if i[0] not in path: path.append(i[0]) if i[1] not in path: path.append(i[1]) return weight, path
def compute(self): if self.edges == []: self.draw() if self.edges != []: self.compute() else: edges = self.edges if edges != []: # calculating the mst with prim algorithm prim, keys = mst_prim(self.graph, self.startV) self.mst_g = Graph(mst_to_edges(prim, keys)) self.find_changes() self.changeToggle = np.zeros(self.stepCnt) self.inputEntry.delete(0, END) self.edges = [] self.startPoints.delete(0, END) else: graphCheck = "ERROR : edges is empty There isn't a graph." mbox.showerror('No Graph', graphCheck)
import numpy as np import matplotlib.pyplot as plt import networkx as nx from prim import mst_prim A = np.loadtxt('ha30_dist.txt', dtype=int) G = nx.from_numpy_matrix(A) r = 1 mst = mst_prim(G, r) nx.draw(mst, with_labels=True) plt.draw() plt.show()
def mst_community_remove_edges(): # Comandos em python para leitura de um grafo a partir de uma matriz de # adjacencia gravada em arquivo texto # Resolve o caminho absoluto abs_path = os.path.abspath("sgb128_dist.txt") pre_path = abs_path[:-(len("sgb128_dist.txt") + 4)] # Executa para cada dataset individual dataset_list = ['uk12', 'wg59', 'sgb128'] for dataset in dataset_list: # Verifica o sistema operacional if platform.system() == 'Linux': dataset_dist = pre_path + 'dataset/' + dataset + '_dist.txt' dataset_name = pre_path + 'dataset/' + dataset + '_name.txt' elif platform.system() == 'Windows': dataset_dist = pre_path + 'dataset\\' + dataset + '_dist.txt' dataset_name = pre_path + 'dataset\\' + dataset + '_name.txt' a = np.loadtxt(dataset_dist) # labels = np.loadtxt(dataset_name, dtype=basestring, delimiter='\n') # Obtem as coordenadas em que o peso eh nao-nulo (diagonal principal) rows, cols= np.where(a > 0) # Obtem o peso de cada uma das arestas weight = [a[rows[i],cols[i]] for i in range(0, len(rows))] # Cria lista de arestas com e sem peso edges_with_weight = zip(rows.tolist(), cols.tolist(), weight) # Cria um grafo vazio usando a biblioteca NetworkX g = nx.Graph() # Insert nodes from an edge and it's weight for i in range(0, len(rows)): g.add_edge(edges_with_weight[i][0], edges_with_weight[i][1], weight=edges_with_weight[i][2]) # Executa o algoritmo de Prim para extrair a MST do grafo mst = mst_prim(g) # Plota resultados, é necessário que seja salvo na mão. # Opção de layout de grafo usado foi o Fruchterman & Reingold plt.figure(1, figsize=(15,15)) # Cria figura para desenhar grafo: 15 eh a dimensao da imagem # Coordenadas mantém as coordenadas dos vértices do grafo coordinates = nx.spring_layout(mst) # Salva a primeira imagem nx.draw(mst, coordinates, node_size=350, font_size=10, edge_width=1, alpha=0.5, arrows=False, with_labels=True) plt.savefig(dataset+'.png') # Outros formatos: pdf, svg, ... plt.show() # Função que ordena inversamente pelo peso, por causa da função lambda utilizada edges_by_weight = sorted([(i,j,mst.edge[i][j]['weight']) for i,j in mst.edges()], key=lambda a:a[2], reverse=True) name_counter = 0 # Remoção das arestas com maior peso para a detecção de comunidades # Press "e" to exit print "'Enter' para remover uma aresta, 'e' para passar para o próximo grafo, ou sair do programa no último grafo" while raw_input() != "e": print "Removendo a aresta de maior peso!" # Remoção efetiva da aresta que possui o maior peso mst.remove_edge(edges_by_weight[0][0], edges_by_weight[0][1]) edges_by_weight = edges_by_weight[1:] # Salvar a imagem sem a aresta de maior peso plt.figure(1, figsize=(15,15)) nx.draw(mst, coordinates, node_size=350, font_size=10, edge_width=1, alpha=0.5, arrows=False, with_labels=True) plt.savefig(dataset + '_img' + str(name_counter) + '.png') # Outros formatos: pdf, svg, ... plt.show() name_counter += 1