अवलोकन
जेफ शटॉक का जवाब सही है कि यह एक दहनशील अनुकूलन समस्या के समतुल्य (या आइसोमॉर्फिक है, जैसा कि गणितज्ञ लिखते हैं), लेकिन यह 1-आयामी बिन पैकिंग समस्या के बराबर है , न कि नैकपैक समस्या ।
आपके लिए भाग्यशाली, मेरे पास साझा करने के लिए कुछ कोड हैं जो आपके लिए, या किसी और के लिए इस समस्या को हल करेंगे, स्थापित .NET फ्रेमवर्क के कम से कम संस्करण 3.5 के साथ विंडोज कंप्यूटर तक पहुंच।
किसी न किसी समाधान
सबसे पहले LINQPad को डाउनलोड और इंस्टॉल करें ।
दूसरा, लिनक्यूपैड क्वेरी डाउनलोड करें जिसे मैंने लिखा था - यहां कच्ची फ़ाइल में लाइनक (हा) है। इसे एक .linq फ़ाइल के रूप में सहेजें और LINQPad में खोलें।
पैरामीटर बदलें:
यहाँ LINQPad क्वेरी कोड में वह हिस्सा है जिसे आपको बदलना चाहिए:
int binSizeMb = 4476; // This is the (floor of the) total size of a DVD+R reported by CDBurnerXP.
string rootFileFolderPath = @"F:\2006 - Polyester Pimpstrap Intergalactic Extravaganza multicam";
binSizeMb
अपने 'बिन' के आकार में परिवर्तन करें, जैसे सीडी, डीवीडी, पूर्व। int binSizeMb = 650;
एक सीडी के लिए।
नोट - binSizeMb
मान की व्याख्या की जाती है, जिसे कभी-कभी मेइबाइट के रूप में जाना जाता है । मेरे बचपन के विपरीत, जब सभी बाइट गुणक 'बाइनरी' थे, तो कभी-कभी 'एमबी' अब एक 'दशमलव मेगाबाइट' या बिल्कुल 1,000,000 बाइट्स का उल्लेख करता है, जैसा कि एक मेबिबाइट (MiB) के 1,048,576 बाइट्स के विपरीत है, जो मेरे कोड में उपयोग किया जाता है । यदि आप इसे बदलना चाहते हैं, const int bytesPerMb = 1048576;
तो कोड को लाइन में बदल दें const int bytesPerMb = 1000000;
।
rootFileFolderPath
फ़ोल्डर की पूर्ण पथ को बदलें जिसमें आप 'डिब्बे में पैक' करना चाहते हैं, उदा। string rootFileFolderPath = @"C:\MySecretBinFilesFolder";
।
क्वेरी को या तो दबाकर F5या क्वेरी टैब के शीर्ष पर स्थित निष्पादित बटन पर क्लिक करके चलाएँ ।
परिणाम
क्वेरी कोड rootFileFolderPath
फ़ोल्डर में सभी फ़ाइलों की पुनरावृत्ति करेगा, पुनरावर्ती रूप से, इसका अर्थ है कि सभी सबफ़ोल्डर्स में भी फ़ाइलें शामिल होंगी।
फिर यह फाइलों के लिए 'डिब्बे' बनाएगा, ताकि प्रत्येक बिन में सभी फाइलों का कुल आकार निर्दिष्ट बिन आकार से कम या बराबर हो।
LINQPad परिणाम फलक में आपको दो सूचियाँ दिखाई देंगी।
पहली सूची उन सभी फाइलों की है जिन्हें आकार में घटते क्रम में सूचीबद्ध किया गया है।
दूसरी सूची 'फाइलों की पैकिंग' द्वारा बनाई गई डिब्बे है, फाइलों और उनके आकारों की सूची के साथ-साथ बिन के शेष आकार के साथ।
यहां एक स्क्रीनशॉट है जिसमें दूसरी सूची और पहले दो डिब्बे बनाए गए हैं:
Cursory विश्लेषण
विकीपीडिया के अनुसार, मैंने जो एल्गोरिथ्म का उपयोग किया है - फर्स्ट फिट डिसचार्जिंग (एफएफडी) रणनीति - बहुत बुरा नहीं होना चाहिए; विकिपीडिया राज्यों:
2007 में, यह साबित हुआ कि एफएफडी के लिए बाध्य 11/9 ऑप्ट + 6/9 तंग है।
'ऑप्ट' का तात्पर्य इष्टतम रणनीति से है (जैसा कि संभावित रूप से अगम्य है, किसी विशेष वास्तविक रणनीति से नहीं)।
इसमें शामिल गणितीय शब्दों की मेरी कुछ अस्पष्ट यादों के आधार पर, इसका मतलब यह होना चाहिए कि एफएफडी रणनीति को कम से कम, आइटम को ~ 1.22 गुना की संख्या में पैक करना चाहिए जो कि एक इष्टतम रणनीति होगी। इसलिए, यह रणनीति 4. के बजाय 5 बिन्स में आइटम पैक कर सकती है। मुझे संदेह है कि यह प्रदर्शन विशिष्ट 'पैथोलॉजिकल' आइटम आकारों को छोड़कर इष्टतम के बहुत करीब होने की संभावना है।
वही विकिपीडिया लेख यह भी बताता है कि एक "सटीक एल्गोरिदम" है । मैं इसे भी लागू करने का निर्णय ले सकता हूं। मुझे उस पेपर को पढ़ना होगा जो पहले एल्गोरिथम का वर्णन करता है।