कुशलता से कम से कम नमूने


14

आज्ञा देना एक ग्राफ है, और चलो और दो कोने हो । हम कुशलतापूर्वक एक कम से कम स्वाद ले सकते हैं - के बीच सभी कम से कम रास्तों के सेट से यादृच्छिक पर समान रूप से और स्वतंत्र रूप से पथ और ? सादगी के लिए, हम मान सकते हैं कि सरल है, अप्रत्यक्ष और अप्राप्त है।एस टी जी एस टी एस टी जीGstGststG

कई प्रतिबंधित ग्राफ़ में भी, और बीच सबसे छोटे रास्तों की संख्या के आकार में घातीय हो सकती है । इसलिए, हम स्वाभाविक रूप से बचने की तरह वास्तव में सभी कम से कम कंप्यूटिंग हैं - पथ। मैं सामान्य मामले के बारे में नहीं जानता, लेकिन मुझे लगता है कि हम इसे कुछ विशेष ग्राफ कक्षाओं के लिए प्राप्त कर सकते हैं।टी जी एस टीstGst

यह ऐसा लगता है जैसे किसी ने पहले माना होगा। क्या इसमें कोई मौजूदा शोध है, या यह वास्तव में सामान्य रेखांकन के लिए भी सरल है?


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

1
@ CarlosLinaresLópez हीरे के ग्राफ पर विचार करें , और कहें कि "ऊर्ध्वाधर किनारे" के दाईं ओर है, और बाईं तरफ है। अब और बीच 2 सबसे छोटे रास्ते हैं । एल्गोरिथ्म को इन दोनों रास्तों में से किसी एक के साथ समान संभावना के साथ लौटना चाहिए। इसलिए और को "बेतरतीब ढंग से उठाया" नहीं जाता है, लेकिन उन्हें इनपुट के रूप में दिया जाता है। क्या यह स्पष्ट है? इस अर्थ में, मुझे यकीन नहीं है कि समस्या द्विदलीय रेखांकन के लिए वास्तव में आसान है। ststst
जुहो

1
@ CarlosLinaresLópez दूसरे शब्दों में, हमें एक ग्राफ , और दो कोने _ । को और बीच सभी सबसे छोटे रास्तों का सेट होने दें । एक तत्व को यादृच्छिक रूप से आउटपुट करें । एस , टी वी ( जी ) एस एस टी एसGs,tV(G)SstS
जुहो

जवाबों:


6

मुझे 100% यकीन नहीं है कि यह उत्तर सही है, लेकिन यहाँ जाता है:

मुझे लगता है कि आप के लिए समान रूप से यादृच्छिक किसी भी-पथ, से कम कर सकते हैं एक ही स्रोत है और एक भी सिंक के साथ एक DAG में,।st

एक ग्राफ G

  1. एक नया खाली डिग बनाना, H
  2. पहला: दिज्क्स्ट्रा के सबसे छोटे पथ का बीएफएस भाग, जो कि से शुरू होता है , सभी नोड्स को उनकी सबसे छोटी दूरी-से- s से चिह्नित करें ।ss
  3. चलो s - v से न्यूनतम दूरी हो ; जिसे हम डीजीकेस्ट्रा के सबसे छोटे-पथ एल्गोरिथम के बीएफएस चरण से जानते हैं।d(s,v)sv
  4. फिर दीजकस्ट्रा के सबसे छोटे पथ के एल्गोरिथ्म का अगला चरण करें, सबसे छोटा रास्ता प्राप्त करें, इसे में स्टोर करें (पीछे से टी से एस तक )।pts
  5. अब निम्नलिखित लूप शुरू करें; टिप्पणियों में विस्तार, और नीचे:
    • q0={t}
    • जबकि q0
      • q1=
      • के लिए uq0
        • इसलिए हम टी - यू से इस सबसे कम-सबपाथ के लिए अगले संभव नोड्स खोजना चाहते हैंtu
        • सभी के लिए ऐसा है कि ( रों , वी ) < ( रों , यू )edge(u,v)Gd(s,v)<d(s,u)
          • एक पड़ोसी नोड, कम के साथ है( रों , ) (यह हो जाएगा 1 कम)vd(s,)1
          • इसलिए, कम से कम पथ में संभव है।tuv
          • वी एच , डी-एज ( यू , वी ) एच डालेंvH,di-edge(u,v)H
          • अब हमें अगले मोड़ पर के कम-पड़ोसियों की जांच करने की आवश्यकता है ।v
          • रखना vq1
      • सेट से q 1 : q0q1
        • q0q1

अनिवार्य रूप से, मैं उन सभी संभावित नोड्स को इकट्ठा कर रहा हूं जो सबसे कम-पथ में उपयोग किए जा सकते हैं, और उन्हें में रखकर ।H

यह कैसे काम करता है:

पहले एक BFS चल रहा है, और सभी नोड्स चिह्नित करके डिज्कस्ट्रा का सबसे छोटा-पथ एल्गोरिथ्म काम करता है से उनके-कम से कम पथ के साथ रों - वी । अगला कदम टी - एस से वापस जाना है , और कम से कम पड़ोसी नोड्स का पालन करना है।vGsvts

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

