1
python新增了。嘗試使用networkX包來完成工作,但它似乎比「創建列表清單」來表示圖形的運行時間要長得多。那是因爲nextworkX的數據結構對於這個簡單的任務太多了嗎? 順便說一句,結果會輸出兩倍的答案。因爲read_adjlist函數將爲文件中的u和v節點計算相同的邊兩次。有什麼辦法可以避免這種情況,並允許識別並行邊緣?使用networkX的karger min cut算法運行時間很慢
謝謝大家。
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
剛上爲什麼這是一個緩慢的快速評論:'nx.contracted_edge'返回與一個全新的圖形邊收縮。它僅保留原始圖。所以每次通過'cut'中的'while'時,它會生成一個新圖。這可能是減慢速度的原因。您可以通過創建自己的函數來避免這種情況,以收縮修改圖形的邊。如果你這樣做,你應該發送一份G而不是G的副本。 – Joel
是的,契約功能保持原來的完好無損。但G是功能削減中的局部變量,並在每次收縮時得到更新。 for循環中的G始終是相同的,但是在每次迭代時發送的副本都將被剪切。 @joel – Michael
我的觀點是這很慢。每次調用'nx.contracted_edge'時,都會創建一個新圖。這意味着,所有的節點和所有的邊都被重新創建。這幾乎可以肯定是運行時的絕大部分。如果您只需在「剪切」之前創建一個副本,然後修改該副本,則不必每次都重新創建一個新圖。 – Joel