2013-02-06 36 views
8

Tôi rất mới với mã hóa python và tôi đang tìm một thuật toán nhanh chóng tìm thấy tất cả các đường dẫn giữa nút bắt đầu và nút kết thúc cho một biểu đồ rất lớn - có khoảng 1000 nút và 10.000 cạnh. Số lượng đường dẫn thực sự tồn tại từ nút bắt đầu đến nút kết thúc nhỏ - mười hoặc ít hơn. Để giúp bối cảnh hóa câu hỏi nhiều hơn một chút, hãy xem xét mạng xã hội - Nếu tôi có 1000 người bạn và tôi muốn biết có bao nhiêu cách người bạn tốt nhất của tôi từ trường trung học kết nối với bạn cùng phòng của tôi từ đại học, tôi không quan tâm người bạn tốt nhất từ ​​trường trung học được kết nối với tất cả 200 người bạn trung học của tôi bởi vì những con đường đó không bao giờ dẫn đến bạn cùng phòng của tôi. Những gì tôi muốn làm với mã python này là nhanh chóng subset các đường dẫn tồn tại giữa hai người bạn của tôi và về cơ bản có được thoát khỏi tất cả các "tiếng ồn" tồn tại xung quanh hai nút.Thuật toán rất nhanh cho tất cả các đường dẫn giữa hai nút

Tôi đã cố gắng triển khai một số ví dụ về mã, tất cả đều hoạt động tốt trên các biểu đồ nhỏ, đơn giản. Tuy nhiên, khi tôi cố gắng kết hợp chúng vào phân tích biểu đồ lớn, tất cả chúng đều mất quá nhiều thời gian để có ích.

Tất cả các bạn có gợi ý về phương pháp điều tra hay không. python để theo đuổi? Hãy nhớ, tôi là một newbie python.

+0

Dịch một trong những giải pháp trong bài viết này để python: http://stackoverflow.com/questions/58306/ đồ thị-thuật toán-to-tìm-tất cả các kết nối-giữa-hai-tùy ý-đỉnh –

+0

Ngoài ra, điều này: http://stackoverflow.com/questions/8922060/breadth-first-search-trace-path –

+1

Thách thức là biết khi bạn đã tìm thấy tất cả. Tôi không nghĩ rằng đó là có thể mà không kiểm tra một số lượng lớn các nút. Các thuật toán không thể bỏ bê 200 bạn bè của bạn, vì nó không thể biết (mà không kiểm tra chúng, và bạn bè của họ hơn nữa) mà họ không kết nối với bạn cùng phòng của bạn. Thật vậy, không phải là xác định nếu có những con đường thông qua những người bạn toàn bộ các điểm của việc chạy tìm kiếm? – Blckknght

Trả lời

1

Cá nhân tôi khuyên bạn nên sử dụng cơ sở dữ liệu biểu đồ cho việc này. Neo4j hoặc Rexter mùa xuân để tâm trí.

Khi truy cập vào những từ Python có một vài thư viện có sẵn:

Mặc dù nó sẽ không là không thể để viết một nhanh/khả năng mở rộng phiên bản Python trong số này, hiện tại không có ai như tôi biết.

3

Có thể bạn muốn tất cả đường dẫn đơn giản (không lặp lại) giữa hai nút? NetworkX có một chức năng cho đó là dựa trên tìm kiếm chiều sâu đầu tiên. Xem http://networkx.github.com/documentation/development/reference/generated/networkx.algorithms.simple_paths.all_simple_paths.html

Ví dụ từ đó cho thấy rằng số lượng các đường dẫn đơn giản có thể lớn:

>>> import networkx as nx 
>>> G = nx.complete_graph(4) 
>>> for path in nx.all_simple_paths(G, source=0, target=3): 
...  print(path) 
... 
[0, 1, 2, 3] 
[0, 1, 3] 
[0, 2, 1, 3] 
[0, 2, 3] 
[0, 3] 
+0

Aric, tôi đã nhận thấy rằng việc triển khai hiện tại không quy mô tốt trên các mạng thực. Có cách giải quyết tiềm ẩn nào không? –

Các vấn đề liên quan