ठीक है, मैं अपने कोड लेखन कौशल (भाषा उचित रूप से विजुअल बेसिक) का अभ्यास करने के लिए एक टेट्रावेक्स समाधान प्रोग्राम बनाने की सोच रहा था और मुझे इसे हल करने के लिए एल्गोरिदम खोजने में मदद की ज़रूरत है। उन लोगों के लिए जो नहीं जानते कि टेट्रावेक्स को यह http://en.wikipedia.org/wiki/TetraVex क्या दिखाई देता है। एकमात्र एल्गोरिदम मैं ब्रूट फोर्स मार्ग के साथ आ सकता हूं, एक कोने में यादृच्छिक रूप से एक टाइल रखें और इसके आगे के हर संभव टाइल को आजमाएं और उसी प्रक्रिया को जारी रखें, अगर यह एक मृत अंत तक पहुंचता है तो पिछले राज्य में वापस आ जाता है और एक अलग जगह रखता है टाइल। तो क्या कोई बेहतर एल्गोरिदम के साथ आ सकता है? आपके समय के लिए शुक्रिया।टेट्रावेक्स को एल्गोरिदम को हल करना
उत्तर
यहां कुछ विचार।
एक वेनिला ब्रूट फोर्स एल्गोरिदम एक निश्चित क्रम (जैसे पंक्ति प्रमुख) में ग्रिड पोजिशन को समझाकर ग्रिड को भरने का प्रयास करेगा और हमेशा मौजूदा स्थिति में हर संभावित टुकड़े को फिट करने और फिर रिकर्सिंग करने का प्रयास करेगा। आपने जो उल्लेख किया है और यह बहुत अक्षम है।
एक सुधार हमेशा हर मुक्त स्थिति टुकड़े कि फिट की संख्या के लिए गिनती करने के लिए, और उसके बाद की स्थिति है कम से कम फिट बैठता है कि पर recurse है; अगर किसी के पास शून्य फिटिंग टुकड़े हैं, तो तुरंत बैकट्रैक; यदि कोई ऐसा स्थान है जहां केवल एक टुकड़ा भरता है और जारी रहता है (कोई शाखा नहीं बनाई जाती है); अन्यथा उस व्यक्ति का चयन करें जिसमें कम से कम फिटिंग टुकड़े (≥ 2) हैं और वहां से जारी रखें।
एक बार जब आपके पास यह एल्गोरिदम होता है, तो अगला प्रश्न यह है कि आप खोज स्थान को और कैसे छीन सकते हैं। यदि कहें, तो शीर्ष स्थिति पर "1" के साथ एक टुकड़े और नीचे की स्थिति पर "1" के साथ बी टुकड़े, और ए> बी, तो आप जानते हैं कि कम से कम ए - बी "शीर्ष स्थान पर" 1 के टुकड़े वास्तव में शीर्ष पंक्ति पर रखा जाना चाहिए, ताकि आप उन्हें किसी अन्य स्थिति से बाहर कर सकें। इससे शाखाकरण कारक को कम करने और पहले मृत-अंत को स्थानांतरित करने में मदद मिलती है।
तुम भी है कि हर टुकड़ा कम से कम एक स्थान (पुष्टि करने के लिए कोई टुकड़ा है कि गति के लिए केवल एक ही स्थान पर फिट बैठता है है कि वहाँ के बाद इस चेक करते हैं) जहां यह फिट बैठता है कि हर प्रत्यावर्तन कदम पर जांच होनी चाहिए। यदि कोई ऐसा टुकड़ा है जो कहीं भी फिट नहीं होता है तो आपको तुरंत बैकट्रैक की आवश्यकता होती है। आप यह जांचने के लिए विस्तार कर सकते हैं कि प्रत्येक टुकड़े की जोड़ी फिट हो सकती है जो संभावित रूप से बेहतर मृत-लॉक जांच क्षमता के लिए उपयुक्त है।
"गैर-कालक्रम संबंधी बैकट्रैकिंग" या "बैकजंपिंग" नामक एक रणनीति भी है जो अनुसंधान से एसएटी सुलझाने में उत्पन्न होती है। जब आप एक मृत अंत तक पहुंचते हैं तो यह आपको एक से अधिक स्तरों पर बैकट्रैक करने में मदद करता है; यदि आप चाहते हैं, तो आप अधिक जानने के लिए इन शर्तों के लिए Google पर जा सकते हैं, लेकिन आपको अपनी समस्या स्थान में अवधारणा को मानचित्रित करने के लिए कुछ मानसिक कार्य करने की आवश्यकता है।
पहला सुधार यह गणना करेगा कि संख्याओं के कितने मिलान जोड़े हैं, और यदि कहें, वर्गों के शीर्ष पर 5 "1" हैं, लेकिन नीचे केवल 4 हैं, तो वहां एक होना चाहिए ग्रिड के शीर्ष को इंगित करते हुए "1"।
हाँ, वास्तव में यह एक अच्छा सुधार है जिसे मैंने नहीं सोचा था (भले ही मैं खेलता हूं, मैं इसे इस तरह हल करता हूं)। धन्यवाद। – Erethon
किसी भी आंशिक रूप से बोर्ड को हल पर मैं करूंगा
एक जगह है जहाँ शेष टाइल्स से कोई भी खेला जा सकता है के लिए देखो। यदि पाया जाता है, तो बोर्ड को टाइल को यादृच्छिक रूप से खेला जाने वाला अंतिम स्थान अवांछित होना चाहिए।
ऐसी जगह की तलाश करें जहां शेष 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
एक अनुकूलन के रूप में हो सकता है, आप का मूल्यांकन, वर्गों है कि किसी भी वर्ग नहीं है कि टाइल्स को स्पर्श नहीं करते अनदेखा कर सकते हैं, क्योंकि वे हमेशा सभी शेष टाइल्स की अनुमति देगा।
यह बहुत कुछ है जो मैंने पहले कहा था कि ब्रूट फोर्स क्या करता है। जब मैंने कहा "हर संभव टाइल का प्रयास करें", तो मेरा मतलब था कि हर संभव (और कानूनी) टाइल वहां रखा जाए। – Erethon
मुझे लगता है कि मैं जिस मुख्य बिंदु को यहां बनाने की कोशिश कर रहा हूं वह हमेशा सबसे कम विकल्पों के साथ स्थान पर रखना है, और यदि केवल 1 विकल्प है, तो उस बोर्ड के लिए कभी भी अनचाहे कोई बिंदु नहीं है। –
ओह, हाँ अब मुझे तुम्हारा क्या मतलब है।मैं सिर्फ एक टाइल के दाईं ओर एक संभावित कदम की तलाश करने के बारे में सोच रहा था (उदाहरण के लिए), जबकि आप टाइल के नीचे भी देखना चाहते थे, इसलिए यदि कोई संभावित कदम नहीं है तो इसमें कोई बात नहीं है चालू और हमें पिछले राज्य में वापस जाना चाहिए। अच्छा एक :) – Erethon
ऐसा लगता है जैसे टेट्रावेक्स Constraint Satisfaction Problem है, इसलिए आप जितनी जल्दी हो सके अपने विकल्पों को सीमित करना चाहते हैं। यादृच्छिक प्लेसमेंट से बेहतर करना संभव होना चाहिए। कैसे ?:
- अपने संभावित मैचों के साथ सभी टाइल चेहरों के बीच लिंक बनाएं।
- एक अनलिंक चेहरे वाला कोई भी टाइल एक किनारे टाइल होना चाहिए।
- दो आसन्न अनलिंक चेहरों वाला कोई भी टाइल एक कोने टाइल होना चाहिए।
- केंद्र टाइल्स में चार सक्रिय लिंक होना चाहिए।
- अब, एक मान्य स्थान में एक टाइल रखें और उपयोग किए गए लिंक को अमान्य करें। यदि किसी भी अनियंत्रित टाइल में तीन अनलिंक चेहरे या विपरीत पक्षों पर अनलिंक चेहरे होते हैं, तो चाल अमान्य है और आप बैकट्रैक कर सकते हैं।
- आप सभी टाइलों के माध्यम से खोज कर अगले संभव टाइल के विरुद्ध टाइल फेस लिंक का उपयोग करने में सक्षम होना चाहिए। यदि कोई नहीं है, बैकट्रैक।
मैंने टेट्रावेक्स के लिए एक सॉल्वर लिखा और एक अलग दृष्टिकोण का उपयोग किया और यह बहुत ही कुशल लगता है। मैंने आकार में वृद्धि के संभावित वैध संबंध बनाए। इसलिए प्रत्येक पुनरावृत्ति मुझे काम करने के लिए बड़े पहेली टुकड़े देता है जबकि बोलने की पहेली की संख्या को कम करता है, इसलिए बोलने के लिए।
मैं नीचे से ऊपर तक टाइल के बीच सभी संभावित कनेक्शनों की सूची और दाएं से बाएं से टाइल के बीच सभी संभावित कनेक्शनों की एक सूची बनाकर शुरू करता हूं।
इन दो सूचियों से, मैं सभी संभावित वैध 2x2 संयोजनों की एक सूची तैयार करता हूं।
2x2 सूची का उपयोग करके, मैं सभी संभावित मान्य 3x3 संयोजनों की एक सूची तैयार करता हूं।
वहां से मैं 2x2 और 3x3 सूचियों का उपयोग कर 4x4 पर जा सकता हूं, या केवल 3x3 सूची का उपयोग करके 5x5 कर सकता हूं।
अभी मेरा कोड प्रत्येक पुनरावृत्ति को अलग से करता है, लेकिन प्रत्येक कोड को उसी कोड के साथ संभालने के लिए साफ किया जाना चाहिए जो बड़े ग्रिड आकारों की अनुमति देगा।
यह एक तंत्रिका नेट का उपयोग करने के लिए एक अच्छी स्थिति की तरह लगता है, और मैं इसे अगली कोशिश कर सकता हूं।
- 1. स्ट्रिंग कमी को हल करना एल्गोरिदम
- 2. एल्गोरिदम - एक चर में रैखिक समीकरण को हल करना
- 3. गेम एल्गोरिदम को हल करना (बटनिया, रोशनी-आउट संस्करण)
- 4. मेरी माइन्सवीपर को हल करने में एल्गोरिदम
- 5. पेड़ संघर्ष को हल करना
- 6. परिपत्र डिप्लेन्सी को हल करना
- 7. इंटेगर नॅपैकैक को हल करना
- 8. मैं 'क्लासिक' knapsack एल्गोरिदम को पुनरावर्ती कैसे हल करूं?
- 9. एन क्वींस प्रभुत्व पहेली को हल करने के लिए एल्गोरिदम
- 10. गिट एसवीएन संघर्षों को हल करना
- 11. क्लोजर परिपत्र निर्भरताओं को हल करना
- 12. गलत प्रोजेक्ट संदर्भ GUIDs को हल करना
- 13. MATLAB में एक मैट्रिक्स को हल करना?
- 14. स्वत: और मैन्युअल निर्भरताओं को हल करना
- 15. एक रैखिक समीकरण को हल करना
- 16. ग्रोवी मैप क्लास को हल करना
- 17. gmail.com मेल सर्वर को हल करना
- 18. सरल svn संघर्षों को हल करना
- 19. 3x3 त्रि-आयामी बॉक्स पहेली को हल करने के लिए ए * खोज एल्गोरिदम का उपयोग करना?
- 20. रूबी इनलाइन सी कोड संकलित करना - त्रुटियों को हल करना
- 21. संख्यात्मक रूप से nonlinear समीकरणों को हल करना
- 22. सबलाइनर लेकिन सरल गतिशील उत्तल हल एल्गोरिदम?
- 23. रेल अनुप्रयोग में कक्षा नाम संघर्ष को हल करना
- 24. एज-केस हास्केल मॉड्यूल आयात और निर्यात को हल करना
- 25. जावा रिकर्सन समस्या के साथ एक भूलभुलैया को हल करना
- 26. एकता में प्रतिनिधियों के साथ संकल्पों को हल करना
- 27. objdump और स्थानीय फ़ंक्शन कॉल के लिंक को हल करना?
- 28. स्पिंक्स में संदर्भों में नाम विवादों को हल करना, intersphinx
- 29. गिट में एक 'दोनों जोड़ा' विलय संघर्ष को हल करना?
- 30. प्रकार के साथ मज़ा! एकाधिक उदाहरण घोषणाओं को हल करना
बहुत बहुत धन्यवाद, यह वास्तव में सहायक था (भले ही कुछ बिंदु पहले हाइलाइट किए गए थे) और आपके द्वारा उल्लिखित शर्तों में और अधिक देखेंगे। – Erethon