Hướng dẫn python networkx topological sort - sắp xếp cấu trúc liên kết mạng python

________ 4 (g, nbunch = none, lùi = sai) [nguồn] ¶(G, nbunch=None, reverse=False)[source]

Trả về một danh sách các nút theo thứ tự sắp xếp cấu trúc.

Một loại tôpô là một hoán vị không liên quan đến các nút sao cho một cạnh từ u đến v ngụ ý rằng u xuất hiện trước v theo thứ tự sắp xếp tôpô.

Parameters:
  • G (Digraph NetworkX) - Đồ thị có hướng (NetworkX digraph) – A directed graph
  • Nbunch (container của các nút (tùy chọn)) - Khám phá biểu đồ theo thứ tự được chỉ định được đưa ra trong nbunch (container of nodes (optional)) – Explore graph in specified order given in nbunch
  • Đảo ngược (Bool, Tùy chọn) - Trở lại bưu điện thay vì đặt hàng trước nếu đúng. Chế độ ngược lại hiệu quả hơn một chút. (bool, optional) – Return postorder instead of preorder if True. Reverse mode is a bit more efficient.
Raises:
  • NetworkXError - Sắp xếp cấu trúc liên kết chỉ được xác định cho các biểu đồ có hướng. Nếu đồ thị G không được hướng dẫn, mạng lưới mạng được nâng lên.
  • NetworkXUnfeasible - Nếu G không phải là biểu đồ acyclic có định hướng (DAG), không có loại tô pô nào tồn tại và một ngoại lệ mạng lưới được nâng lên.

Ghi chú

Thuật toán này dựa trên một mô tả và bằng chứng trong hướng dẫn thiết kế thuật toán [1].

Người giới thiệu

[1]Skiena, S. S. Hướng dẫn thiết kế thuật toán (Springer-Verlag, 1998). http://www.amazon.com/exec/obidos/asin/0387948600/ref=ase_ThealGorithMrepo/

Coppological_sort (g) [Nguồn]#(G)[source]#

Trả về một máy phát các nút theo thứ tự được sắp xếp về mặt cấu trúc.

Một loại tôpô là một hoán vị không liên quan đến các nút của biểu đồ có hướng sao cho một cạnh từ u đến v ngụ ý rằng u xuất hiện trước v theo thứ tự sắp xếp tôpô. Đặt hàng này chỉ hợp lệ nếu biểu đồ không có chu kỳ theo hướng.

Thông số: Digraph GnetWorkx:GNetworkX digraph

Một biểu đồ acyclic được định hướng (DAG)

Năng suất: Các nút: nodes

Mang lại các nút theo thứ tự sắp xếp tôpô.

Raises:NetworkXError:NetworkXError

Loại tôpô được định nghĩa chỉ cho các biểu đồ có hướng. Nếu đồ thị G không được điều khiển, một NetworkXError sẽ được nâng lên.

NetworkXunfeasible

Nếu G không phải là một biểu đồ acyclic có hướng (DAG), không có loại tô pô tồn tại và ngoại lệ NetworkXUnfeasible được nâng lên. Điều này cũng có thể được nâng lên nếu G được thay đổi trong khi trình lặp được trả về đang được xử lý

Lỗi runtime

Nếu G được thay đổi trong khi trình lặp được trả về đang được xử lý.

Ghi chú

Thuật toán này dựa trên một mô tả và bằng chứng trong phần giới thiệu về các thuật toán: một cách tiếp cận sáng tạo [1].

Người giới thiệu

[1]1]

Manber, U. (1989). Giới thiệu về thuật toán - một cách tiếp cận sáng tạo. Addison-Wesley.

Ví dụ

Để có được thứ tự ngược của loại tôpô:

>>> DG = nx.DiGraph([(1, 2), (2, 3)])
>>> list(reversed(list(nx.topological_sort(DG))))
[3, 2, 1]

Nếu Digraph của bạn một cách tự nhiên có các cạnh đại diện cho các tác vụ/đầu vào và nút đại diện cho con người/quy trình bắt đầu các tác vụ, thì Coppological_sort không hoàn toàn là những gì bạn cần. Bạn sẽ phải thay đổi các nhiệm vụ thành các nút với sự phụ thuộc được phản ánh bởi các cạnh. Kết quả là một loại cấu trúc liên kết của các cạnh. Điều này có thể được thực hiện với

>>> list(nx.topological_sort(nx.line_graph(DG)))
[(1, 2), (2, 3)]
3 như sau:

>>> list(nx.topological_sort(nx.line_graph(DG)))
[(1, 2), (2, 3)]

Tôi đã kiểm tra tập lệnh với dữ liệu trong thế giới thực và vì nó lộn xộn hơn dữ liệu chơi, tôi sẽ không nhận được đầu ra mà tôi thích. Giả sử tôi đã có cái này

df = pd.DataFrame([('A', 'B'), ('A', 'C'), ('B', 'A'), ('C', 'A'), ('C', 'L'), ('D', E'), ('D', 'F'), ('E', 'D'), ('E', 'G'), ('F', 'D'), ('F', 'J'), ('G', 'E'), ('G', K'), ('H', 'I'), ('I', 'H'), ('I', 'J'), ('J', 'F'), ('J', 'I'), ('K', 'G'), ('L', C'), ('M', 'N'), ('N', 'M'), ('N', 'O'), ('O', 'N'), ('O', 'P'), ('P', 'O'), ('P', Q'), ('Q', 'P'), ('Q', 'R'), ('R', 'Q'), ('S', 'T'), ('T', 'S')],, columns=['source','destination'])

vẽ như

Hướng dẫn python networkx topological sort - sắp xếp cấu trúc liên kết mạng python

Mặc dù nhóm hoạt động, chỉ số nhóm bên trong sẽ không.

Nó ném

raise nx.NetworkXUnfeasible(
    "Graph contains a cycle or graph changed during iteration"
) 

Tôi biết rằng trong dữ liệu, a-> b cũng như b-> a có mặt, do đó lỗi chu kỳ.

Ý tưởng đầu tiên của tôi là loại bỏ các dòng trùng lặp, nhưng làm thế nào tôi biết liệu tôi có thể giữ cái này hay cái kia không?

Ở phía dưới bên trái, chúng ta thấy: Nếu l-> c và c-> a, tôi đã nhận được các hàng cho c-> l và a-> c cũng như trong dữ liệu. Do đó, sau khi loại bỏ DUP, tôi có thể kết thúc với C-> L và C-> A, nhưng điều tôi muốn là con đường thực của L-> C và C-> a. Nó dường như xác định đường dẫn và chỉ mục từ nó, tôi phải biết đường dẫn trước để loại bỏ DUPS?

Điều này có phức tạp hay tôi đang nghĩ quá phức tạp?

NB:

>>> list(nx.topological_sort(nx.line_graph(DG)))
[(1, 2), (2, 3)]
4 không làm những gì tôi nghĩ nó sẽ làm.Nó không quan tâm đến con đường, dẫn đến
>>> list(nx.topological_sort(nx.line_graph(DG)))
[(1, 2), (2, 3)]
5 cho phía dưới bên trái, thay vì
>>> list(nx.topological_sort(nx.line_graph(DG)))
[(1, 2), (2, 3)]
6.Nhưng các tài liệu rõ ràng tuyên bố
>>> list(nx.topological_sort(nx.line_graph(DG)))
[(1, 2), (2, 3)]
7 rtfm