algorithm - Partition a Set into k Disjoint Subset -


एक सेट S दें, सेट को k में विभाजित करना उपयोक्ता का हिस्सा जैसे कि उनके रकम का अंतर कम है।

कहते हैं, S = {1,2,3,4,5} और k = 2 , इसलिए {{3,4}, {1,2,5}} के बाद से उनके आलेख {7,8} में न्यूनतम अंतर है S = {1,2,3}, k = 2 के लिए यह {{1,2}, {3}} होगा क्योंकि योग में अंतर है 0

समस्या विभाजन समस्या से द अल्गोरिदम डिजाइन मैनुअल के समान है। सिवाय स्टीवन स्कीएना इसे बिना पुनर्व्यवस्था को हल करने के लिए एक विधि की चर्चा करता है।

मैं सिमुलेशन एनीलिंग की कोशिश करने वाला था। तो मैं सोच रहा था, अगर एक बेहतर तरीका था?

अग्रिम धन्यवाद।

एक टुकड़े के लिए छद्म-पॉलीटाइम एल्गोरिदम का उपयोग k = 2 के लिए किया जा सकता है। सबसे अच्छा हम कर सकते हैं राशि (एस) / 2 है एस में एस के लिए नापसंद एल्गोरिदम

  चलाएं: के लिए मैं 0 में योग (एस): यदि arr [i] तब arr [i + s] = सच;   

फिर राशि (एस) / 2 पर देखें, उसके बाद राशि (एस) / 2 +/- 1, आदि

के लिए 'के & gt; = 3' मेरा मानना ​​है कि यह एनपी-पूरा है, जैसे 3-विभाजन समस्या

यह करने के लिए सबसे आसान तरीका है k> = 3 केवल जानवर बल के लिए है, यह एक तरफ़ा है, निश्चित नहीं कि यह सबसे तेज़ या साफ है

  आयात प्रति arr = [1,2,3,4] डीफ़ टी (कश्मीर, जमा, सूचकांक): प्रिंट जमा, k यदि सूचकांक == लेन (arr): यदि (k = = 0): वापसी copy.deepcopy (accum); अन्य: वापसी []; तत्व = आगमन [सूचकांक]; परिणाम = [] सीमा में set_i के लिए (लेन (accum)): यदि k & gt; 0: clone_new = copy.deepcopy (accum); clone_new [set_i] .append ([तत्व]); परिणाम। विस्तार (टी (के -1, क्लोन_न्यू, सूचकांक + 1)); के लिए elem_i श्रेणी में (लेन (जमा [set_i])): clone_new = copy.deepcopy (accum); Clone_new [set_i] [elem_i] .append (element) result.extend (t (k, clone_new, index + 1)); रिटर्न परिणाम प्रिंट टी (3, [[]], 0);   

नकली annealing अच्छा हो सकता है, लेकिन जब किसी विशेष समाधान के 'पड़ोसी' वास्तव में स्पष्ट नहीं हैं, तो एक आनुवंशिक एल्गोरिथ्म इसके लिए बेहतर अनुकूल हो सकता है। आप बेतरतीब ढंग से सबसेट के एक समूह को चुनते हैं और सबसेट के बीच की संख्या को बदलकर 'mutate' शुरू करते हैं।

Comments