2012-06-23 21 views
17

एक दोस्त ने आज मुझे एक असाइनमेंट समस्या के बारे में एक प्रश्न पूछा। मुझे एक काफी सरल समाधान मिला, लेकिन मुझे लगता है कि इसे सरल और तेज़ बनाया जा सकता है। आपकी मदद की सराहना की जाएगी।प्राथमिकताओं का सम्मान करते समय लोगों को भवनों में निर्दिष्ट करना?

समस्या: मान लिया जाये कि मैं एन लोग है, मैं, प्रत्येक भवन कश्मीर लोग घर कर सकते हैं उन्हें एम भवनों में सौंपने होंगे। सभी लोग एक-दूसरे के साथ रहने के इच्छुक नहीं हैं, इसलिए मेरे पास एन * एन कोशिकाओं का एक मैट्रिक्स है और एक ऐसा व्यक्ति है जो एक दूसरे के साथ रहने के इच्छुक हैं। यदि किसी कक्ष में 1 होता है तो इसका मतलब है कि मैं और जे एक साथ रह सकते हैं। स्पष्ट रूप से मैट्रिक्स मुख्य विकर्ण के चारों ओर सममित है।

int[] Match(int[] people, int[][] pairs, int numBuildings, int buildingsSize) 
{ 
    int[] freePeople = findFreePeople(people); 
    if(freePeople) = 0 
    { 
     return people; 
    } 

    foreach(int person in freePeople) 
    { 
     for(int buildingIndex=0 to numBuildings) 
     { 
      if(CheckIfPersonFitsInBuilding(...)) 
      { 
       int[] tempPeople = people.Copy(); 
       tempPeople[person] = buildingIndex; 
       int[] result = Match(tempPeople,pairs,numBuildings,buildingsSize); 
       if(result != null) 
       { 
        return result; 
       } 
      } 
     } 
    } 
    return null; 
} 

मैं बस हर संभव प्रत्यावर्तन का उपयोग कर व्यवस्था को कवर:

मेरे समाधान के रूप में निम्नानुसार (छद्म कोड) है। मुझे लगता है कि इसे बहुत अनुकूलित किया जा सकता है, और मैं हेरिस्टिक के बारे में बात नहीं कर रहा हूं लेकिन बहुत कम जटिलता वाला समाधान।

  1. क्या कोई औपचारिक अच्छी तरह से ज्ञात समस्या है जो इस तरह है?
  2. क्या कोई बेहतर एल्गोरिदम है?

मुझे लगता है कि यह stable marriage problem से संबंधित हो सकता है, हालांकि मुझे यकीन नहीं है।

+0

मुझे नहीं लगता कि स्थिर विवाह समस्या यहां लागू होती है; यह द्विपक्षीय मिलान समस्या से संबंधित है, और यह समस्या मेल नहीं खाती है। – templatetypedef

+0

@templatetypedef क्या आप कृपया मुझे बता सकते हैं कि नाम के साथ क्या गलत था? यह एक सभ्य "समथिंग समस्या" एक पाठ्यपुस्तक का नाम है ... –

+0

शब्द "समस्या" का प्रयोग अक्सर "सी ++ के साथ समस्या" या "HTML के साथ समस्या" जैसे शीर्षकों में किया जाता है जो वास्तव में समस्या का वर्णन नहीं करता है। मैं आपसे सहमत हूं कि नाम पर प्रतिबंध लगाने के लिए थोड़ा अजीब बात है क्योंकि इससे इस तरह के झूठे सकारात्मक कारण बन सकते हैं। – templatetypedef

उत्तर

25

यह समस्या एनपी कठिन decomposing a graph into cliques (गुट कवर समस्या) के एन पी-सम्पूर्ण समस्या से कमी के होने के लिए जाना जाता है।

