पता लगाएँ कि किसकी बारी है, क्रोइसैन खरीदना है, संभव अनुपस्थिति के लिए लेखांकन


13

एक टीम ने फैसला किया है कि हर सुबह किसी को सभी के लिए क्रोइसैन लाना चाहिए। यह हर बार एक ही व्यक्ति नहीं होना चाहिए, इसलिए यह निर्धारित करने के लिए एक प्रणाली होनी चाहिए कि यह किसकी बारी है। इस सवाल का उद्देश्य यह तय करने के लिए एक एल्गोरिथ्म निर्धारित करना है कि किसकी बारी है कि कल क्रोइसैन को लाना होगा।

बाधाओं, मान्यताओं और उद्देश्यों:

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

यह एक वास्तविक विश्व समस्या का एक मॉडल है, इसलिए यदि आप सोचते हैं कि वे परिदृश्य को बेहतर तरीके से देखते हैं, तो आप मान्यताओं को चुनौती देने या उन्हें परिष्कृत करने के लिए स्वतंत्र हैं।


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


2
जोड़ा गया नोटिस, मैं जरूरत पड़ने पर रक्षा करूंगा, लेकिन मैं इसे उतने ही खुले रखना चाहूंगा जितना मैं कर सकता हूं। इस प्रश्न के किसी भी तरह से विशिष्ट होने के बारे में, यह एक प्रयोग है। यह खुला रहेगा। विज्ञान के लिए!
वर्ल्ड इंजीनियर

4
कोड गोल्फ के लिए अधिक अनुकूल?
25:13

3
किसे पड़ी है? किसी भी स्वाभिमानी टीम में क्रोइसैन नहीं होता। अब, डोनट्स , दूसरी ओर, यह एक दिलचस्प सवाल है।
रॉस पैटरसन

3
यह DA फॉर्म 6 के लिए एक सही उपयोग के मामले की तरह लगता है (बिल्ली, यह 1974 के बाद से सेना के लिए काम किया है!)। उपयोग के लिए एआर 220-45 देखें। यह एक एल्गोरिथ्म में अनुवाद करने के लिए अपेक्षाकृत सरल होना चाहिए।
एडम बालसम

2
(@AdamBalsam पर विस्तार करने के लिए फॉर्म armypubs.army.mil/eforms/pdf/A6.PDF और उपयोग apd.army.mil/pdffiles/r220_45.pdf ... और कृपया मेरे पूर्व नियोक्ता को यह सुझाव न दें, वे इसकी पर्याप्त नीतियाँ और प्रक्रियाएँ हैं)

जवाबों:


26

मैं स्कोरिंग एल्गोरिथ्म का उपयोग करता हूं। प्रत्येक व्यक्ति शून्य के स्कोर से शुरू होता है। हर बार जब वे क्रोइसैन ले आते हैं, तो उनके स्कोर में वृद्धि होती है 1. सभी टीम के सदस्यों का स्कोर जो क्रॉइस्सेन्ट नहीं लाते हैं, उन्हें 1 / एन द्वारा घटाया जाता है। इस प्रकार 0 के स्कोर का मतलब है कि टीम के किसी सदस्य ने न तो खरीदा है और न ही उसे खरीदा है।

यादृच्छिकता के बिना, उन लोगों की सूची में से सबसे कम स्कोर वाले व्यक्ति को चुनें जो मौजूद होंगे।

यादृच्छिकता जोड़ने के लिए, सूची को स्कोर से क्रमबद्ध करें और नकारात्मक अंक के साथ सभी टीम के सदस्यों की सूची से यादृच्छिक रूप से चुनें। नकारात्मक अंकों तक सीमित करके, आप यह सुनिश्चित करते हैं कि कई हफ्तों तक कोई भी "भाग्यशाली" नहीं होगा।

इस एल्गोरिथ्म का लाभ यह है कि इसे ऐतिहासिक रिकॉर्ड रखने पर कोई निर्भरता नहीं है और यह आसानी से किसी भी समय नए टीम के सदस्यों को जोड़ने की अनुमति देता है।

