डी डी शब्दकोश को जाने दें। एम और एन ठीक करें। हम constraint satisfaction problem (सीएसपी) के रूप में एम × एन आयताकार खोजने की समस्या बना सकते हैं।
एक्स मैं, 1 है & hellip; एक्स मैं, एन ∈ डी और forall; मैं ∈ {1, & hellip ;, m}
एक्स 1, जे है & hellip; एक्स मी, जे ∈ डी और forall; j ∈ {1, & hellip ;, n}
एक्स i, j ∈ {ए, है & hellip ;, जेड} और forall; मैं ∈ {1, & hellip ;, m}, और forall; j ∈ {1, & hellip ;, n}
एक बहुत सीएसपी को हल करने के लिए आम दृष्टिकोण बाधा प्रसार के साथ बैकट्रैकिंग को जोड़ना है। संक्षेप में बोलते हुए, बैकट्रैकिंग का मतलब है कि हम एक वैरिएबल चुनते हैं, इसका मान अनुमान लगाते हैं, और एक कम चर के साथ उपप्रोबल को दोबारा हल करते हैं, और बाधा प्रचार का अर्थ है प्रत्येक चर के लिए संभावनाओं की संख्या को कम करने की कोशिश करना (संभवतः शून्य, जिसका मतलब है कि कोई समाधान नहीं है)।
एक उदाहरण के रूप में, हम एक्स 1,1 = Q
का चयन करके एक 3 × 3 ग्रिड शुरू हो सकता है।
Q??
???
???
एक अंग्रेजी शब्दकोश के साथ
, (स्क्रैबल से पहले “ शब्द ” में) x 1,2 और एक्स 2,1 है U
के लिए केवल संभावना।
सीएसपी को हल करने की कला बैकट्रैकिंग और बाधा प्रचार के बीच संतुलन है। यदि हम बाधाओं का प्रचार नहीं करते हैं, तो हम केवल ब्रूट फोर्स का उपयोग कर रहे हैं। अगर हम पूरी तरह से बाधाओं का प्रचार करते हैं, तो हमें बैकट्रैक की आवश्यकता नहीं है, लेकिन एक प्रचार एल्गोरिदम जो स्वयं द्वारा एनपी-हार्ड समस्या हल करता है, शायद चलाने के लिए महंगा है।
इस समस्या में, प्रत्येक बैकट्रैकिंग नोड पर एक बड़े शब्दकोश के साथ काम करना महंगा होगा जब तक कि हमारे पास अच्छी डेटा संरचना समर्थन न हो। मैं एक ऐसे दृष्टिकोण की रूपरेखा तैयार करूंगा जो trie या DAWG का उपयोग अक्षरों के सेट की गणना करने के लिए जल्दी से करता है जिसके माध्यम से एक उपसर्ग एक पूर्ण शब्द तक फैलता है।
प्रत्येक बैकट्रैकिंग नोड पर, हमारे द्वारा असाइन किए गए चर के सेट को एक युवा झुकाव है। दूसरे शब्दों में, कोई वैरिएबल तब तक असाइन नहीं किया जाता है जब तक कि इसके ऊपर के चर और बाईं ओर असाइन नहीं किया जाता है। नीचे दिए गए आरेख में, .
असाइन किए गए चर को इंगित करता है और *
और ?
असाइन किए गए चर को इंगित करता है।
.....*
...*??
...*??
..*???
*?????
चर चिह्नित *
अगले के लिए उम्मीदवारों एक मूल्य आवंटित करने के लिए कर रहे हैं। प्रत्येक विकल्प को एक निश्चित चर चुनने के बजाय कई विकल्पों का लाभ यह है कि कुछ परिवर्तनीय क्रम दूसरों की तुलना में काफी बेहतर हो सकते हैं।
प्रत्येक *
के लिए, त्रिभुज/डीएडब्ल्यूजी में दो लुकअप करें, एक क्षैतिज के लिए और एक लंबवत के लिए, और अगले अक्षरों के सेट के चौराहे की गणना करें। एक क्लासिक रणनीति उम्मीद में कम संभावनाओं के साथ चर का चयन करना है कि हम एक विरोधाभास तेजी से पहुंचते हैं। मुझे इस रणनीति को पसंद है क्योंकि यह स्वाभाविक रूप से prunes है जब शून्य संभावनाओं के साथ एक चर है और एक के साथ एक चर है जब स्वाभाविक रूप से प्रचार करता है। परिणामों को कैशिंग करके, हम प्रत्येक नोड का मूल्यांकन बहुत तेजी से कर सकते हैं।
यह लगता है एक Trie जैसे कि यह एक के लिए होगा बनाने स्क्रैबल का महान मजाक खेल। –
आपने इस समस्या को एनपी-हार्ड के रूप में टैग किया है; क्या यह एक ज्ञात एनपी-हार्ड समस्या है, या यह सिर्फ आपकी अटकलें है? – templatetypedef
@ डेविडब्रिगाडा हाँ मुझे पता है! मैं इस तरह की चीज़ के लिए इसका उपयोग करने के बारे में सोच रहा हूं :) – Adrian