पहला, कुछ शब्दावली और चर्चा। एक ग्राफ में clique के विभिन्न नोड्स का एक सेट है जैसे कि प्रत्येक नोड क्लिक्स में एक दूसरे नोड से जुड़ा होता है। ग्राफ़ में independent set के विभिन्न नोड्स का एक सेट है, जैसे कि दो नोड एक दूसरे से जुड़े नहीं हैं। यदि आप कोई ग्राफ़ जी लेते हैं और फिर किनारों को याद करते हैं तो किनारों को पेश करते हैं और पहले से मौजूद सभी किनारों को हटा देते हैं, तो आपको मूल ग्राफ के complement graph मिलते हैं। इसका मतलब है कि प्रारंभिक ग्राफ में एक क्लिक ढूंढने की समस्या पूरक ग्राफ में एक स्वतंत्र सेट खोजने के बराबर है।

कारण यह दिलचस्प है कि जिस समस्या में आप वर्णन कर रहे हैं, आपको उन लोगों का एक ग्राफ दिया जाता है जहां प्रत्येक किनारे इंगित करता है "इन दो लोगों को एक साथ रखा नहीं जा सकता है।" नतीजतन, आप उस समस्या के बारे में सोच सकते हैं जिसका आप वर्णन कर रहे हैं जैसे कि ग्राफ को उप-अनुच्छेदों में तोड़ने का कोई तरीका ढूंढने का प्रयास करने के रूप में, जिनमें से प्रत्येक एक स्वतंत्र सेट है। यदि आप इस ग्राफ के पूरक का निर्माण करते हैं, तो आपको उन सभी लोगों का आलेख मिलता है जो ठीक से एक साथ रखे जा रहे हैं। उस स्थिति में, आप समूह को उन समूहों में विभाजित करना चाहते हैं जो सभी cliques हैं।

यह ज्ञात है कि निम्न समस्या एनपी पूरा हो गया है:

एक ग्राफ और एक नंबर कश्मीर, आप अलग कश्मीर क्लिक्स में ग्राफ में नोड्स तोड़ सकते हैं को देखते हुए?

हम इस समस्या को बहुपद समय में आपकी समस्या से कम कर सकते हैं, यह दर्शाते हुए कि आपकी समस्या एनपी-हार्ड है। निर्माण सरल है - आरंभिक ग्राफ जी और संख्या के दिए गए, पहले जी के पूरक का निर्माण करें।इसका मतलब यह है कि यदि आप पूरक को अलग-अलग सेटों में विभाजित कर सकते हैं, तो मूल ग्राफ जी को के cliques (क्लासिक और स्वतंत्र सेट के बीच द्वंद्व के कारण) में अलग किया जा सकता है। अब, इस नए ग्राफ को ले जाएं और इसे लोगों के एक सेट में परिवर्तित करें, एक प्रति नोड, जहां दो लोगों को एक ही कमरे में एक दूसरे के रूप में नहीं रखा जा सकता है यदि उनके नोड मूल ग्राफ में जुड़े होते हैं। अब, इन लोगों को के घरों में वितरित करने का एक तरीका है अगर जी के पूरक को स्वतंत्र सेट में तोड़ दिया जा सकता है अगर आईएफ जी को क्लिक्स में तोड़ा जा सकता है। नतीजतन, क्लिन कवर की ज्ञात एनपी-पूर्ण समस्या को बहुपद समय में आपकी समस्या में कम किया जा सकता है, इसलिए आपकी समस्या एनपी-हार्ड है। यह सुनिश्चित करने के लिए कि किसी भी स्वतंत्र सेट को घर में फिट किया जा सकता है, बस प्रत्येक कमरे की अधिकतम क्षमता को ग्राफ़ में नोड्स की संख्या निर्धारित करें। यह किसी भी कमरे में किसी भी स्वतंत्र सेट को रखने की अनुमति देता है।

चूंकि आपकी समस्या एनपी-हार्ड है, इसलिए पी = एनपी तक इसका बहुपद-समय समाधान नहीं हो सकता है। नतीजतन, जैसा कि किसी के रूप में सबसे अच्छा जानता है, इसके लिए कोई बहुपद समय एल्गोरिदम नहीं है और आपका बैकट्रैकिंग रिकर्सन बहुत अच्छा इष्टतम समाधान हो सकता है।

