2012-10-24 24 views
5

Trong hệ thống Tôi có danh sách các nút được kết nối như trong biểu đồ bình thường. Chúng tôi biết toàn bộ hệ thống và tất cả các kết nối của họ và chúng tôi cũng có một điểm khởi đầu. Tất cả các cạnh của tôi đều có hướng.Vẽ biểu đồ từ danh sách các nút được kết nối

Bây giờ tôi muốn tự động vẽ tất cả các nút và cạnh này. Vấn đề không phải là bản vẽ thực tế, nhưng tính toán các tọa độ (x, y). Vì vậy, về cơ bản tôi muốn vẽ toàn bộ biểu đồ này để có vẻ tốt.

datastructure của tôi sẽ là một cái gì đó như:

class node: 
string text 
List<edge> connections 

Phải có một số thuật toán nổi tiếng với những vấn đề này? Tôi đã không thể tìm thấy bất kỳ, nhưng tôi có thể sử dụng các từ khóa sai.

những suy nghĩ của tôi:

Một cách sẽ được định vị startnode của chúng tôi tại (0,0), và sau đó có một số liên tục mà là "khoảng cách". Sau đó, đối với mỗi người hàng xóm, nó sẽ thêm khoảng cách vào vị trí y và cho mỗi nút là một người hàng xóm, đặt x = distance * n.

Nhưng điều này thực sự sẽ gây ra rất nhiều vấn đề - vì vậy đó không phải là cách để đi.

Trả lời

9

Đến nay, cách tiếp cận phổ biến nhất cho việc này là sử dụng một số force-directed layout thay vì xác định. Ý chính là bạn có mỗi nút đẩy nhau (chống trọng lực) và có bất kỳ cặp kết nối nào thu hút lẫn nhau. Sau một vài lần lặp của mô phỏng vật lý, bạn có thể có được bố cục hợp lý.

Có rất nhiều thuật toán bố cục mà bạn có thể sử dụng, với các kết quả rất khác nhau. Các thuật toán GraphViz fdp (Fruchterman & Reingold '91) và neato (Kamada & Kawai '89) hoạt động, nhưng khá cũ và có nhiều lựa chọn thay thế tốt hơn. Thuật toán Fruchterman & Reingold '91 cũng có sẵn bằng Python trong NetworkX.

Prefuse cung cấp số ForceDirectedLayout Java class khá nhanh và tốt. Hachul & Jünger '05 chi tiết thuật toán FM^3, có vẻ hoạt động khá tốt trong thực tế (Hachul & Jünger '06) và có sẵn trong C++ trong Tulip.

Có rất nhiều các công cụ mã nguồn mở khác để hình dung đồ thị, như NodeXL (C#), một công cụ giới thiệu tuyệt vời mà tích hợp phân tích mạng vào Excel 2007/2010 (Disclaimer: Tôi là một chuyên gia tư vấn cho nó). Các công cụ tuyệt vời khác bao gồm Gephi (Java) và Cytoscape (Java), trong khi Pajek, UCINet, yEdTom Sawyer là một số lựa chọn thay thế độc quyền.

2

Nói chung đây là một vấn đề phức tạp, đặc biệt là nếu bạn muốn bắt đầu giao dịch với định tuyến cạnh và làm cho mọi thứ trông đẹp. Bạn có thể xem http://www.graphviz.org/ và sử dụng công cụ dòng lệnh của họ hoặc sử dụng thư viện graphviz để làm bố cục của bạn và nhận tọa độ x, y trong ứng dụng của bạn.