कप्तान Cajun की नौका पर Zoombinis बैठने के लिए एल्गोरिथ्म?


12

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

अपरिचित लोगों के लिए, एक ज़ोम्बीनी 4 विशेषताओं वाला एक प्राणी है: बाल, आंखें, नाक और पैर। उन विशेषताओं में से प्रत्येक में 5 संभावित मान हैं; उदाहरण के लिए, एक ज़ोम्बीनी के पैर पहियों, रोलर स्केट्स, स्नीकर्स, एक स्प्रिंग या एक प्रोपेलर हो सकते हैं। यहाँ गन्दे बालों, चश्मे, हरी नाक और स्नीकर्स के साथ ज़ोम्बीनी का उदाहरण दिया गया है:

फेरीबोट पहेली में, एक नौका नाव की 16 सीटों पर 16 ज़ोम्बिनियों के संग्रह की व्यवस्था करना है। व्यवस्था को नियम का पालन करना होगा कि किसी भी दो ऑर्थोगोनली पड़ोसी सीटों पर ज़ोम्बिनियों का कब्जा होना चाहिए जो कम से कम एक विशेषता साझा करते हैं। यदि दो ज़ोम्बिनियों के बाल अलग हैं, अलग-अलग आँखें, अलग-अलग नाक और एक-दूसरे से अलग - अलग पैर हैं, तो वे एक-दूसरे के बगल में नहीं बैठ सकते हैं।

सीटों की व्यवस्था स्तर से बदलती है; संक्षिप्तता के लिए, "बहुत कठिन" स्तर पर ध्यान केंद्रित करते हैं, जिसमें 16 सीटों को 4-बाय -4 ग्रिड में व्यवस्थित किया जाता है। यहाँ एक उदाहरण है जहाँ 15 ज़ोम्बिनियों को कानूनी रूप से बैठाया गया है, लेकिन डॉक पर खड़ी अंतिम ज़ोम्बीनी को अंतिम खाली सीट पर नहीं रखा जा सकता है, क्योंकि वह ज़ोम्बीनी के साथ अपने अधिकार में कोई सुविधाएँ साझा नहीं करेगी:

लगभग पूर्ण पहेली का उदाहरण

16 हैं! सीटों के लिए ज़ोम्बीनीज़ के 21 ट्रिलियन संभव असाइनमेंट। तो बस हर संभव असाइनमेंट के माध्यम से चल रहा है यह देखने के लिए कि क्या यह कानूनी नहीं है व्यावहारिक नहीं होगा। कुछ समस्याएँ हैं जिन्हें मैं समझदारी से इस समस्या के लिए नियोजित कर सकता हूँ?


2
यह मुझे सुडोकू की याद दिलाता है, और सुडोकू सॉल्वर आमतौर पर कुछ प्रकार के बैकट्रैकिंग को लागू करते हैं।
मट्टकेपु जू

2
यदि आप कुछ और जटिल साहित्य के माध्यम से खुदाई करने के लिए तैयार हैं और तैयार हैं, तो आप खोज कर उपयोगी जानकारी पा सकते हैं Subgraph Isomorphism Problem। समस्या एक ग्राफ को दूसरे ग्राफ में ढूंढना है। आपके मामले में सबग्राफ में बैठने की जगह होगी (किनारों पर बगल हैं), जबकि माता-पिता का ग्राफ ज़ोम्बीनीज़ होगा, जहां कनेक्शन एक साझा विशेषता की उपस्थिति होगी। ध्यान दें कि सामान्य रूप से समस्या एनपी-पूर्ण है और आमतौर पर बैकट्रैकिंग द्वारा भी की जाती है, हालांकि कुछ विशेष मामलों के लिए (जिनमें से आपका ग्राफ बहुत अच्छा हो सकता है), बहुपद या रैखिक समाधान भी संभव हैं।
साधारण

यह एक महान विचार है, मैं एक बच्चे के रूप में ज़ोम्बीनीज़ से प्यार करता था - मैं बस यही काम कर सकता हूं!
एलेक्सफॉक्सगिल

जवाबों:


8

"Backtracking एल्गोरिथ्म" के उपयोगी Google खोज शब्द के लिए @mattecapu को धन्यवाद। वह मुझे सोचा था कि मैं जरूरत के लिए खाना दिया।

मेरा वर्तमान अंतर्ज्ञान यह है कि केंद्र की सीटों को भरने के लिए बेहतर हो सकता है - जिसमें 4 पड़ोसी हैं - पहले, और कोने की सीटों को बचाएं - जिनके पास केवल 2 पड़ोसी हैं - पिछले के लिए। इसलिए मैं इस क्रम में 16 खाली सीटों को लिंक-लिस्ट में व्यवस्थित करता हूं:

13   5   6  14

 7   1   2   9

 8   3   4  10

15  11  12  16

यहाँ कुछ स्यूडोकोड है, जो उस फ़ंक्शन का वर्णन करता है जिसे मैं लिखता हूं। आप इसे एक सूची खिलाते हैं जिसमें 16-ज़ोम्बीनीज़ और एक संकेतक है जो लिंक्ड-लिस्ट में पहली सीट पर है।

function recursively_assign_seat(zoombini_list, seat):

    if zoombini_list is empty:
        return True

    else:
        for each z in zoombini_list:

            for each n in seat.neighbors:
                if not allowed_as_neighbors(z, n):
                    next z

            seat.occupant ← z
            if recursively_assign_seat(zoombini_list.remove(z), seat.next):
                return True
            else:
                seat.occupant ← None

        return False

यह वास्तव में आश्चर्यजनक रूप से जल्दी से चलता है! मैं इससे बहुत खुश था।

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


1
जब आप को भरने के 8आप केवल करने के लिए आसन्न हैं 2, लेकिन आप भरने हो सकता है 9जो दोनों के निकट है 7और 3। अच्छा काम हालांकि यह हल!
एलेक्सफॉक्सगिल

बनाया है कि संपादित करें; अभी भी यकीन नहीं है कि क्या अंदर-बाहर स्कीम सिर्फ पंक्ति-दर-पंक्ति में भरना है, हालांकि। शायद मैं कुछ समय परीक्षण करूँगा।
thecommexokid
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.