आशा है कि इससे मदद मिलती है!

4

इन समस्याओं को हल करने का एक अच्छा तरीका सीमित डोमेन के लिए एक बाधा सॉल्वर का उपयोग करना है।

उदाहरण के लिए, जीएनयू-Prolog का उपयोग कर:

solve(Out):- 
    People = [Jon, Mary, Alice, Smith, Dick, George, Betty, Lucy], 
    fd_domain(People, 0, 3), % people lives in buildings 0 to 3. 
    fd_atmost(4, People, 0), % at most, 4 people may live in building 0 
    fd_atmost(3, People, 1), % at most, 3 people may live in building 1 
    fd_atmost(2, People, 2), % etc. 
    fd_atmost(1, People, 3), 
    Jon #\= Mary,    % Jon hates Mary 
    Alice #\= Smith,   % etc. 
    Betty #\= Lucy, 
    Jon #\= Alice, 
    Dick #\= George, 
    fd_labeling(People),  % iterate until an acceptable combination is found. 
    People = Out. 

:- solve(O), write(O), nl. 

देखने के एक जटिलता बिंदु से, इस एन पी-सम्पूर्ण होना जारी है। लेकिन बाधा सॉल्वर लेबलिंग चरण पर असाइनमेंट के तरीके को फिर से व्यवस्थित कर सकता है ताकि मृत सिरों को जल्दी से एक छोटा सा खोज पेड़ मिल सके।

13

templatetypedef ने a very nice proof दिया क्योंकि समस्या एनपी-हार्ड क्यों है और इसमें कोई ज्ञात नहीं है (ज्ञात) बहुपद समय समाधान है।

हालांकि कई एनपी-हार्ड समस्याओं के साथ, इसका मतलब यह नहीं है कि आप इसे अभ्यास में कुशलता से हल नहीं कर सकते हैं या आप ब्रूट फोर्स समाधान पर सुधार नहीं कर सकते हैं।

विशेष रूप से, आपको constraint satisfaction problems पर देखना चाहिए। वे समस्याओं का एक और सामान्य वर्ग हैं जो सटीक वर्णन करते हैं कि आप क्या हल करने की कोशिश कर रहे हैं: बाधाओं के एक सेट को देखते हुए, सभी बाधाओं को पूरा करने वाले मूल्य क्या हैं?

पुस्तक एआईएमए में a very nice chapter है इस प्रकार की समस्याओं को हल करने के तरीके पर। मेरा सुझाव है कि आप उस पर पढ़ लें क्योंकि वहां बहुत अच्छी जानकारी है और यह बहुत ही सुलभ है क्योंकि पुस्तक को स्नातक स्तर के लिए डिज़ाइन किया गया था।

प्रमुख सवाल कर रहे हैं: मैं तुम्हें बड़े विचारों यहाँ से कुछ दे देंगे

  • कौन सा छात्र अपने प्रत्यावर्तन में अगले सौंपा जाना चाहिए?
  • उस छात्र के लिए भवनों को किस क्रम में माना जाना चाहिए?

    • न्यूनतम शेष मानों (MRV) अनुमानी:: जब जो छात्र अपने प्रत्यावर्तन में अगले एक इमारत को आवंटित करने के लिए चयन करते समय, सबसे कम विकल्पों के साथ छात्र चुनें

    यहाँ इस के लिए दो heuristics हैं बाएं।

  • कम से कम बाधित मूल्य (एलसीवी) अनुमानी:, को देखने के लिए क्या छात्र इमारत है कि शेष छात्रों

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

इसके अलावा, बुनियादी आगे की जांच के साथ बेवकूफ रिकर्सन के बजाय, आपको AC-3 जैसे अधिक उन्नत खोज एल्गोरिदम का उपयोग करना चाहिए जो आगे आगे दिखता है।

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