2010-02-08 14 views
5

ठीक है, मैं अपने कोड लेखन कौशल (भाषा उचित रूप से विजुअल बेसिक) का अभ्यास करने के लिए एक टेट्रावेक्स समाधान प्रोग्राम बनाने की सोच रहा था और मुझे इसे हल करने के लिए एल्गोरिदम खोजने में मदद की ज़रूरत है। उन लोगों के लिए जो नहीं जानते कि टेट्रावेक्स को यह http://en.wikipedia.org/wiki/TetraVex क्या दिखाई देता है। एकमात्र एल्गोरिदम मैं ब्रूट फोर्स मार्ग के साथ आ सकता हूं, एक कोने में यादृच्छिक रूप से एक टाइल रखें और इसके आगे के हर संभव टाइल को आजमाएं और उसी प्रक्रिया को जारी रखें, अगर यह एक मृत अंत तक पहुंचता है तो पिछले राज्य में वापस आ जाता है और एक अलग जगह रखता है टाइल। तो क्या कोई बेहतर एल्गोरिदम के साथ आ सकता है? आपके समय के लिए शुक्रिया।टेट्रावेक्स को एल्गोरिदम को हल करना

उत्तर

3

यहां कुछ विचार।

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

एक सुधार हमेशा हर मुक्त स्थिति टुकड़े कि फिट की संख्या के लिए गिनती करने के लिए, और उसके बाद की स्थिति है कम से कम फिट बैठता है कि पर recurse है; अगर किसी के पास शून्य फिटिंग टुकड़े हैं, तो तुरंत बैकट्रैक; यदि कोई ऐसा स्थान है जहां केवल एक टुकड़ा भरता है और जारी रहता है (कोई शाखा नहीं बनाई जाती है); अन्यथा उस व्यक्ति का चयन करें जिसमें कम से कम फिटिंग टुकड़े (≥ 2) हैं और वहां से जारी रखें।

एक बार जब आपके पास यह एल्गोरिदम होता है, तो अगला प्रश्न यह है कि आप खोज स्थान को और कैसे छीन सकते हैं। यदि कहें, तो शीर्ष स्थिति पर "1" के साथ एक टुकड़े और नीचे की स्थिति पर "1" के साथ बी टुकड़े, और ए> बी, तो आप जानते हैं कि कम से कम ए - बी "शीर्ष स्थान पर" 1 के टुकड़े वास्तव में शीर्ष पंक्ति पर रखा जाना चाहिए, ताकि आप उन्हें किसी अन्य स्थिति से बाहर कर सकें। इससे शाखाकरण कारक को कम करने और पहले मृत-अंत को स्थानांतरित करने में मदद मिलती है।

तुम भी है कि हर टुकड़ा कम से कम एक स्थान (पुष्टि करने के लिए कोई टुकड़ा है कि गति के लिए केवल एक ही स्थान पर फिट बैठता है है कि वहाँ के बाद इस चेक करते हैं) जहां यह फिट बैठता है कि हर प्रत्यावर्तन कदम पर जांच होनी चाहिए। यदि कोई ऐसा टुकड़ा है जो कहीं भी फिट नहीं होता है तो आपको तुरंत बैकट्रैक की आवश्यकता होती है। आप यह जांचने के लिए विस्तार कर सकते हैं कि प्रत्येक टुकड़े की जोड़ी फिट हो सकती है जो संभावित रूप से बेहतर मृत-लॉक जांच क्षमता के लिए उपयुक्त है।

"गैर-कालक्रम संबंधी बैकट्रैकिंग" या "बैकजंपिंग" नामक एक रणनीति भी है जो अनुसंधान से एसएटी सुलझाने में उत्पन्न होती है। जब आप एक मृत अंत तक पहुंचते हैं तो यह आपको एक से अधिक स्तरों पर बैकट्रैक करने में मदद करता है; यदि आप चाहते हैं, तो आप अधिक जानने के लिए इन शर्तों के लिए Google पर जा सकते हैं, लेकिन आपको अपनी समस्या स्थान में अवधारणा को मानचित्रित करने के लिए कुछ मानसिक कार्य करने की आवश्यकता है।