अब आप जल्दी से सोचते हैं, लेकिन हे, क्यों उन्हें घातीय समझा जा रहा है, लेकिन मेरा रास्ता नहीं है?

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

अब हमारे पास DAG है कि हम किसी भी तरह से से पार कर सकते हैं , और s - t से सबसे छोटा-उल्टा-पथ पा सकते हैं । ग्राफ में एकमात्र स्रोत के रूप में टी होना चाहिए , और एकमात्र सिंक के रूप में एसtsstts


यदि उपरोक्त सही है, तो मुझे लगता है कि हम इसे एक कदम आगे ले जा सकते हैं और समस्या को हल कर सकते हैं।

DAG में प्रत्येक नोड को एक नोड-भार दें; नोड-वेट उस नोड से तक के रास्तों की संख्या होगी । इस w ( v ) को हम कहते हैं ।sw(v)

आप इन्हें शीघ्रता से गणना कर सकते हैं, एल्गोरिथ्म देख सकते हैं जो कि जी में एस से टी तक के सरल रास्तों की संख्या का पता लगाता है

एक बार हमारे पास नोड-वेट होने के बाद, हम समान रूप से एक पथ चुन सकते हैं:

  • DAG को एक स्तर-संरचना के रूप में देखें (विज़ुअलाइज़ेशन के लिए)
  • प्रत्येक स्तर पर, नोड्स के बीच एक मनमाना आदेश चुनें। "बाएं से दाएं" की धारणा।
  • DAG नीचे traversing: हर कदम पर , मैं [ 1 , | पी | ] (जहां || साधन आकार का, इस मामले में, कम से कम-पथ की लंबाई): ii[1,|p|]||
    • चलो वर्तमान नोड हो (पर शुरू टी )uit
    • के बच्चों के सभी वज़न को जोड़ें , और RNG का उपयोग करके, वज़न वाले बच्चों के बीच समान रूप से एक बच्चे का नोड, v i चुनेंuivi
    • सेट करें , और अगले चरण पर जाएंui+1=vi

स्तर-संरचना, और बस उत्पन्न करने के लिए बाएँ-से-सही मेरी प्रारंभिक प्रयास के थे हिस्सा की धारणा , और एक रास्ता है कि जिस तरह से चुनते हैं, लेकिन मैं आंकड़ा है कि बाहर नहीं किया था, इसलिए आप उन्हें सुरक्षित रूप से अनदेखा कर सकते हैं। r[0,w(t))
Realz Slaw

1
यह जवाब बहुत अच्छा लग रहा है! मुझे विचारों से प्यार है! मैंने इसे अपनी समझ के परीक्षण के रूप में थोड़ा अलग तरीके से (अपने उत्तर में) लिखने की कोशिश की। किसी भी मामले में, मैं सिर्फ इस प्यारे उत्तर के लिए अपनी प्रशंसा साझा करना चाहता था!
DW

5

यहाँ Realz Slaw के उत्तर में विचारों पर आधारित एक समाधान है। यह मूल रूप से उनके विचारों का पुन: प्रदर्शन है जो स्पष्ट या अनुसरण करने में आसान हो सकता है। योजना यह है कि हम दो चरणों में आगे बढ़ेंगे:

  1. सबसे पहले, हम एक ग्राफ का निर्माण करेगा निम्नलिखित संपत्ति के साथ: से किसी भी पथ रों को टी में एस एक कम से कम से मार्ग है रों को टी में जी , और हर कम से कम से पथ रों को टी में जी भी में मौजूद है एस । इस प्रकार, S में G के सबसे छोटे रास्ते हैं: सभी सबसे छोटे रास्ते, और कुछ भी नहीं। जैसा कि होता है, S एक DAG होगा।SstSstGstGSSGS

  2. इसके बाद, हम यादृच्छिक पर समान रूप से से सभी रास्ते से नमूना होगा को टी में एसstS

यह एक मनमाने ढंग से निर्देशित ग्राफ लिए दृष्टिकोण करता है , जब तक कि सभी किनारों का सकारात्मक वजन होता है, इसलिए मैं उन तरीकों से अपने एल्गोरिथ्म को समझाऊंगा। चलो डब्ल्यू ( यू , वी ) किनारे पर वजन निरूपित यू v । (यह आपके द्वारा दिए गए समस्या कथन को सामान्यीकृत करता है। यदि आपके पास एक अनवेटेड ग्राफ़ है, तो मान लें कि हर किनारे का वजन 1 है। यदि आपके पास एक अप्रत्यक्ष ग्राफ़ है, तो प्रत्येक अप्रत्यक्ष किनारे ( यू , वी ) को दो निर्देशित किनारों के रूप में समझें u v और v यू ।)Gw(u,v)uv(u,v)uvvu


चरण 1: निकालें । S पर एक एकल स्रोत कम से कम-पथ एल्गोरिथ्म (जैसे, डिज्कस्ट्रा एल्गोरिथ्म) रन , स्रोत से शुरू रोंG में प्रत्येक शीर्ष v के लिए , d ( s , v ) को s से v की दूरी बताएं ।GsvGd(s,v)sv

