नोड्स और किनारों के बीच अनुमत कई किनारों के साथ एक ग्राफ का प्रतिनिधित्व कैसे करें जो चुनिंदा गायब हो सकते हैं


11

मैं यह पता लगाने की कोशिश कर रहा हूं कि कुछ काल्पनिक, आदर्श नेटवर्क उपयोग के मॉडलिंग के लिए किस प्रकार की डेटा संरचना का उपयोग करना है।

मेरे परिदृश्य में, कई उपयोगकर्ता जो एक-दूसरे से शत्रुतापूर्ण व्यवहार कर रहे हैं, वे सभी कंप्यूटर के नेटवर्क बनाने की कोशिश कर रहे हैं जहां सभी संभावित कनेक्शन ज्ञात हैं। कंप्यूटर जो एक उपयोगकर्ता को कनेक्ट करने की आवश्यकता होती है, वही नहीं हो सकता है क्योंकि दूसरे उपयोगकर्ता को कनेक्ट करने की आवश्यकता होती है; उपयोगकर्ता 1 को कंप्यूटर A, B और D को जोड़ने की आवश्यकता हो सकती है जबकि उपयोगकर्ता 2 को कंप्यूटर B, C और E को जोड़ने की आवश्यकता हो सकती है।

यहाँ छवि विवरण दर्ज करें

NCTM ग्राफ क्रिएटर की मदद से उत्पन्न छवि

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

  1. किनारों प्रतिबंधित-उपयोग बन सकता है; यदि कोई उपयोगकर्ता किसी दिए गए नेटवर्क कनेक्शन को प्राप्त करता है, तो कोई अन्य उपयोगकर्ता उस कनेक्शन का उपयोग नहीं कर सकता है
    • उदाहरण में, हरा उपयोगकर्ता संभवतः कंप्यूटर A से कनेक्ट नहीं हो सकता है, लेकिन लाल उपयोगकर्ता ने उनके बीच सीधा लिंक नहीं होने के बावजूद B से E को कनेक्ट किया है
  2. कुछ मामलों में, नोड्स की एक जोड़ी एक से अधिक किनारों से जुड़ी होगी
    • उदाहरण में, डी से ई तक दो स्वतंत्र केबल चल रहे हैं, इसलिए हरे और नीले उपयोगकर्ता दोनों उन मशीनों को सीधे कनेक्ट करने में सक्षम थे; हालाँकि, लाल अब ऐसा संबंध नहीं बना सकता है
  3. यदि दो कंप्यूटर एक से अधिक केबल से जुड़े हैं, तो प्रत्येक उपयोगकर्ता उन केबलों में से एक से अधिक नहीं हो सकता है

मुझे इस ग्राफ़ पर कई ऑपरेशन करने होंगे, जैसे:

  • यह निर्धारित करना कि कंप्यूटर का कोई विशेष जोड़ा किसी उपयोगकर्ता के लिए जुड़ा हुआ है या नहीं
  • लक्ष्य कंप्यूटर को जोड़ने के लिए किसी दिए गए उपयोगकर्ता के लिए इष्टतम पथ की पहचान करना
  • किसी दिए गए उपयोगकर्ता के लिए उच्चतम-विलंबता कंप्यूटर कनेक्शन की पहचान करना (यानी बिना शाखा के सबसे लंबा रास्ता)

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


यह किसी भी तरह प्रासंगिक लगता है। youtube.com/watch?v=xdiL-ADRTxQ
रबरकाक

मैं वास्तव में नहीं देख रहा हूँ कि यहाँ कैसे मदद हो रही है।
पॉप

इसलिए मैंने कुछ समय के लिए इस बारे में सोचा। रेखांकन के लिए अधिकांश एल्गोरिदम में, आपके पास मुख्य रूप से दो चीजें हैं जो आपको करने की आवश्यकता है: पड़ोसियों की गणना करें या एक किनारे का वजन ढूंढें। आपके द्वारा सूचीबद्ध किए गए प्रश्नों में केवल एक उपयोगकर्ता शामिल है। एक एकल उपयोगकर्ता के लिए, पड़ोसियों की गणना करना या किसी किनारे का वजन ढूंढना या तो निरंतर समय में जवाब दिया जा सकता है (यदि उपयोगकर्ता की गणना की जाती है) या लॉग एन में या तो आसन्न सूची या मैट्रिक्स को "स्वामित्व" के साथ मिरर करके। उस अंत तक, मुझे लगता है कि या तो आसानी से बढ़ाया जा सकता है और इसे उपयोगकर्ता की भाग से विचलित होने के बजाय पारंपरिक शक्तियों के आधार पर चुना जाना चाहिए।
J Trana

जवाबों:


6

