コード例 #1
0
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
コード例 #2
0
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
コード例 #3
0
 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)
コード例 #4
0
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()
コード例 #5
0
ファイル: task2.py プロジェクト: jvbrandaom/graph-theory-2015
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