2011-09-12 13 views
6

एक आवेदन के लिए मैं काम कर रहा हूं मुझे पाइथन see here for more details में लागू पैकिंग एल्गोरिदम की तरह कुछ चाहिए। मूल विचार यह है कि मेरे पास n विभिन्न आकारों की वस्तुएं हैं जिन्हें मुझे n डिब्बे में फिट करने की आवश्यकता है, जहां डिब्बे की संख्या सीमित है और दोनों ऑब्जेक्ट्स और डिब्बे का आकार तय किया गया है। वस्तुओं/डिब्बे या तो दोनों को देखने में रुचि रखते हैं, या तो 1 डी या 2 डी हो सकता है। (मुझे लगता है कि 3 डी ऑब्जेक्ट्स शायद मुझे चाहिए।)पैकिंग एल्गोरिदम के पाइथन कार्यान्वयन

मुझे पता है कि इस समस्या को हल करने के लिए वहां कई प्रकार के एल्गोरिदम हैं, जैसे कि बेस्ट फिट डिक्रेज़िंग और फर्स्ट फ़िट डिक्रीज़िंग, लेकिन मुझे उम्मीद थी कि कार्यान्वयन हो सकता है पायथन में (या PHP/सी ++/जावा, वास्तव में मैं उस picky नहीं हूँ)। कोई विचार?

+0

इस 2 डी में है? किस तरह के आकार? आयताकार तक सीमित? – jterrace

+0

यदि आप इन सवालों का जवाब दे सकते हैं तो यह मदद करेगा - 1. ऑब्जेक्ट की अधिकतम संख्या क्या है? 2. अधिकतम डिब्बे की संख्या क्या है? 3. ऑब्जेक्ट की अधिकतम चौड़ाई/ऊंचाई क्या है? – pravin

+0

मैं आपको अधिकतम ऑब्जेक्ट्स या डिब्बे के लिए सटीक संख्या नहीं दे सकता, लेकिन मुझे लगता है कि अधिकतम 20-30 (प्रत्येक के लिए) होगा। जहां तक ​​चौड़ाई/ऊंचाई जाती है, आपको अभी अधिकतम नहीं दे सकता है। – tchaymore

उत्तर

9

https://bitbucket.org/kent37/python-tutor-samples/src/f657aeba5328/BinPacking.py

""" Partition a list into sublists whose sums don't exceed a maximum 
    using a First Fit Decreasing algorithm. See 
    http://www.ams.org/new-in-math/cover/bins1.html 
    for a simple description of the method. 
""" 


class Bin(object): 
    """ Container for items that keeps a running sum """ 
    def __init__(self): 
     self.items = [] 
     self.sum = 0 

    def append(self, item): 
     self.items.append(item) 
     self.sum += item 

    def __str__(self): 
     """ Printable representation """ 
     return 'Bin(sum=%d, items=%s)' % (self.sum, str(self.items)) 


def pack(values, maxValue): 
    values = sorted(values, reverse=True) 
    bins = [] 

    for item in values: 
     # Try to fit item into a bin 
     for bin in bins: 
      if bin.sum + item <= maxValue: 
       #print 'Adding', item, 'to', bin 
       bin.append(item) 
       break 
     else: 
      # item didn't fit into any bin, start a new bin 
      #print 'Making new bin for', item 
      bin = Bin() 
      bin.append(item) 
      bins.append(bin) 

    return bins 


if __name__ == '__main__': 
    import random 

    def packAndShow(aList, maxValue): 
     """ Pack a list into bins and show the result """ 
     print 'List with sum', sum(aList), 'requires at least', (sum(aList)+maxValue-1)/maxValue, 'bins' 

     bins = pack(aList, maxValue) 

     print 'Solution using', len(bins), 'bins:' 
     for bin in bins: 
      print bin 

     print 


    aList = [10,9,8,7,6,5,4,3,2,1] 
    packAndShow(aList, 11) 

    aList = [ random.randint(1, 11) for i in range(100) ] 
    packAndShow(aList, 11) 
+2

ठीक है, यह 'एलिस्ट = [5, 4, 4, 3, 2, 2]' और 'maxValue = 10' के साथ गलत है। यह परिणाम 3 बक्से के साथ देता है, लेकिन सही जवाब 2 ([4, 4, 2], [5, 3, 2] होना चाहिए)। – aemdy

+1

@ एमेडी कौन कहता है? एफएफडी एल्गोरिदम [5 4], [4 3 2], [2 2] देगा। इष्टतम बिन पैकिंग एनपी-हार्ड और सटीक एल्गोरिदम है जो अधिक जटिल होती है। – krapht

+1

यह अच्छी तरह से काम करता है; मैंने अपनी रैखिक सामग्री को खरीदने के लिए इसे संशोधित करने के लिए संशोधित किया: https://github.com/ninowalker/linear-pack –

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