अंतरिक्ष मान लेना एक चिंता का विषय नहीं है, क्या एक ग्राफ के बजाय ग्राफ (प्रत्येक उपयोगकर्ता के लिए एक) की कई प्रतियां बनाना उचित होगा?

यह मुझे लगता है कि आपको "स्तरित रेखांकन" का लेबल लगाने के लिए उपयोग करना चाहिए, अर्थात ग्राफ़ के लिए एक कॉम्बिनेटर जोड़ें @, ताकि वह कहे :

  • यदि A और B ग्राफ़ हैं तो A @ B एक ग्राफ़ भी है (यानी आपके ग्राफ़ लाइब्रेरी के एल्गोरिदम को खिलाया जा सकता है)।
  • A @ B में कोने का सेट A और B में कोने का मिलन है।
  • ए @ बी में किनारों का सेट ए और बी में किनारों का मिलन है।
  • संरचना ए @ बी किसी भी शीर्ष या किनारे के मालिक नहीं है, बल्कि ए और बी को डेटा कंटेनर के रूप में उपयोग करता है।

इस तरह के स्तरित रेखांकन के साथ, आप K को कोमन उपलब्ध जानकारी और R, G, B को प्रत्येक निजी जानकारी के रूप में परिभाषित कर सकते हैं ताकि प्रत्येक खिलाड़ी वास्तव में R @ K, G @ K, B @ K को देख सके।

वास्तव में इसे लागू करने के लिए, आप एक ग्राफ़िक्स लाइब्रेरी को देख सकते हैं जो एल्गोरिदम को उदारतापूर्वक लागू कर रही है, यानी कि सबसे लंबा पथ एल्गोरिथ्म आदि आपके ग्राफ़ के वास्तविक प्रतिनिधित्व द्वारा पैराट्राइज़ किए गए हैं। तो अगर आपका पुस्तकालय कहता है

ConcreteGraphAlgorithms = GenericAlgorithms(ConcreteGraphImplementation)

आप इसे आसानी से बदल सकते हैं

LayeredGraphAlgorithms = GenericAlgorithms(LayeredGraphs(ConcreteGraphImplementation))

जहां आप आपूर्ति कर रहे हैं LayeredGraphsऔर पुस्तकालय से बाकी राशि उधार ले रहे हैं ।


वूप्स, मेरी पिछली टिप्पणी की अवहेलना करते हुए, मैंने आपके उत्तर को थोड़ा गलत बताया। यह मूल रूप से मैं क्या कर रहा हूं, हालांकि मैं मौजूदा ग्राफ पुस्तकालयों का लाभ उठाने में विफल रहा, क्योंकि मैं मूर्खता से यह देखने के लिए नहीं सोचता था कि क्या कोई अस्तित्व में है।
पोप

1

आपको जिस चीज की आवश्यकता होती है उसे "एट्रिब्यूटेड ग्राफ" कहा जाता है। एक जिम्मेदार ग्राफ में, जानकारी (विशेषताएँ) आर्क से जुड़ी होती हैं। एक भारित ग्राफ सरलतम रेखांकन वाले ग्राफ़ में से एक है।

एक आरोपित ग्राफ़ का प्रतिनिधित्व करने के लिए, आप प्रत्येक सेल में अधिक जानकारी जोड़कर अतिरिक्त कॉलम या आसन्न मैट्रिसेस जोड़कर एक आसन्न सूची का उपयोग कर सकते हैं। गैर-एट्रिब्यूटेड ग्राफ़ के लिए अधिकांश एल्गोरिदम काम करेंगे यदि आप विशेषताओं के आधार पर आर्क्स को फ़िल्टर करते हैं। कई एल्गोरिदम को जिम्मेदार ग्राफ़ के लिए विकसित किया गया है, इसलिए मैं यहां उनका वर्णन नहीं करूंगा।


1
निश्चित रूप से एक आसन्न मैट्रिक्स सामान्य रूप से नोड्स के प्रत्येक जोड़ी के बीच 1 से अधिक किनारे का प्रतिनिधित्व नहीं कर सकता है
जेके।

1
@jk, आम तौर पर आप सही हैं। लेकिन आसन्न मैट्रिक्स में संलग्न जानकारी आर्क की संख्या और प्रत्येक आर्क के लिए अलग-अलग विशेषता हो सकती है। लेकिन ज्यादातर मामलों में, मैं एक आसन्न सूची का उपयोग करूंगा क्योंकि यह सरल होगा।
वल्रि

1
अगर आप सेल के लिए हर किनारे के लिए जानकारी संलग्न कर रहे हैं, तो आपके पास प्रभावी रूप से वैसे भी आसन्न सूची है, तो आप लाभ को खो देते हैं जो मैट्रिक्स आपको घने रेखांकन
jk के
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.