बेतरतीब ढंग से ग्रिड पर निर्देशित ग्राफ़ उत्पन्न करें


11

मैं एक पहेली गेम बनाने के लिए बेतरतीब ढंग से एक पहेली ग्राफ बनाने की कोशिश कर रहा हूं, जो पोकेमॉन से बर्फ फिसलने वाली पहेली के समान है।
यह अनिवार्य रूप से वही है जो मैं बेतरतीब ढंग से उत्पन्न करने में सक्षम होना चाहता हूं: http://bulbanews.bulbagarden.net/wiki/Crunching_the_numbers:_Graph_theory

मुझे एक x और y आयाम में ग्राफ के आकार को सीमित करने में सक्षम होने की आवश्यकता है। लिंक में दिए गए उदाहरण में, यह 8x4 ग्रिड तक सीमित रहेगा।
मैं जिस समस्या में चल रहा हूं, वह यादृच्छिक रूप से ग्राफ़ उत्पन्न नहीं कर रही है, बल्कि बेतरतीब ढंग से एक ग्राफ़ उत्पन्न कर रही है, जिसे मैं 2 डी स्पेस में ठीक से मैप कर सकता हूं, क्योंकि मुझे नोड के विपरीत तरफ कुछ (चट्टान की तरह) की आवश्यकता है, इसे बनाने के लिए जब आप फिसलने से रोकते हैं तब दृष्टिहीनता का एहसास करें। इसके साथ समस्या यह है कि कभी-कभी चट्टान दो अन्य नोड्स के बीच या संभवतः एक और नोड पर पथ के बीच समाप्त हो जाती है, जिससे पूरा ग्राफ़ टूट जाता है।

कुछ लोगों के साथ समस्या के बारे में चर्चा करने के बाद, मुझे पता है, हम कुछ निष्कर्षों पर आए, जिनसे समाधान हो सकता है।

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

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

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

यहाँ बेतरतीब ढंग से उत्पन्न रेखांकन के कुछ बुरे उदाहरण दिए गए हैं:

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

यहाँ कुछ बेतरतीब ढंग से उत्पन्न (या हाथ से घुमाया) रेखांकन के अच्छे उदाहरण दिए गए हैं:

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

मुझे यह भी लगता है कि अधिक चुनौतीपूर्ण लोगों को नोटिस करना जब वास्तव में यह एक पहेली के रूप में खेल रहे हैं जो न्यूनतम पथ के साथ उच्च डिग्री नोड्स के बहुत सारे हैं।


1
आप चट्टानों का एक पूरी तरह से यादृच्छिक सेट उत्पन्न कर सकते हैं, फिर देखें कि क्या संबंधित ग्राफ में कोई समाधान है, और यदि नहीं, तो इसे फेंक दें और शुरू करें। 8x4 ग्रिड के साथ यह इतना लंबा समय नहीं ले सकता। मुझे यकीन है कि क्लीनर समाधान हैं।
नौकरी

यह मेरा पहला तरीका था, लेकिन मुझे इसे थोड़ा और बड़े पैमाने पर करने की जरूरत है और यह मजबूर करने के लिए कुछ समय लग रहा था कि यह एक बेहतर तरीका है।
तालोन Tal६

जवाबों:


2
  • यह बर्फ है, आप तब तक हिलेंगे जब तक आप एक चट्टान से नहीं टकराते।
  • दिशा बदलने का एकमात्र तरीका चट्टान से टकराना है।
  • यदि आप एक चट्टान से टकराते हैं तो आपको दिशाएँ बदलनी पड़ती हैं।
  • स्पष्ट कारणों के लिए, चक्र अच्छे हैं।
  • कई प्रारंभ हो सकते हैं, और कई सिरे हो सकते हैं।

अधिक उन्नत गुण:

  • आसन्न चट्टानों के बिना कोशिकाएं उपलब्ध नहीं हैं (कुछ का पता लगाया जा सकता है)
  • दीवारें भी चट्टानें हैं, यदि आप उन्हें हटाते हैं, तो आप चारों ओर लपेटने का निर्णय ले सकते हैं।
  • आप उप-ग्रिड का उपयोग पैटर्न के रूप में कर सकते हैं ("टाइलिंग" 3x3, 3x4, 5x5, ... आदि)
  • आप गैर-ट्रैवर्सेबल MxN क्षेत्र के शीर्ष पर एक पहेली MxN टाइल को ओवरले कर सकते हैं और इसके अंदर / बाहर अनुप्रेषित करने के लिए एक रॉक जोड़ सकते हैं।
  • टाइल के रोटेशन या समरूपता दिलचस्प हो सकती है
  • आप बर्फीले पंक्तियों / स्तंभों को सम्मिलित करके एक टाइल का विस्तार कर सकते हैं