यह अनुपस्थित रहने के लिए अनुमति दी जा सकती है कि वे केवल उपस्थित लोगों के स्कोर को घटाकर अपेक्षाकृत सामान्य हो सकते हैं।


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

8
यदि आप किसी और को लाए गए पेस्ट्री खाते हैं, तो आप भी ट्वीक कर सकते हैं। (N-1) यदि आप पेस्ट्री खरीदते हैं। इस तरह अगर कोई भाग्यशाली हो जाता है और केवल 4 के लिए खरीदता है, तो अगले दिन वह व्यक्ति अशुभ हो जाता है और 7 के लिए खरीदता है, उन दो ग्राहकों के साथ समान व्यवहार नहीं किया जाता है। -1 क्योंकि एक पेस्ट्री जो आप अपने लिए खरीदते हैं वह तटस्थ है।
जेम्स

@ नाम, कोई डर नहीं; ओपी अमेरिका में है, और अमेरिका में कोई भी उस छुट्टी के पास कहीं भी नहीं जाता है। :(
क्लेरासेला

@ जेम्स हां, यह एक अच्छा सुधार है।
रोबोट

7

मुझे क्या करना होगा, अगर मुझे इसे चुनना है, तो एक टोपी प्राप्त करें, और कागज के छोटे टुकड़ों पर एक बार सभी के नाम टोपी में डाल दें। फिर हर दिन, मैं किसी का नाम यादृच्छिक रूप से टोपी से खींचता हूँ, और वह व्यक्ति जो अगले दिन क्रोइसैन लाता है। उस पेपर को "ब्रिंगिंग क्रॉसन्ट्स टॉमरोव" के तहत एक बोर्ड पर रखा जाता है। बोर्ड में वर्तमान में जो कागज़ है उसे फेंक दिया जाता है।

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

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

इन अंतिम दो चरणों के कारण, एक ही नाम के लिए एक ही बार में कई बार टोपी में होना संभव है। अगर मैं जो नाम आकर्षित करने वाला हूं, वह वही नाम है जो बोर्ड पर है, तो मैं उस कागज को बॉक्स में ले जाऊंगा, और फिर दोबारा खींचूंगा।

अपनी पसंद की भाषा में एक एल्गोरिथ्म में इस प्रणाली का अनुवाद करना बहुत मुश्किल नहीं होना चाहिए।


हर किसी के लिए टोपी के माध्यम से छंटनी जो बाहर जा रहा है वह एक वास्तविक दर्द की तरह लगता है।
बोबसन

@ बोबसन: प्रश्न विशेष रूप से कहता है कि टीम का आकार अपेक्षाकृत छोटा है। अगर मैं एक बड़े डेटा सेट के साथ काम कर रहा था, तो मैं कुछ अधिक परिष्कृत करूँगा।
मेसन व्हीलर

6

एल्गोरिथ्म, स्लैगोरिथम। एक DB का उपयोग करें।

create table team_members 
(
    id integer auto_increment,
    name varchar(255),
    purchase_count integer,
    last_purchase_date datetime,
    present integer,
    prefers_donuts integer default 0,
    primary key( id)
)

कौन खरीदता है?

select id from team_members where (present = 1) and (prefers_donuts = 0) order by purchase_count, last_purchase_date limit 1;

वे खरीदने के बाद:

update team_members set purchase_count = purchase_count + 1, last_purchase_date = now() where id = ?

और फिर सेट करें:

insert into team_members (name, prefers_donuts) values ('GrandmasterB', 1);

... क्योंकि मैं पुराना स्कूल हूं।

पहली क्वेरी को जोड़कर थोड़ी यादृच्छिकता जोड़ना मुश्किल नहीं होना चाहिए - शायद last_purchase की तिथि के अनुसार क्रमबद्ध करने के बजाय एक यादृच्छिक () जोड़कर।


1
+1। नए किराए के लिए, क्या आप purchase_countसभी के औसत के लिए इनिशियलाइज़ करते हैं ?
Dan Pichelman

6
हम्म, बहुत अच्छा सवाल है। वह शायद काम करेगा। या आप बस नए आदमी को हर सुबह क्रोइसैन ला सकते हैं जब तक वह पकड़ नहीं लेता। वह नया आदमी है।
ग्रैंडमास्टरबी

4

मुझे वास्तव में इस समस्या को वास्तविक दुनिया में कुछ हद तक हल करना है:

remember how many times people have gotten donuts
every day:
  var candidates = everyone
  toss out people who aren't here tomorrow
  toss out people who aren't here today 
  toss out the person who got them today (unless they're the only one left)
  toss out everyone where "times they got donuts"/"times everyone has got donuts"
    is more than 1/number of people (unless that would eliminate everyone)

  pick someone at random from the candidates

क्या होता है जो लोग डोनट्स "बहुत ज्यादा" खरीद लेते हैं (बुरी किस्मत के कारण, काम पर जा रहे हैं जब अन्य छुट्टी पर हैं, आदि) को पूल से बाहर रखा गया है जब तक कि पर्याप्त अधिग्रहण उन्हें "सही" प्रतिशत के तहत वापस लाने के लिए नहीं जाते हैं। खरीद।

हालांकि नए लोगों को काम पर रखने के लिए बेहतर संभाल के लिए इसका विस्तार करना होगा ...

वैसे भी, इस डिज़ाइन ने चर (जो अंदर है, जो बाहर है) और जब अनुसूची को (व्यावहारिक रूप से) अनंत होने की आवश्यकता होती है, को बदलने के लिए वास्तव में अच्छी तरह से काम किया। एक अतिरिक्त बोनस के रूप में, अपने RNG को सीडिंग करके निर्धारक बनाना आसान है।


2

पहले से ही प्रस्तुत किए गए कुछ अन्य उत्तरों जितना अच्छा नहीं है, लेकिन समस्या को देखने का एक और तरीका है:

  1. सभी भाग लेने वाले कर्मचारियों की एक सूची बनाएं
  2. सूची को बहुत बार डुप्लिकेट करें (कहते हैं, 1,000)
  3. सूची में फेरबदल करें

प्रत्येक दोपहर, अगले उपलब्ध क्रोइसैन-लाने वाले का चयन करें। प्रत्येक सुबह, क्रोइसैन-लाने वाला अपना नाम सूची के शीर्ष से पार करता है।

दैनिक प्रसंस्करण कलम और कागज सरल है।

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


अधिक जानकारी (प्रति अनुरोध)।

मनमाने ढंग से लंबी सूची के साथ इस दृष्टिकोण का उपयोग करने से आपको पारदर्शिता का लाभ मिलता है।

इतना ही नहीं आप जानते हैं कि कल कौन लोग क्रिशिएंट लाएंगे, आप जानते हैं कि उन्हें किसके साथ दिन में लाना है, इत्यादि। बेशक आगे समय में आप कम सटीक दिखते हैं आप अनुपस्थिति के कारण होंगे, आदि।

डरपोक देवता जो एक टोपी में कागज के अपने स्लिप का वजन करने के तरीके का पता लगाते हैं, उनके क्रोइसैन-लाने वाले कर्तव्यों से बचने का उतना अवसर नहीं होगा।

गैर-देवता जो दावा करते हैं कि संसाधित धांधली है, आसानी से डेटा की समीक्षा कर सकते हैं, गलत निष्कर्ष के साथ आ सकते हैं, और वैसे भी कराह सकते हैं।


1
समाप्ति ? गिंघिस खान ने इस पद का अनुमोदन किया।
डियर हंटर

1
@DeerHunter मैंने हमेशा एचआर के "लोगों को समाप्त करने" के बारे में बात करने के तरीके को नापसंद किया है। यह फायरिंग दस्तों को ध्यान में रखता है। शायद मुझे इसके बजाय "न्यू हायर्स एंड एलुमनी ..." कहना चाहिए था।
Dan Pichelman

1

गैर यादृच्छिक

एक आदेशित सूची बनाए रखें। यदि कोई व्यक्ति उस दिन अनुपस्थित रहता है जिस दिन वे खरीदने वाले होते हैं, तो उन्हें अगले उपलब्ध व्यक्ति के साथ स्वैप करें। अंततः व्यक्ति उपस्थित होगा और इस प्रकार क्रोइसैन खरीदेगा। इसलिए, सूची की सामग्री समान रहती है, लेकिन अनुपस्थिति के आधार पर व्यक्तियों को स्थानांतरित या नीचे किया जा सकता है।

वर्तमान स्थिति के बाद नए लोग सूची में सम्मिलित हो जाते हैं। पद छोड़ने या समाप्त करने वाले लोगों को सूची से हटा दिया जाता है। वर्तमान स्थिति में हर दिन 1 की वृद्धि होती है, जब यह अंत तक पहुंचता है, तो यह वापस शुरू हो जाएगा।

यह मानता है कि निष्पक्षता को बढ़ावा देने के लिए औसत अनुपस्थिति के समय की सूची में पर्याप्त लोग हैं।

बिना सोचे समझे

हम प्रत्येक दिन यादृच्छिक लोगों का चयन नहीं कर सकते हैं, क्योंकि लघु अवधि के पूर्वाग्रह होंगे, उदाहरण के लिए 10 बार एक सिक्का फ्लिप करें और आप शीर्ष 8 और पूंछ 2 आ सकते हैं, इसलिए अल्पावधि के लिए सिर खराब हो जाएंगे। इसलिए, हमें इसे उचित बनाए रखने के लिए लोगों की बाल्टी बनाने की आवश्यकता है।

बाल्टी का निर्धारण उस समय से होता है, जब लोग अतीत में क्रॉसिएंट खरीदते हैं। तो, इस मामले में, हम लोगों के एक शब्दकोश को स्टोर करेंगे और क्रॉसेंट खरीदेंगे। दिन 1 पर हर कोई बाल्टी शून्य में है। जैसा कि लोग क्रोइसिएंट खरीदते हैं, उन्हें अगले बाल्टी तक सौंपा जाएगा, अर्थात 1, 2, आदि। यादृच्छिक भाग बाल्टी में उपलब्ध लोगों के पूल से उठा रहा है। पहले उपलब्ध बाल्टी सबसे कम खरीदता है। यदि बाल्टी में 10 लोग हैं, तो 1 से 10 तक एक यादृच्छिक संख्या चुनें और जो क्रोइसैन खरीदता है। नए लोगों को सबसे कम वर्तमान बाल्टी सौंपी जाती है, ताकि वे क्रॉसिएंट के अतिरिक्त राउंड खरीद न सकें (हालांकि वे तुरंत पूल में रहेंगे)। यदि कोई सबसे कम बाल्टी में उपलब्ध नहीं है (वे सभी अनुपस्थित हैं), तो आप अगले उच्चतम बाल्टी में जाते हैं। उदाहरण के लिए, आइए s का कहना है कि 10 लोगों की सूची है। दिन 8 पर, 8 लोग बाल्टी 1 में हैं और 2 बाल्टी में हैं। बाल्टी 0 में दो लोग अनुपस्थित हैं। इस स्थिति में, बाल्टी 1 का उपयोग किया जाएगा और एक व्यक्ति बाल्टी 2 में समाप्त हो जाएगा। लेकिन, लोग हमेशा एक दूसरे के भीतर कुछ क्रॉस बाइट्स (बाल्टी) के भीतर रहेंगे, क्योंकि अब बाल्टी 2 में व्यक्ति सबसे अधिक संभावना में नहीं होगा। थोड़ी देर के लिए पूल खरीदें।

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


1
जोड़ा गया यादृच्छिक कार्यान्वयन।
जॉन रेन्नोर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.