2012-10-24 15 views
5

सिस्टम में मेरे पास नोड्स की एक सूची है जो सामान्य ग्राफ में कनेक्ट होती है। हम पूरी प्रणाली और उनके सभी कनेक्शन जानते हैं और हमारे पास एक प्रारंभ बिंदु भी है। मेरे सभी किनारों की एक दिशा है।कनेक्टेड नोड्स की सूची से ग्राफ़ बनाएं

अब मैं इन सभी नोड्स और किनारों को स्वचालित रूप से आकर्षित करना चाहता हूं। समस्या वास्तविक ड्राइंग नहीं है, लेकिन (एक्स, वाई) निर्देशांक की गणना। तो मूल रूप से मैं इस पूरे ग्राफ को आकर्षित करना चाहता हूं ताकि यह अच्छा लगे।

class node: 
string text 
List<edge> connections 

होना चाहिए कुछ इस समस्या के लिए अच्छी तरह से ज्ञात एल्गोरिदम:

मेरे आंकड़ा संरचना की तरह कुछ हो सकता है? मैं कोई भी नहीं ढूंढ पा रहा हूं, लेकिन मैं गलत कीवर्ड का उपयोग कर रहा हूं।

मेरे विचार:

एक ही रास्ता (0,0) में हमारे startnode स्थिति, और फिर कुछ निरंतर जो "दूरी" है के लिए किया जाएगा। फिर प्रत्येक पड़ोसी के लिए, यह वाई स्थिति में दूरी जोड़ देगा, और प्रत्येक नोड जो पड़ोसी है, सेट x = distance * n।

लेकिन यह वास्तव में बहुत सारी समस्याएं देगा - इसलिए यह निश्चित रूप से जाने का तरीका नहीं है।

उत्तर

9

इसके लिए अब तक का सबसे आम दृष्टिकोण force-directed layout का उपयोग निर्धारिती के बजाय करना है। यह बात यह है कि आपके पास प्रत्येक नोड एक दूसरे (एंटी-गुरुत्वाकर्षण) को पीछे हटाना है और नोड्स के किसी भी जुड़े जोड़े एक-दूसरे को आकर्षित करते हैं। भौतिकी सिमुलेशन के कई पुनरावृत्तियों के बाद आप एक उचित लेआउट प्राप्त कर सकते हैं।

कई लेआउट एल्गोरिदम हैं जिनका उपयोग आप विभिन्न परिणामों के साथ कर सकते हैं। GraphViz एफडीपी (Fruchterman & Reingold '91) और नीटो (Kamada & Kawai '89) एल्गोरिदम काम करते हैं, लेकिन पुराने हैं और बहुत बेहतर विकल्प हैं। Fruchterman & Reingold '91 एल्गोरिदम भी NetworkX में पायथन में उपलब्ध है।

PrefuseForceDirectedLayout Java class प्रदान करता है जो कि बहुत तेज़ और अच्छा है। Hachul & Jünger '05 एफएम^3 एल्गोरिदम का विस्तार करें, जो प्रैक्टिस (Hachul & Jünger '06) में काफी अच्छा प्रदर्शन करता है और Tulip में सी ++ में उपलब्ध है।

वहाँ अन्य खुले स्रोत उपकरण की टन, एक महान परिचयात्मक उपकरण है जो एक्सेल 2007/2010 में नेटवर्क विश्लेषण एकीकृत तरह NodeXL (सी #) रेखांकन कल्पना करने के लिए, कर रहे हैं (अस्वीकरण: मैं इसे के लिए एक सलाहकार हूँ)। अन्य भयानक औजारों में Gephi (जावा) और Cytoscape (जावा), Pajek, UCINet, yEd और Tom Sawyer कुछ स्वामित्व विकल्प हैं।

2

आम तौर पर यह एक मुश्किल समस्या है, खासकर यदि आप एज रूटिंग से निपटना शुरू करना चाहते हैं और चीजों को सुंदर दिखाना चाहते हैं। आप http://www.graphviz.org/ देख सकते हैं और या तो उनके कमांड लाइन टूल्स का उपयोग कर सकते हैं, या ग्राफ़विज़ लाइब्रेरी का उपयोग करके अपना लेआउट कर सकते हैं और अपने एक्स, वाई को अपने आवेदन के भीतर निर्देशित कर सकते हैं।

संबंधित मुद्दे