अब ग्राफ को इस प्रकार परिभाषित करें । इसमें हर किनारे u v होता है जैसे (1) u v , G में बढ़त है , और (2) d ( s , v ) = d ( s , u ) + w ( u , v )SuvuvGd(s,v)=d(s,u)+w(u,v)

ग्राफ में कुछ सुविधाजनक गुण हैं:S

  • G से से t तक का प्रत्येक सबसे छोटा पथ S में पथ के रूप में मौजूद है : एक छोटा पथ s = v 0 , v 1 , v 2 , , v k = t में G का गुणधर्म d ( s , v i + 1) है ) = d ( s , v i ) + w ( v i , v i)stGSs=v0,v1,v2,,vk=tG, इसलिए किनारे v i v i + 1 Sमें मौजूद है।d(s,vi+1)=d(s,vi)+w(vi,vi+1)vivi+1S

  • में हर पथ से रों को टी में एक कम से कम पथ है जी । विशेष रूप से, किसी भी मार्ग पर विचार एस से रों को टी , कहते हैं रों = v 0 , वी 1 , वी 2 , ... , वी कश्मीर = टी । उसकी लम्बाई उसके किनारों के भार का योग द्वारा दिया जाता है, अर्थात् Σ k मैं = 1 डब्ल्यू ( v मैं - 1 , वी मैं )SstGSsts=v0,v1,v2,,vk=ti=1kw(vi1,vi), लेकिन की परिभाषा के द्वारा , इस योग है Σ कश्मीर मैं = 1 ( ( रों , वी मैं ) - डी ( रों , वी मैं - 1 ) , जो करने के लिए दूरबीन ( रों , टी ) - डी ( रों , रों ) = डी ( एस , टी ) । इसलिए, यह पथ जी में एस से टी तक का सबसे छोटा रास्ता हैSi=1k(d(s,vi)d(s,vi1)d(s,t)d(s,s)=d(s,t)stG

  • अंत में, में शून्य-वजन वाले किनारों की अनुपस्थिति का मतलब है कि एस एक डैग है।GS

चरण 2: एक यादृच्छिक पथ का नमूना लें। अब हम में किनारों पर भार फेंक सकता , और से एक यादृच्छिक पथ नमूना रों को टी में एसSstS

इसकी सहायता के लिए, हम S में प्रत्येक शीर्ष v के लिए गणना करने के लिए एक पूर्व-निर्धारण करेंगे , जहाँ n ( v ) v से t तक के अलग-अलग रास्तों की संख्या की गणना करता है । इस पुनर्संयोजन को रेखीय समय में एस के कोने को स्थैतिक रूप से क्रमबद्ध क्रम में स्कैन करके किया जा सकता है , निम्नलिखित आवर्ती संबंध का उपयोग करके:n(v)vSn(v)vtS

n(v)=wsucc(v)n(w)

जहां के उत्तराधिकारियों को दर्शाता है वी , यानी, succ ( v ) = { w : वी w  में बढ़त है  एस } , और जहाँ हम आधार मामला है n ( टी ) = 1succ(v)vsucc(v)={w:vw is an edge in S}n(t)=1

अगला, हम एक यादृच्छिक पथ के नमूने के लिए एनोटेशन का उपयोग करते हैं । हम पहले नोड s पर जाएँ । फिर, हम क्रमिक रूप से s के उत्तराधिकारियों में से एक को चुनते हैं , उत्तराधिकारी w द्वारा n ( w ) द्वारा भारित किया जाता है । दूसरे शब्दों में:n()sswn(w)

choosesuccessor(v):
    n = 0
    for each w in succ(w):
        n = n + n(w)
    r = a random integer between 0 and n-1
    n = 0
    for each w in succ(w):
        n = n + n(w)
        if r < n:
            return w

एक यादृच्छिक रास्ता चुनने के लिए, हम इस प्रक्रिया को बार-बार दोहराते हैं: अर्थात, , और v i + 1 = ( v i ) । परिणामी पथ वांछित पथ है, और इसे एस से टी तक सभी सबसे छोटे रास्तों से यादृच्छिक पर समान रूप से नमूना लिया जाएगा ।v0=svi+1= choosesuccessor(vi)st

उम्मीद है कि यह आपको Realz Slaw के समाधान को अधिक आसानी से समझने में मदद करता है। इस समस्या के सुंदर और साफ समाधान के लिए Realz स्लाव के लिए सभी क्रेडिट!


एक मामला यह नहीं संभालता है वह मामला है जहां कुछ किनारों का वजन 0 या नकारात्मक वजन है। हालाँकि, समस्या संभावित रूप से उस मामले में अच्छी तरह से परिभाषित नहीं है, क्योंकि आपके पास असीम रूप से कई छोटे रास्ते हो सकते हैं।


Glad you took the time to fully get my answer; I wasn't sure it is correct. Now I am vindicated :D.
Realz Slaw
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.