मैं किसी समस्या का एनकोड करने के लिए SAT सॉल्वर का उपयोग कर रहा हूँ, और SAT उदाहरण के भाग के रूप में, मेरे पास बूलियन वैरिएबल जहाँ यह इरादा है कि इनमें से एक सही होना चाहिए और बाकी सब होना चाहिए झूठा होना। (मैंने कभी-कभी इसे "एक-गर्म" एन्कोडिंग के रूप में वर्णित देखा है।)
मैं बाधा सांकेतिक शब्दों में बदलना चाहता हूँ "की ठीक एक बाहर सच होना चाहिए" सैट में। इस बाधा को सांकेतिक शब्दों में बदलना, सैट सॉल्वर को यथासंभव कुशलता से चलाने का सबसे अच्छा तरीका क्या है?
मैं इस बाधा को एनकोड करने के कई तरीके देख सकता हूं:
जोड़ीदार बाधाओं। मैं जोड़ो में कमी जोड़ सकता है सब के लिए मैं , जे सुनिश्चित करने के लिए अधिक से अधिक एक है कि x मैं सच है, और फिर जोड़ने के एक्स 1 ∨ एक्स 2 ∨ ⋯ ∨ एक्स एन सुनिश्चित करना है कि कम से कम एक सच है।
यह कहते हैं खंड और बिना किसी अतिरिक्त बूलियन चर।
बाइनरी एन्कोडिंग। मैं दे सकते हैं नई बूलियन चर मैं 1 , मैं 2 , ... , मैं lg n (बाइनरी में) का प्रतिनिधित्व करने के एक पूर्णांक मैं ऐसा है कि 1 ≤ मैं ≤ n (कुछ बूलियन की कमी जोड़ने सुनिश्चित करना है कि मैं वांछित सीमा में है )। फिर, मैं इस बात को जोड़ सकता हूं कि x i ट्री है और अन्य सभी x j झूठे हैं। दूसरे शब्दों में, प्रत्येक j के लिए , हम उस i = j को लागू करने वाले खंड जोड़ते हैं ।
यह क्लॉज़ जोड़ता है और मुझे नहीं पता कि कितने अतिरिक्त बूलियन वैरिएबल हैं।
सच्चे मूल्यों की संख्या गिनें। मैं बूलियन योजक सर्किट के एक पेड़ को लागू करने और आवश्यकता हो सकती है कि , प्रत्येक इलाज x मैं 0 के रूप में या किसी असत्य या सच के बजाय 1, और Tseitin सैट करने के लिए सर्किट कन्वर्ट करने के लिए बदलने का उपयोग खंड। अर्ध-योजक का एक पेड़ होता है: प्रत्येक अर्ध-योजक के कैरी आउटपुट को 0 होना चाहिए और अंतिम हाफ़-योजक के अंतिम उत्पादन में बाधा डालना 1. पेड़ को किसी भी आकार का चुना जा सकता है ( संतुलित बाइनरी ट्री, या असंतुलित, या जो भी हो)।
इस में किया जा सकता फाटकों और इस तरह कहते हैं Θ ( n ) खंड और Θ ( n ) नई बूलियन चर।
इस दृष्टिकोण का एक विशेष मामला बूलियन चर शुरू करने की है , विचार है कि साथ y मैं के मूल्य को शामिल करना चाहिए एक्स 1 ∨ एक्स 2 ∨ ⋯ ∨ एक्स मैं । इस आशय खंड जोड़कर लागू किया जा सकता y मैं ∨ ¬ एक्स मैं , y मैं ∨ ¬ y मैं - 1 , और ¬ y मैं ∨ एक्स मैं ∨ y मैं - =(जहाँ हम y 0 को असत्य के पर्याय के रूप मेंमानते हैं)i=1,…,n के लिए। इसके बाद, हम प्रतिबंध जोड़ सकते हैं¬ y मैं ∨¬ एक्स मैं + 1 के लिएमैं=1,2,...,n-1। यह मूल रूप से एक अर्ध-योजक वृक्ष के टेसिटिन परिवर्तन के बराबर है, जहां वृक्ष की अधिकतम असंतुलित आकृति होती है।
तितली नेटवर्क। मैं एक बना सकते हैं तितली नेटवर्क पर बिट्स, विवश n -बिट इनपुट होने के लिए 000 ⋯ 01 , विवश n -बिट उत्पादन होने की एक्स 1 एक्स 2 ⋯ एक्स एन , और एक स्वतंत्र गेट के रूप में प्रत्येक 2-बिट तितली गेट का इलाज या तो स्वैप करता है या उसके इनपुट को स्वैप नहीं करता है जिसके निर्णय के साथ एक नए नए बूलियन वैरिएबल पर आधारित होता है जो कि अप्रयुक्त छोड़ दिया जाता है। फिर, मैं सर्किट को सैट क्लॉस में बदलने के लिए टेसिटिन ट्रांसफ़ॉर्म लागू कर सकता हूं।
इसके लिए आवश्यक है फाटकों और इस तरह कहते हैं Θ ( n एलजी n ) खंड और Θ ( n एलजी n ) नई बूलियन चर।
क्या कोई अन्य तरीके हैं जिनकी मैंने अनदेखी की है? मुझे किसका उपयोग करना चाहिए? क्या किसी ने यह परीक्षण किया है या उन्हें प्रयोगात्मक रूप से आज़माया है, या किसी को इनमें से किसी के साथ कोई अनुभव नहीं है? क्या सैट सॉल्वर के प्रदर्शन पर इसके प्रभाव का आकलन करने के लिए क्लॉज़ और / या नए बूलियन वेरिएबल्स की संख्या एक अच्छा स्टैंड-इन मीट्रिक है, या यदि नहीं, तो आप किस मीट्रिक का उपयोग करेंगे?
मैंने अभी देखा कि इस उत्तर में SAT के लिए कार्डिनैलिटी की कमी को लागू करने के लिए कुछ संदर्भ हैं, यानी, इस कसौटी को लागू करना कि एन वेरिएबल्स में से वास्तव में सही हैं। तो, मेरा प्रश्न एक विशेष मामले में आता है जहां k = 1 । हो सकता है कि हृदय संबंधी बाधाओं पर साहित्य मेरे प्रश्न पर प्रकाश डालने में मदद करे।