+0

बहुत बहुत धन्यवाद, यह वास्तव में सहायक था (भले ही कुछ बिंदु पहले हाइलाइट किए गए थे) और आपके द्वारा उल्लिखित शर्तों में और अधिक देखेंगे। – Erethon

1

पहला सुधार यह गणना करेगा कि संख्याओं के कितने मिलान जोड़े हैं, और यदि कहें, वर्गों के शीर्ष पर 5 "1" हैं, लेकिन नीचे केवल 4 हैं, तो वहां एक होना चाहिए ग्रिड के शीर्ष को इंगित करते हुए "1"।

+0

हाँ, वास्तव में यह एक अच्छा सुधार है जिसे मैंने नहीं सोचा था (भले ही मैं खेलता हूं, मैं इसे इस तरह हल करता हूं)। धन्यवाद। – Erethon

1

किसी भी आंशिक रूप से बोर्ड को हल पर मैं करूंगा

  • एक जगह है जहाँ शेष टाइल्स से कोई भी खेला जा सकता है के लिए देखो। यदि पाया जाता है, तो बोर्ड को टाइल को यादृच्छिक रूप से खेला जाने वाला अंतिम स्थान अवांछित होना चाहिए।

  • ऐसी जगह की तलाश करें जहां शेष 1 टाइल्स कानूनी रूप से खेला जा सके। यदि पाया जाता है, तो उस टाइल रखें।

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

स्यूडोकोड में यह

top: 
    evaluate # of tiles that match at each empty square 
    if any square has 0 matches, unwind to <prev> 
    if any square has 1 match, lay tile, goto top 
    save current board as <prev> 
    play randomly at square with minimum number of matches, goto top 

एक अनुकूलन के रूप में हो सकता है, आप का मूल्यांकन, वर्गों है कि किसी भी वर्ग नहीं है कि टाइल्स को स्पर्श नहीं करते अनदेखा कर सकते हैं, क्योंकि वे हमेशा सभी शेष टाइल्स की अनुमति देगा।

+0

यह बहुत कुछ है जो मैंने पहले कहा था कि ब्रूट फोर्स क्या करता है। जब मैंने कहा "हर संभव टाइल का प्रयास करें", तो मेरा मतलब था कि हर संभव (और कानूनी) टाइल वहां रखा जाए। – Erethon

+0

मुझे लगता है कि मैं जिस मुख्य बिंदु को यहां बनाने की कोशिश कर रहा हूं वह हमेशा सबसे कम विकल्पों के साथ स्थान पर रखना है, और यदि केवल 1 विकल्प है, तो उस बोर्ड के लिए कभी भी अनचाहे कोई बिंदु नहीं है। –

+0

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

1

ऐसा लगता है जैसे टेट्रावेक्स Constraint Satisfaction Problem है, इसलिए आप जितनी जल्दी हो सके अपने विकल्पों को सीमित करना चाहते हैं। यादृच्छिक प्लेसमेंट से बेहतर करना संभव होना चाहिए। कैसे ?:

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

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

मैं नीचे से ऊपर तक टाइल के बीच सभी संभावित कनेक्शनों की सूची और दाएं से बाएं से टाइल के बीच सभी संभावित कनेक्शनों की एक सूची बनाकर शुरू करता हूं।

इन दो सूचियों से, मैं सभी संभावित वैध 2x2 संयोजनों की एक सूची तैयार करता हूं।

2x2 सूची का उपयोग करके, मैं सभी संभावित मान्य 3x3 संयोजनों की एक सूची तैयार करता हूं।

वहां से मैं 2x2 और 3x3 सूचियों का उपयोग कर 4x4 पर जा सकता हूं, या केवल 3x3 सूची का उपयोग करके 5x5 कर सकता हूं।

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


यह एक तंत्रिका नेट का उपयोग करने के लिए एक अच्छी स्थिति की तरह लगता है, और मैं इसे अगली कोशिश कर सकता हूं।

संबंधित मुद्दे