निम्नानुसार कार्यक्रम एक कम लागत वाली ह्युरिस्टिक है। यह क्या करता है एक बाउंड पर एक क्रमबद्ध सूची के एक छोर से मूल्यों को चुनकर, और दूसरे छोर से दूसरे भाग से मूल्यों को चुनकर छोटे बालों के साथ बड़े मूल्यों को "बाल्टी" के बीच मूल्य वितरित करता है। राउंड-रॉबिन में वितरण करना गारंटी देता है कि प्रति बाल्टी तत्वों की संख्या के नियमों को पूरा किया जाता है। यह एक ह्युरिस्टिक है और एल्गोरिदम नहीं है क्योंकि यह अच्छे समाधान का उत्पादन करता है, लेकिन गारंटी के बिना कि बेहतर लोग मौजूद नहीं हैं।
सिद्धांत रूप में, अगर वहाँ पर्याप्त मूल्यों हैं, और वे समान रूप से या सामान्य रूप से वितरित कर रहे हैं, तो संभावना है कि सिर्फ बेतरतीब ढंग से बाल्टी में मान रखने के लिए बाल्टी एक जैसे साधन का परिणाम देगा रहे हैं।यह मानते हुए कि डेटासेट छोटा है, यह हेरिस्टिक एक अच्छे समाधान की संभावनाओं में सुधार करता है। डेटासेट के आकार और सांख्यिकीय वितरण के बारे में और जानना बेहतर हेरिस्टिक या एल्गोरिदम तैयार करने में मदद करेगा।
from random import randint, seed
from itertools import cycle,chain
def chunks(q, n):
q = list(q)
for i in range(0, len(q), n):
yield q[i:i+n]
def shuffle(q, n):
q = list(q)
m = len(q)//2
left = list(chunks(q[:m],n))
right = list(chunks(reversed(q[m:]),n)) + [[]]
return chain(*(a+b for a,b in zip(left, right)))
def listarray(n):
return [list() for _ in range(n)]
def mean(q):
return sum(q)/len(q)
def report(q):
for x in q:
print mean(x), len(x), x
SIZE = 5
COUNT= 37
#seed(SIZE)
data = [randint(1,1000) for _ in range(COUNT)]
data = sorted(data)
NBUCKETS = (COUNT+SIZE-1) // SIZE
order = shuffle(range(COUNT), NBUCKETS)
posts = cycle(range(NBUCKETS))
buckets = listarray(NBUCKETS)
for o in order:
i = posts.next()
buckets[i].append(data[o])
report(buckets)
print mean(data)
जटिलता सॉर्टिंग चरण की वजह से लॉगरिदमिक है।
439 5 [15, 988, 238, 624, 332]
447 5 [58, 961, 269, 616, 335]
467 5 [60, 894, 276, 613, 495]
442 5 [83, 857, 278, 570, 425]
422 5 [95, 821, 287, 560, 347]
442 4 [133, 802, 294, 542]
440 4 [170, 766, 301, 524]
418 4 [184, 652, 326, 512]
440
ध्यान दें कि बाल्टी के आकार पर आवश्यकता, हावी जिसका अर्थ है कि इसका मतलब है करीब नहीं हो सकता है अगर मूल डेटा में विचरण बड़ी है: ये नमूना परिणाम हैं। आप इस डेटासेट के साथ की कोशिश कर सकते हैं:
data = sorted(data) + [100000]
बाल्टी 100000
युक्त कम से कम एक और 3 डाटुमस मिल जाएगा।
मैं इस उदारवादी सोच के साथ आया कि यह अलग-अलग संप्रदायों के बिलों का एक पैक सौंपने पर बच्चों का एक समूह होगा और उन्हें इस खेल के नियमों के अनुसार साझा करने के लिए कहा जाएगा। यह सांख्यिकीय रूप से उचित है, और ओ (लॉग (एन))।
यह बिन पैकिंग समस्या की तरह थोड़ा सा लगता है। चाहे या नहीं, आपको उम्मीद है कि यह ** इष्टतम ** समाधान प्राप्त करने के लिए कम्प्यूटेशनल रूप से कठिन हो। –