उदाहरण:

S=start, E=end, o=rock, .=ice

3 . 2 o        3 . . 2 o         . . . . . o o
4 . . E   ~=   4 . . . E   ~=    . . . . . 2 E
o . . .        o . . . .         . . . . . . .
S . 1 o        S . . 1 o         S . . . . 1 o

टाइल्स के संयोजन का उदाहरण:

3 . . 2 o       o 2 . . 3      3 . . 2 o 7 . . 6
4 . . . E   +   E . . . 4  =   4 . . . . . . . 5
o . . . .       . . . . o      o . . . . . . . o
S . . 1 o       o 1 . . S      S . . 1 o 8 . . E

आप खेल Tsuro की तरह हो सकता है , यह एक यादृच्छिक बोर्ड उत्पन्न करने के लिए टाइल्स का उपयोग करता है।


0

यदि आप इसके लिए तैयार हैं तो शायद रिवर्स इंजीनियरिंग आपकी मदद कर सकती है।

यदि प्रत्येक समस्या का एक और एक ही समाधान है, तो आप संभवतः अद्वितीय उत्तर के आधार पर एक ग्राफ उत्पन्न कर सकते हैं। इसके लिए आपको डायनामिक प्रोग्रामिंग करने या ब्रूट फोर्स को छोड़ने और एक व्यवस्थित पीढ़ी का विकल्प चुनने की आवश्यकता नहीं होगी।

आप इसके द्वारा जा सकते हैं:

  1. MxN ग्राफ को तैयार रखना
  2. एक / एकाधिक समाधान बनाना
  3. यदि यह एक विलक्षण समाधान समस्या है, तो इसके चारों ओर एक प्रश्न बनाना
  4. यदि समस्या के कई समाधान हैं, तो आप उपरोक्त प्रक्रिया को एक तरह से दोहरा सकते हैं ताकि वर्तमान पुनरावृत्ति दूसरे समाधान को बाधित न करे।

हालाँकि आपको समस्या जटिलता और समस्या के आकार के अनुसार एक उपकरण की आवश्यकता होगी जो आपके लिए यह प्रश्न उत्पन्न करेगा। सिर्फ जानवर-बल के लिए मत जाओ। इसके बजाय कुछ यादृच्छिक एल्गोरिदम आज़माएं। यह आपकी मदद कर सकता है।


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

0

कैसे एक और दृष्टिकोण के बारे में? एक खाली भूलभुलैया से शुरू करें और इस तरह से ब्लॉक जोड़ें:

  1. बेतरतीब ढंग से ब्लॉक और एंडिंग ब्लॉक।
  2. यादृच्छिक (लेकिन वापस नहीं) दिशा में और यादृच्छिक लंबाई (*) के साथ 1-3 "स्लाइडिंग" कदम बनाएं। प्रत्येक चरण के बाद एक ब्लॉक रखें (स्लाइड को रोकने के लिए)।
  3. बाहर निकलने के लिए सबसे छोटा रास्ता खोजें। यदि बहुत कम खंड (निम्न स्तर की कठिनाई) हैं, तो पथ का एक यादृच्छिक खंड लें और इसे ब्लॉक से विभाजित करें। अन्यथा, चरण 1 के रूप में एक ब्लॉक रखें और बाहर निकलें।
  4. 1 को सावधानी के साथ दोहराएं (*): जब आप एक स्लाइडिंग चरण की लंबाई चुनते हैं, तो इसे बनाएं ताकि आपके द्वारा डाला गया ब्लॉक पिछले पथ को बंद न करे।

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

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

और स्लाइडिंग चरणों की यादृच्छिक लंबाई के लिए एक और विचार - आप इसे चुनना चाह सकते हैं ताकि पहले रखे गए ब्लॉक का पुन: उपयोग हो, जब तक कि पथ ओवरलैप न हो।


@ Talon876 यह एक प्रकार का यादृच्छिक एल्गोरिदम है जिसके बारे में मैं बात कर रहा था।
c0da
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.