प्रक्रियात्मक कालकोठरी पीढ़ी: क्या यह सुनिश्चित करने के लिए एक सरल एल्गोरिथ्म है कि इन सभी कमरों में न्यूनतम गलियारों का उपयोग करके जुड़ा हुआ है?


9

क्या बहुत सारे गलियारों के बिना सभी कमरों को जोड़ने के लिए एक छत्ता जैसी संरचना प्राप्त करना संभव है? (बहुत से 3-4 कमरे से आने वाले गलियारे)

नीचे इस बात का आउटपुट है कि मेरे कमरे कैसे दिखते हैं, मूल रूप से उन्हें बेतरतीब ढंग से रखा गया है।

ग्रिड कमरों का उत्पादन, बेतरतीब ढंग से रखा गया

क्या मैं गलियारे-वार पाने की उम्मीद कर रहा हूं।

http://i.imgur.com/9GUi6Yy.png


मुझे नहीं लगता कि 3 या 4 "बहुत अधिक गलियारे हैं"। खासकर यदि आपके पास अपने तहखाने में 9 कमरे हैं। इसके अलावा, मुझे यकीन नहीं है कि "हाइव जैसी संरचना" से आपका क्या मतलब है, क्या आप इस बात पर विस्तार से बता सकते हैं कि आप किस नज़रिए से जाने की कोशिश कर रहे हैं?
fnord

हो सकता है कि एक "पूर्ण" नक्शा शामिल करें जिसमें आप रुचि रखते हों।
MichaelHouse

आह हां, मेरा मतलब था कि प्रत्येक कमरे से अधिकतम 3 या 4 गलियारे आते हैं।
ब्लेंडर

मैंने एक छवि जोड़ी है कि मैं कॉरिडोर के रूप में जहाँ तक काम कर रहा हूँ।
ब्लेंडर

2
यदि आपके पास किसी भी कमरे से 3 गलियारे नहीं हैं, तो आप केवल कमरों के एक सरल रैखिक जुड़ने में सक्षम होंगे, और इसलिए बस एक को चुनें, और इसे अपने दो निकटतम पड़ोसियों के साथ जोड़ दें।
निक

जवाबों:


6

ठीक है, मैं सबसे आसान तरीका यह सोचकर शुरू कर सकता हूं कि सभी कमरे कम से कम 1 गलियारे से जुड़े हों:

  1. आखिरी या पहले कमरे से शुरू करें।
  2. 1 दूरी के भीतर एक यादृच्छिक कमरे को पकड़ो, जो पहले से ही किसी कमरे से जुड़ा नहीं है (सभी कमरे डिस्कनेक्ट होने लगते हैं, इसलिए आप जैसे-जैसे आगे बढ़ेंगे, आपको इसका पता चलता रहेगा)।
  3. यदि ऐसा कोई कमरा नहीं है, तो दूरी +1 पर जाएं। यदि किसी अन्य कमरे के ऊपर / नीचे सुरंग बनाना ठीक है तो यह आसान है, यह मानते हुए कि आप गलियारों को जोड़ना नहीं चाहते हैं।
  4. छद्म के माध्यम से अपने तरीके से काम करें जब तक कि सभी कमरे जुड़े न हों।

अब हम जानते हैं कि आप सभी कमरों को प्राप्त कर सकते हैं, लेकिन अब यदि आप इस सख्ती से अधिक रैखिक भूलभुलैया से अधिक चाहते हैं, तो आप बस अपने कमरे में कदम रख सकते हैं और कमरे को जोड़ने के लिए एक नया रास्ता बना सकते हैं, प्रति कमरा 2-3 की सीमा तक, या जब तक कमरों का एक निश्चित प्रतिशत अधिकतम कनेक्शन नहीं मारता - आदि।

