2013-04-16 4 views
8

मान लें कि आपके पास सेट का एक समूह है, जबकि प्रत्येक सेट में कुछ सबसेट हैं।संघर्ष-मुक्त सेट निर्धारित करें?

SET1 = {(केला, अनानास, नारंगी), (सेब, गोभी, खीरा), (प्याज, लहसुन)}

SET2 = {(केला, ककड़ी, लहसुन), (एवोकैडो, टमाटर)}

...

SetN = {...}

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

एक संघर्ष होगा, यदि कोई सेट 1 और सेट 2 का पहला सबसेट चुनता है क्योंकि केले दोनों सबसेट्स में निहित होगा (जो संभव नहीं है क्योंकि यह केवल एक बार मौजूद है)।

हालांकि कई एल्गोरिदम हैं, मैं एक उपयुक्त एल्गोरिदम चुनने में असमर्थ था। मैं किसी भी तरह से अटक गया हूं और निम्नलिखित प्रश्नों को लक्षित करने वाले उत्तरों की सराहना करता हूं:

1) उपयुक्त एल्गोरिदम कैसे ढूंढें और इस समस्या का प्रतिनिधित्व इस तरह से करें कि इसे एल्गोरिदम द्वारा संसाधित किया जा सके?

2) इस खिलौना के आकार के उदाहरण के लिए एक संभावित समाधान कैसा दिख सकता है (कोई भी भाषा ठीक है, मैं सिर्फ विचार प्राप्त करना चाहता हूं)।

संपादित 1: मैं नकली एनीलिंग के बारे में भी सोच रहा था, (एक संभावित समाधान लौटाएं)। यह कम करने के लिए ब्याज का हो सकता है, उदाहरण के लिए, सेट का चयन करने की समग्र लागत। हालांकि, मैं यह समझ नहीं पाया कि उचित समस्या का वर्णन कैसे किया जाए जो 'संघर्ष' को ध्यान में रखे।

+0

मैं काफी यकीन है कि कैसे दूसरे जवाब (1) को संबोधित करने में विफल रहता है नहीं कर रहा हूँ। यह स्ट्रिंग्स के सेट के रूप में इनपुट का प्रतिनिधित्व करता है। लेखक ने उल्लेख किया कि यह अक्षम था क्योंकि स्ट्रिंग तुलना धीमी है। प्रति संग्रह 30 सेट के साथ 100 संग्रहों के बारे में अपने प्रश्न का उत्तर देने के लिए ... मुझे नहीं लगता कि बैकट्रैकिंग एल्गोरिदम (प्रस्तुत किए गए दोनों समाधान वही हैं जो मैं बता सकता हूं) पर्याप्त तेज़ी से दौड़ेंगे। उस आकार के इनपुट पर आप मशीन लर्निंग एल्गोरिदम – rliu

+0

पर विचार कर सकते हैं दो सुझावों के आधार पर मैं अब एल्गोरिदम एक्स और प्राथमिक/माध्यमिक कॉलम का उपयोग करके इसे लागू करने में सक्षम था। उस पर आधारित, और इस तथ्य को देखते हुए कि यह सबसे ज्यादा वोट दिया गया जवाब है, मैंने इस समाधान को स्वीकार कर लिया है। हास्केल में समाधान सही है लेकिन मेरे लिए आसानी से सुलभ नहीं है। – user26372

उत्तर

8

यह समस्या generalized exact cover problem के रूप में तैयार की जा सकती है।

सेट (SET1, SET2, आदि) के प्रत्येक सेट के लिए एक नया परमाणु बनाएं और इतने की तरह एक उदाहरण में अपने इनपुट बारी: Set* परमाणुओं प्राथमिक (ठीक एक बार कवर) और बनाने

{Set1, banana, pineapple, orange} 
{Set1, apple, kale, cucumber} 
{Set1, onion, garlic} 
{Set2, banana, cucumber, garlic} 
{Set2, avocado, tomato} 
... 

अन्य परमाणु माध्यमिक (सबसे अधिक बार कवर)। फिर आप इसे Knuth के एल्गोरिदम एक्स के सामान्यीकरण के साथ हल कर सकते हैं।

+0

यह पूछने जा रहा था कि आप इसे कैसे सामान्यीकृत करते हैं, लेकिन यह बताता है: https://en.wikipedia.org/wiki/Exact_cover#Generalizations – Patashu

+0

बढ़िया, मैंने अपने सेट "फ़्लैटिंग" के बारे में नहीं सोचा था। एल्गोरिदम एक्स वास्तव में सही विकल्प प्रतीत होता है। क्या कोई एल्गोरिदमिक विवरण उपलब्ध है जो इन प्राथमिक और माध्यमिक परमाणुओं को ध्यान में रखता है? – user26372

+0

@ user26372 एक बार जब आप प्राथमिक बाधाओं के साथ [एल्गोरिदम एक्स] (http://en.wikipedia.org/wiki/Knuth's_Algorithm_X) समझते हैं, तो मुझे लगता है कि यह पढ़ने के लिए चरण 1 को संशोधित करने जितना सरल है "अगर ए खाली है में केवल द्वितीयक पंक्तियां हैं, समाप्त करें "और" चरणबद्ध रूप से प्राथमिक पंक्ति चुनें "पढ़ने के लिए चरण 2 को संशोधित करना, क्योंकि आपके उदाहरणों में केवल माध्यमिक परमाणुओं के साथ कोई सेट नहीं है। –

4

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

कैसे कोड काम करता है (एल्गोरिथ्म) की मेरी समझ:

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

import Data.List (intersect) 
import Control.Monad (guard) 

sets = [[["banana", "pineapple", "orange"], ["apple", "kale", "cucumber"], ["onion", "garlic"]] 
     ,[["banana", "cucumber", "garlic"], ["avocado", "tomato"]]] 

solve sets = solve' sets [] where 
    solve' []   result = [result] 
    solve' (set:rest) result = do 
    subset <- set 
    guard (all null (map (intersect subset) result)) 
    solve' rest (result ++ [subset]) 

उत्पादन:

*Main> solve sets 
[[["banana","pineapple","orange"],["avocado","tomato"]] 
,[["apple","kale","cucumber"],["avocado","tomato"]] 
,[["onion","garlic"],["avocado","tomato"]]] 
+0

मैं यह कहने जा रहा था कि यह एल्गोरिदम सुंदर होने के बावजूद बहुत कुशल प्रतीत नहीं होता है। उपरोक्त डेविड एइसेनस्टैट का लिंक मुझे यह सोचता है कि कोई ज्ञात समाधान नहीं है जो बहुत तेज़ है। शायद यही कारण है कि बैकट्रैकिंग एन-रानी की समस्या के लिए सबसे लोकप्रिय समाधान है (जो स्पष्ट रूप से "सामान्यीकृत सटीक कवर समस्या" है)। – rliu

+0

@roliu हाँ, आप जो कहते हैं वह सच हो सकता है। क्या आप मेरी मदद कर सकते हैं/हम समझते हैं कि बैकट्रैकिंग समाधान इस से अधिक कुशल कैसे है? –

+0

मुझे दृष्टिकोण और विचार पसंद है, हालांकि मुझे कोड (अभी तक) समझ में नहीं आया है। मुझे अपेक्षित रनटाइम में भी दिलचस्पी होगी (बनाम एल्गोरिदम एक्स)। लगभग इसे चलाने के लिए संभव हो सकता है। 100 उनमें से प्रत्येक को लगभग सेट करता है। 30 सबसेट्स? – user26372

संबंधित मुद्दे