NetworkX系列教程(10)-算法之四:拓撲排序與最大流問題


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

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

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

目錄:
* 11.4拓撲排序算法(TSA)
* 11.5最大流問題


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

11.4拓撲排序算法(TSA)

  1. DG = nx.DiGraph([('a', 'b'), ('a', 'c'),('b', 'e'), ('b', 'd'),('c', 'e'), ('c', 'd'),('d', 'f'), ('f', 'g'), ('e', 'g')]) 
  2.  
  3. #顯示graph 
  4. nx.draw_spring(DG,with_labels=True) 
  5. plt.title('有向無環圖',fontproperties=myfont) 
  6. plt.axis('on') 
  7. plt.xticks([]) 
  8. plt.yticks([]) 
  9. plt.show() 
  10.  
  11. #這個graph拓撲排序序列有很多,這里只給出一種 
  12. print('撲排序序列:',list(nx.topological_sort(DG))) 
  13. print('逆撲排序序列:',list(reversed(list(nx.topological_sort(DG))))) 

拓撲排序算法示例
拓撲排序算法示例

輸出:

拓撲序序列: ['a', 'b', 'c', 'e', 'd', 'f', 'g']
逆拓撲序序列: ['g', 'f', 'd','e', 'c', 'b', 'a']


11.5最大流問題

  1. #構建graph 
  2. G = nx.DiGraph() 
  3. G.add_edge('x','a', capacity=3.0) 
  4. G.add_edge('x','b', capacity=1.0) 
  5. G.add_edge('a','c', capacity=3.0) 
  6. G.add_edge('b','c', capacity=5.0) 
  7. G.add_edge('b','d', capacity=4.0) 
  8. G.add_edge('d','e', capacity=2.0) 
  9. G.add_edge('c','y', capacity=2.0) 
  10. G.add_edge('e','y', capacity=3.0) 
  11. pos=nx.spring_layout(G) 
  12.  
  13. #顯示graph 
  14. edge_labels = nx.get_edge_attributes(G,'capacity') 
  15. nx.draw_networkx_nodes(G,pos) 
  16. nx.draw_networkx_labels(G,pos) 
  17. nx.draw_networkx_edges(G,pos) 
  18. nx.draw_networkx_edge_labels(G, pos,edge_labels) 
  19. plt.axis('on') 
  20. plt.xticks([]) 
  21. plt.yticks([]) 
  22. plt.show() 
  23.  
  24. #求最大流 
  25. flow_value, flow_dict = nx.maximum_flow(G, 'x', 'y') 
  26. print("最大流值: ",flow_value) 
  27. print("最大流流經途徑: ",flow_dict) 

最大流問題示例
最大流問題示例

輸出:

最大流值: 3.0
最大流流經途徑: {'x': {'a': 2.0, 'b': 1.0}, 'c': {'y': 2.0}, 'b': {'c': 0, 'd': 1.0}, 'y': {}, 'd': {'e': 1.0}, 'e': {'y': 1.0}, 'a':{'c': 2.0}}


免責聲明!

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



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