使用networkX的karger min cut算法运行时间非常慢

时间:2016-07-04 23:52:59

标签: python performance networkx

python新手。尝试使用networkX包来完成工作,但它似乎比#34;创建列表列表更长的运行时间"代表图。那只是因为nextworkX的数据结构对于这个简单的任务来说太过分了吗? 顺便说一句,结果将输出两倍的答案。因为read_adjlist函数将为文件中的u和v节点计算两次相同的边。有没有办法避免这种情况,并且还允许识别平行边缘?

谢谢大家。

import networkx as nx
import random

Graph_Adjacency_List = "***.txt"
handle = open(Graph_Adjacency_List, 'r')
G=nx.read_adjlist(handle,create_using=nx.MultiGraph(), nodetype=int)

def cut(G):
    while G.number_of_nodes()>2 :
        u,v= random.choice(G.edges())
        G = nx.contracted_edge(G, (u, v), self_loops=False)
    return G.number_of_edges()

m=100
for i in range(1000):
    random.seed()
    c=cut(G)
    if c< m:
        m=c
        print m

1 个答案:

答案 0 :(得分:2)

为了解决边缘的重复计算问题,我简单地回复了:

int(G.number_of_edges()/2)

而不是:

G.number_of_edges()

为了解决算法速度慢的问题,我没有使用nx.contracted_edge,该函数返回一个新图形,花费了很多时间,就像其他人评论一样。我做了适当的操作,查看nx.contracted_edge的源代码并用G交换H:

new_edges = ((u, w, d) for x, w, d in G.edges(v, data=True)
                 if False or w != u)
v_data = G.node[v]
G.remove_node(v)
G.add_edges_from(new_edges)
if 'contraction' in G.node[u]:
    G.node[u]['contraction'][v] = v_data
else:
    G.node[u]['contraction'] = {v: v_data}