अंतिम चरण के रूप में, आप ऐसे नियम जोड़ सकते हैं जो आपके परिणामों को विभिन्न स्थितियों के अनुरूप ढालेंगे। उदाहरण के लिए, आप देख सकते हैं कि केवल 1 गलियारे वाला कोई भी कमरा, परिभाषा के अनुसार, एक मृत-अंत है; आप अधिक मृत छोर बना सकते हैं, या आप यह सुनिश्चित कर सकते हैं कि सब कुछ कम से कम 2 कनेक्शन है। आप डेड-एंड कर सकते हैं, एक गुप्त मार्ग है। आप यह सुनिश्चित कर सकते हैं कि बॉस-रूम एक डेड-एंड है। आप यह सुनिश्चित कर सकते हैं कि आपका स्टार्ट रूम एक डेड-एंड है, लेकिन फिर सुनिश्चित करें कि दूसरे कमरे में न्यूनतम X कनेक्शन हों। एड इन्फिटम।

प्रत्येक धारणा और नियम मौलिक रूप से बदलाव कर सकते हैं कि आपका स्तर कैसा दिखता है, लेकिन यह मज़ेदार है! यह कम से कम आपको शुरू करने के लिए छत्ता / गुफा जैसे कमरे मिलना चाहिए।


यह क्रुस्ल के न्यूनतम स्पैनिंग ट्री एल्गोरिदम के काफी करीब है - यह 2 में स्थिति को "पहले से ही किसी कमरे से नहीं जुड़ा हुआ " से "पहले से ही एक ही क्लस्टर से जुड़ा नहीं" में संशोधित करता है, जो ऊपर वर्णित नियमों में एक बग को ठीक करता है जहां आप हो सकते हैं ऐसी स्थिति जहां प्रत्येक कमरा किसी न किसी कमरे से जुड़ा होता है, लेकिन एक पूरे के रूप में काल कोठरी कई अलग-अलग द्वीपों का निर्माण करती है। क्रुस्कल की न्यूनतम कुल गलियारे की लंबाई के साथ एक कनेक्शन ग्राफ खोजने की गारंटी है।
DMGregory

3

बस पहले से जुड़े हुए अपने कमरे का निर्माण करें। एक कमरे से शुरू करें, फिर दूसरे कमरों में 1-3 गलियारे बनाएं। तब तक पुनरावृत्ति करें जब तक कि आपने पर्याप्त कमरे नहीं जोड़े हैं।


2

चूँकि ये कमरे 2d मैदान में स्थित ग्राफ वर्टिकल हैं, यह सिद्धांत रूप से ट्रैवलिंग सेल्समैन की समस्या को हल करके किया जा सकता है (जो केवल कुछ कमरों के साथ ठीक होगा)। जाहिर है, एक साधारण विधर्मी ठीक होगा और उचित मापनीयता की अनुमति देगा।

आप सभी कमरों के बीच किनारों (गलियारे की लंबाई) की गणना करते हैं। आप उन्हें लंबाई के अनुसार क्रमबद्ध करें। आप सबसे छोटा गलियारा जोड़ते हैं जब तक कि यह एक चक्र नहीं बनाता है या आपके इच्छित अधिकतम मूल्य (3-4) (दोहराने) से ऊपर शिखर (कमरे) की डिग्री बढ़ाता है। चक्रों की जाँच के लिए आप UnionFind लागू कर सकते हैं या छोटे डेटा पर त्वरित BFS कर सकते हैं।


यह उत्तर स्वीकृत उत्तर से बेहतर है। सबसे कम कनेक्ट करने वाले गलियारों को चुनने की लालची रणनीति को पहले काम करना चाहिए। चक्र से बचने के लिए, उन कमरों से संबंध न बनाएं, जिनमें पहले से ही एक गलियारा जुड़ा हुआ है।
जेल वैन कैम्पेन

@JellevanCampen धन्यवाद। ;) आपके पास दो पृथक जुड़े घटक हो सकते हैं। इसलिए यदि आप दो नोड्स जुड़े हुए हैं तो आप शायद BFS के साथ यूनियन फ़ाइंड या चेक का उपयोग करना चाहते हैं।
AturSams

आह हाँ, उस बारे में आपका अधिकार, मेरा बुरा।
जेल वैन कैंपेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.