मान लें कि मैं एक प्रोग्रामर हूं और मुझे एक एनपी-पूर्ण समस्या है जिसे मुझे हल करने की आवश्यकता है। एनपीसी समस्याओं से निपटने के लिए कौन से तरीके उपलब्ध हैं? क्या इस विषय पर एक सर्वेक्षण या कुछ समान है?
मान लें कि मैं एक प्रोग्रामर हूं और मुझे एक एनपी-पूर्ण समस्या है जिसे मुझे हल करने की आवश्यकता है। एनपीसी समस्याओं से निपटने के लिए कौन से तरीके उपलब्ध हैं? क्या इस विषय पर एक सर्वेक्षण या कुछ समान है?
जवाबों:
अच्छी तरह से अध्ययन की गई कई रणनीतियाँ हैं; जो आपके आवेदन में सबसे अच्छा है वह परिस्थिति पर निर्भर करता है।
सबसे खराब स्थिति में सुधार करें
समस्या-विशिष्ट अंतर्दृष्टि का उपयोग करके, आप अक्सर भोले एल्गोरिथ्म में सुधार कर सकते हैं। उदाहरण के लिए,[1] केसाथ Vertex Cover के लिएएल्गोरिदम हैं; यहभोले-भालेपरएक बहुत बड़ा सुधार है और उदाहरण के लिए आपके ट्रैक्टेबल के लिए प्रासंगिक हो सकता है।ग < 1.3 Ω ( 2 n )
अपेक्षित रनटाइम में सुधार करें। सांख्यिकी
का उपयोग करके, आप अक्सर ऐसे एल्गोरिदम को तैयार कर सकते हैं जो कई उदाहरणों पर तेज़ हैं। यदि उन लोगों में सबसे अधिक शामिल हैं जो आप अभ्यास में मिलते हैं, तो आप सुनहरे हैं। उदाहरण सैट हैं जिसके लिए काफी शामिल सॉल्वर्स मौजूद हैं, और सिम्पलेक्स एल्गोरिथ्म (जो एक बहुपद समस्या का हल करता है, लेकिन अभी भी)। एक बुनियादी तकनीक जो अक्सर सहायक होती है वह शाखा और बाध्य होती है ।
समस्या को प्रतिबंधित करें
यदि आप अपने इनपुट पर अधिक अनुमान लगा सकते हैं, तो समस्या आसान हो सकती है।
परिणाम को कमजोर करें
इसका मतलब है कि आप गलत या अधूरे परिणाम को सहन करते हैं। दो मुख्य स्वाद हैं:
एक पूरी तरह से उपचार के लिए Hromkovič द्वारा हार्ड समस्याओं के लिए एल्गोरिथ्म का संदर्भ लें ।
अन्य उत्तरों ने इसे अधिक सैद्धांतिक दृष्टिकोण से संबोधित किया है। यहाँ एक अधिक व्यावहारिक दृष्टिकोण है।
"विशिष्ट" एनपी-पूर्ण निर्णय समस्याओं के लिए ( "क्या कोई ऐसी चीज़ मौजूद है जो इन सभी बाधाओं को संतुष्ट करती है?" ), यह वही है जो मैं हमेशा पहले प्रयास करूंगा:
एक साधारण प्रोग्राम लिखें जो आपकी समस्या उदाहरण को SAT उदाहरण के रूप में बताता है ।
फिर एक अच्छा सैट सॉल्वर लें , इसे चलाएं (सबसे तेज मल्टी-कोर कंप्यूटर का उपयोग करें जो आपके पास होता है), और देखें कि क्या होता है।
छोटे उदाहरणों के साथ पहले यह जानने की कोशिश करें कि इसमें कितना समय लग सकता है।
हैरानी की बात है अक्सर, इस दृष्टिकोण है ज्यादा अपने वर्तमान समस्या के लिए विशेष रूप से अपने स्वयं के solver लागू करने के लिए कोशिश कर रहा से बेहतर:
सैट सॉल्वर बहुत चालाक और अच्छी तरह से अनुकूलित होते हैं। वे आसानी से अपने पीछे के खोज के आपके कार्यान्वयन को बेहतर बनाते हैं (चाहे आप अपने कोड को अनुकूलित करने में कितना समय बर्बाद करते हों)। वे आसानी से कई ऑफ-द-सेल्फ विकल्प जैसे कि पूर्णांक लीनियर प्रोग्रामिंग सॉल्वर को आसानी से समझ लेते हैं।
इसके लिए बहुत कम प्रोग्रामिंग की आवश्यकता होती है। चरण 1 अपेक्षाकृत सीधा है और यह प्रदर्शन-महत्वपूर्ण नहीं है; आप पायथन जैसे स्क्रिप्टिंग भाषाओं का उपयोग कर सकते हैं। किसी और ने पहले से ही चरण 2 के लिए आवश्यक सभी चीजों को लागू करने का ध्यान रखा है।
विशिष्ट एनपी-हार्ड अनुकूलन समस्याओं के लिए ( "इन सभी बाधाओं को पूरा करने वाली सबसे छोटी चीज़ को ढूंढें" ) यह दृष्टिकोण काम कर सकता है या नहीं हो सकता है।
यदि आप इसे आसानी से निर्णय की समस्या में बदल सकते हैं ( "क्या आकार 4 की कोई चीज़ मौजूद है जो इन सभी बाधाओं को संतुष्ट करती है?" , "आकार 3 के बारे में क्या?" ), महान, निर्णय समस्याओं के साथ ऊपर के रूप में उसी दृष्टिकोण का पालन करें।
अन्यथा, आप एक हेयोरिस्टिक सॉल्वर का सहारा लेना चाह सकते हैं जो एक छोटा समाधान खोजने की कोशिश करता है (जरूरी नहीं कि सबसे छोटा समाधान)। उदाहरण के लिए:
अपनी समस्या को एक (भारित) MAX-SAT उदाहरण के रूप में एन्कोड करें ।
UBCSAT पैकेज से अनुमानी सॉल्वर का उपयोग करें । Heuristic solvers तुच्छ रूप से समानांतर करते हैं; सैकड़ों कंप्यूटरों के साथ एक कंप्यूटर क्लस्टर खोजने का प्रयास करें। जब तक आप चाहते हैं आप सॉल्वरों को चला सकते हैं, और फिर सबसे अच्छा समाधान ले सकते हैं जो आपने अब तक पाया है।
अव्यवस्था पर हमला करने का एक तरीका पैरामीरिज्ड जटिलता के संदर्भ में समस्या के बारे में सोच रहा है।
में parametrized जटिलता हम कुछ पैरामीटर (जैसे कि फिक्सिंग से समस्या का समाधान )। यदि हम समय में कुछ समस्या को हल करने में सक्षम हैं , तो हम कहते हैं कि समस्या में निर्धारित पैरामीटर ट्रैक्टेबल है । यहाँ केवल कुछ कम्प्यूटेबल फंक्शन है। एनपी-हार्ड समस्याएं बहुत हैं जो एफपीटी हैं, हालांकि, एनपी में कई समस्याएं हैं जो माना जाता है कि तय पैरामीटर ट्रैक्टेबल नहीं हैं।f ( k ) ⋅ p ( n ) k f ( k )
यदि कुछ पैरामीटर को ठीक करके हम समय में एक समस्या को हल कर सकते हैं , तो इस समस्या को XP में कहा जाता है। हम मानते हैं कि XP FPT के बराबर नहीं है (जिस तरह हम P NP मानते हैं )। लेकिन इन दोनों (FPT और XP) के बीच बहुत सी समस्याएं हैं, और हमने एक पदानुक्रम (वास्तव में कई) को परिभाषित किया है, उनमें से एक डब्ल्यू-पदानुक्रम है। डब्ल्यू पदानुक्रम में आपके पास एनपी-पूर्ण कक्षाओं में कटौती जैसी कमी है, इसके अलावा, हम पॉलिटाइम कटौती की तलाश नहीं कर रहे हैं, हमें बस एफपीटी कटौती की आवश्यकता है। कक्षा W [0] वर्ग FPT है।≠
डब्ल्यू पदानुक्रम के विभिन्न वर्गों में ये कुछ नमूने हैं:
ये एनपी समस्याओं को और अधिक सटीक तरीके से वर्गीकृत करने के लिए जटिलताओं का एक और स्तर है और यदि आप अधिक चाहते हैं तो आप पेरीमीकृत सर्किट कॉम्प्लेक्सिटी और डब्ल्यू हेयार्की द्वारा डाउनी एट अल (1998) को देख सकते हैं।
और यदि आप और भी अधिक चाहते हैं कि फ्लम और ग्रोह के परिमित जटिलता सिद्धांत को पढ़ना अच्छा है ।
और अंत में:
यह ज्ञात है कि यदि समस्या में एफपीटीएएस (पूरी तरह से बहुपद-काल अनुमान योजना ) है तो यह भी एफपीटी (जो स्पष्ट है) लेकिन रिवर्स दिशा में अच्छी तरह से ज्ञात कुछ भी नहीं है, पीटीएएस और एक्सपी के संबंध पर भी कुछ काम हैं, लेकिन वहां पीटीएएस और डब्ल्यू पदानुक्रम के बीच बहुत तंग संबंध नहीं है (कम से कम मुझे इस समय पता नहीं है)।
इसके अलावा कुछ मामलों में हम कुछ अलग मापदंडों को ठीक कर सकते हैं, उदाहरण के लिए: ग्राफ़ में सबसे लंबे पथ की लंबाई बंधी हुई है और एक समाधान का आकार बाध्य है (उदाहरण के लिए प्रतिक्रिया शीर्ष सेट), ...
हो सकता है कुछ लोगों का मानना है कि व्यवहार में पैराट्राइज्ड जटिलता बेकार है। लेकिन यह गलत है। कई पैरामीरिज्ड एल्गोरिदम एक वास्तविक दुनिया अनुप्रयोगों में खोजे जाते हैं, जब आप कुछ मापदंडों को ठीक कर सकते हैं, तो यहां एक उदाहरण है:
पैरामीरिज्ड जटिलता में एक मुख्य प्रमेय में से एक, कोर्टेल के लिए है, वह चल रहे समय के पैरामीट्रिक समस्याओं के कुछ वर्गों के लिए एक एल्गोरिथ्म प्रदान करता है। के टावरों की संख्या है , जिसके लिए साधन , असंभव है। लेकिन, एक समूह ने अपने एल्गोरिथ्म को कुछ विशेष मामलों पर कुछ संशोधनों के साथ लागू किया, और उन्हें वर्टेक्स कवर के लिए बेहद तेज एल्गोरिदम मिला, जो वर्तमान में जर्मनी के कुछ मेट्रो स्टेशनों में उपयोग किया जाता है।2 ओ ( के ) के = 10
टीएसपी के लिए सबसे तेज़ और सटीक ह्यूरिस्टिक एल्गोरिदम में से एक है: टूर मर्जिंग और शाखा अपघटन , जो समस्या के पैरामीरिज़ेशन का उपयोग करता है (सीधे नहीं, लेकिन शाखा अपघटन और उनके द्वारा उपयोग किए जाने वाले गतिशील प्रोग्रामिंग दृष्टिकोण कुछ अच्छी धारणाओं पर आधारित है)।
एनपी पूर्णता सबसे खराब स्थिति है। जिस समस्या पर आप काम कर रहे हैं, उसके आधार पर, उदाहरणों के कई वर्ग व्यवहार में उचित समय में हल हो सकते हैं (हालांकि आपको अच्छे रनटाइम प्राप्त करने के लिए अधिक विशिष्ट एल्गोरिथ्म की आवश्यकता हो सकती है)।
यह देखने पर विचार करें कि क्या बूलियन सैटिस्फैबिलिटी या इंटेगर लीनियर प्रोग्रामिंग जैसे उपलब्ध सॉल्वरों के साथ आपकी समस्या से एक कुशल कमी है।
आपके पास सामान्य रूप से तीन विकल्प हैं: पहला आपकी समस्या के विशेष मामलों पर विचार करना है । कुछ विशेष मामलों में, आपकी समस्या व्याख्या करने योग्य polynomially जैसे निर्धारित करने से एक सरल रास्ता वहाँ मौजूद है या नहीं हो सकता है को को एक मनमाना निर्देशित ग्राफ में एनपी पूरा है लेकिन यह बहुपद हो जाएगा (लीनियर) जब कम करने योग्य है। दूसरा विकल्प अपनी समस्या को हल करने के लिए एक अच्छा अनुमान एल्गोरिथ्म का उपयोग करना है। अनुमान एल्गोरिदम आपकी समस्या के निकट-इष्टतम उत्तर प्रदान करते हैं। यदि आप पिछले विकल्पों का उपयोग नहीं कर सकते हैं, तो केवल शेष तरीका होगा: घातीय समय में अपनी समस्या को हल करने के लिए एक सहनीय एल्गोरिथ्म का उपयोग करनाv j v k G G। घातीय एल्गोरिदम के बीच, उनमें से कुछ का रनिंग टाइम सहनीय हो सकता है जब आपकी समस्या का इनपुट आकार किसी विशिष्ट मान से कम हो।
यद्यपि कुछ उत्तरों में संक्षिप्त रूप से छुआ गया है, मुझे इस बात पर जोर देना चाहिए कि व्यवहार में, एनपी-पूर्ण समस्याओं को हर समय हल किया जाता है (या अनुमानित)। मुख्य कारण है कि आप अभ्यास में एनपी-पूर्ण समस्याओं को हल कर सकते हैं:
व्यवहार में आने वाले उदाहरण "सबसे खराब स्थिति" नहीं हैं।
विसंगति का एक और कारण है:
औपचारिक रूप से अनुमानी एल्गोरिदम का विश्लेषण करना मुश्किल है।
व्यवहार में, आप अपनी एनपी-पूर्ण समस्याओं को हल करने के लिए अनुमानी एल्गोरिदम का उपयोग करते हैं, और सर्वोत्तम के लिए आशा करते हैं। परिणाम अक्सर आश्चर्यजनक होते हैं।
अन्य उत्तर में छुआ गया एक और मुद्दा है:
कभी-कभी घातीय एल्गोरिदम काफी तेज होते हैं।
वह समस्या पर निर्भर करता है। जब बड़ा डेटा शामिल होता है, तो हमारे पास इसके विपरीत अधिकतम होता है:
कभी-कभी एकमात्र संभव एल्गोरिदम quasilinear होते हैं।
मुझे डर है कि यहाँ भीड़ सैद्धांतिक रूप से झुकी हुई है। आपको मुख्य स्टैकएक्सचेंज साइट पर बेहतर उत्तर मिल सकते हैं।