NetworkX系列教程(10)-算法之二:最小/大生成樹問題


重頭戲部分來了,寫到這里我感覺得仔細認真點了,可能在NetworkX中,實現某些算法就一句話的事,但是這個算法是做什么的,用在什么地方,原理是怎么樣的,不清除,所以,我決定先把圖論中常用算法弄個明白在寫這部分.

圖論常用算法看我的博客:

下面我將使用NetworkX實現上面的算法,建議不清楚的部分打開兩篇博客對照理解.
我將圖論的經典問題及常用算法的總結寫在下面兩篇博客中:
圖論---問題篇
圖論---算法篇

目錄:
* 11.2最小/最大生成樹問題
* 11.2.1最小生成樹
* 11.2.2最大生成樹


注意:如果代碼出現找不庫,請返回第一個教程,把庫文件導入.

11.2最小/最大生成樹問題

先構建graph,后面最小最大生成樹在這個graph上求.

  1. #生成graph 
  2. G.clear() 
  3. G = nx.Graph() 
  4. G.add_weighted_edges_from([('0','1',2),('0','2',7),('1','2',3),('1','3',8),('1','4',5),('2','3',1),('3','4',4)]) 
  5.  
  6. #邊和節點信息 
  7. edge_labels = nx.get_edge_attributes(G,'weight')  
  8. labels={'0':'0','1':'1','2':'2','3':'3','4':'4'
  9.  
  10. #生成節點位置  
  11. pos=nx.spring_layout(G)  
  12.  
  13. #把節點畫出來  
  14. nx.draw_networkx_nodes(G,pos,node_color='g',node_size=500,alpha=0.8)  
  15.  
  16. #把邊畫出來  
  17. nx.draw_networkx_edges(G,pos,width=1.0,alpha=0.5,edge_color=['b','r','b','r','r','b','r'])  
  18.  
  19. #把節點的標簽畫出來  
  20. nx.draw_networkx_labels(G,pos,labels,font_size=16)  
  21.  
  22. #把邊權重畫出來  
  23. nx.draw_networkx_edge_labels(G, pos, edge_labels)  
  24.  
  25. #顯示graph 
  26. plt.title('有權圖',fontproperties=myfont) 
  27. plt.axis('on'
  28. plt.xticks([]) 
  29. plt.yticks([]) 
  30. plt.show() 

最小/最大生成樹示例
最小/最大生成樹示例

注:基本上,圖示的紅色線是最小生成樹,藍色是最大生成樹,最小最大生成樹都包含1-2這條邊


11.2.1最小生成樹

  1. #求得最小生成樹,algorithm可以是kruskal,prim,boruvka一種,默認是kruskal 
  2. KA = nx.minimum_spanning_tree(G,algorithm='kruskal'
  3. print(KA.edges(data=True)) 
  4.  
  5. #直接拿到構成最小生成樹的邊,algorithm可以是kruskal,prim,boruvka一種,默認是kruskal 
  6. mst = nx.minimum_spanning_edges(G, algorithm='kruskal', data=False
  7. edgelist = list(mst) 
  8. print(edgelist) 

輸出:

  1. [('3', '4', {'weight': 4}), ('3', '2', {'weight': 1}), ('0', '1', {'weight': 2}), ('2', '1', {'weight': 3})] 
  2. [('3', '2'), ('0', '1'), ('1', '2'), ('4', '3')] 

11.2.2最大生成樹

  1. #返回無向圖G上的最大生成樹或森林。 
  2. T = nx.maximum_spanning_tree(G) 
  3. print(sorted(T.edges(data=True))) 
  4.  
  5. #直接拿到構成最大生成樹,algorithm可以是kruskal,prim,boruvka一種,默認是kruskal 
  6. mst = nx.tree.maximum_spanning_edges(G, algorithm='kruskal', data=False
  7. edgelist = list(mst) 
  8. print(edgelist) 

輸出:

  1. [('0', '2', {'weight': 7}), ('1', '4', {'weight': 5}), ('2', '1', {'weight': 3}), ('3', '1', {'weight': 8})] 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM