पता लगाएं कि किसकी बारी है क्रोइसैन खरीदना


9

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

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

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

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

उत्पत्ति: पता लगाएं कि फ्लोरियन मार्गाइन द्वारा क्रोइसैन खरीदने के लिए कौन जा रहा है । यहां मेरे सुधार की कुछ अलग आवश्यकताएं हैं।


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

@ PålGD यह मानते हुए कि लोग एक ही राशि के बारे में अनुपस्थित हैं एक सरलीकरण होगा। यदि आप चाहते हैं, तो ऐसा करें, लेकिन यदि आपका एल्गोरिथ्म पार्ट-टाइमर के लिए काम करता है, तो यह बेहतर है। जिस व्यक्ति ने इसे कम से कम कई बार किया है, वह एक समाधान है (हालांकि आवश्यकता को ध्यान में रखते हुए कि वे एक दिन पहले जानते हैं, यह समाधान को पूरी तरह से तुच्छ नहीं बनाता है)। एक यादृच्छिक व्यक्ति भी काम कर सकता है, लेकिन यादृच्छिकता निष्पक्षता से विचलन का परिचय देती है जिसे आप बाध्य करना चाहते हैं।
गिल्स एसओ- बुराई को रोकना '

क्या? कोई लार लगाने वाली तस्वीर नहीं? आप चाहते हैं कि हम बेकरी पर फिसलने के बजाय गणित करने वाले हमारे डेस्क पर गुलाम हो जाएं ?
कालेब

@ गिल्स - FYI करें, इस प्रश्न के आपके संस्करण के साथ P.SE पर एक प्रयोग चल रहा है । अब जब दोनों साइट थोड़ी पुरानी हो गई हैं, तो मैं यह देखने के लिए उत्सुक हूं कि प्रत्येक समुदाय के उत्तर कैसे आकार लेते हैं।

जवाबों:


7

इस तरह की समस्या के समाधान की दो श्रेणियां हैं जो मुझे पता है: पक्षपाती लॉटरी और फ़िल्टर किए गए / उत्पन्न यादृच्छिक क्रम

सबसे पहले, आइए आसान लेकिन गलत समाधानों से दूर करें जो कोई राज्य नहीं रखते हैं। किसी भी राज्य को बनाए रखने वाले किसी भी लॉटरी-शैली समाधान में द्विपद वितरण में जीत की संख्या होगी, जो "कई बार" मानदंड को विफल करता है। आप एक यादृच्छिक अनुक्रम का चयन कर सकते हैं जो सभी लोगों को समान रूप से चुनता है (बस सूची के चारों ओर जा रहा है कि; क्रमपरिवर्तन यादृच्छिकता प्रदान करते हैं), लेकिन एक बार जब लोग छुट्टी पर जाना शुरू करते हैं तो आपके पास अब छेद हैं। जब तक आप ट्रैक नहीं रखते हैं, आप फिर से समान प्रयास के रखरखाव के बजाय खुद को द्विपद वितरण के साथ पाएंगे।

चलो वास्तविक यादृच्छिकता होने के लिए भी प्रतिबद्ध हैं। आप ऐसा चाहते हो सकता है कि, उदाहरण के लिए, एक व्यक्ति एक नियतात्मक एल्गोरिथ्म के आधार पर अपनी छुट्टी का समय निर्धारित नहीं कर सकता है ताकि वे कभी उपस्थित न हों जब यह क्रोइसैन खरीदने की बारी है (जब तक वे अपने सभी छुट्टी के दिनों का उपयोग नहीं करते हैं, मुझे लगता है) ।

तो, दो प्रकार के समाधानों पर।

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

    case class Employee(var bias: Double) {
      def eat         { bias -= 1 }
      def buy(n: Int) { bias += n }
      def roll        = bias + stdev * Random.nextGaussian
    }
    

    आप अंतिम खरीदे गए लोगों पर नज़र रख सकते हैं और उन्हें एक भारी पूर्वाग्रह बोनस (उदाहरण के लिए 10*stdev) दे सकते हैं ताकि लोगों को किनारे के मामले में एक पंक्ति में दो बार खरीदने से बचाया जा सके, जहां छुट्टी संरचना ने सभी को "अंतिम" समय खरीदने की अनुमति दी थी। (यानी आप खरीदते हैं, तो छुट्टी पर जाते हैं।) जिस दिन वे चुने गए हैं उस दिन उपस्थित नहीं होने के लिए एक ही बात। (कोई हर दूसरे दिन अनुपस्थित है तो वे अंततः होगा आने के रूप में वे अपने पूर्वाग्रह बोनस के माध्यम से जला;। मैं इस बल्कि एक बग से एक सुविधा पर विचार करें)

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

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

    यदि आप एक मानक फेरबदल का उपयोग करते हैं, तो यह विशेष रूप से यादृच्छिकता को निर्धारित करने के लिए आसान है जब कोई छुट्टियां नहीं होती हैं। यदि आपने लोगों को पूरी तरह से यादृच्छिक रूप से चुना है, तो आगे किसको लाना है, इसका ज्ञान होगाlog2(N) जानकारी के बिट अगर वहाँ थे Nकर्मचारियों। इसके बजाय, हालांकि, केवलN! के बजाय NN संभव अनुक्रमों की अनुमति है, इसलिए जानकारी कम हो जाती है log2[(N!NN)1/N]1log(2)+log22π/NN1.4 बिट्स (बड़े के लिए) N; के लियेN=10 आईटी इस  1.14)।

व्यक्तिगत रूप से मैं पक्षपातपूर्ण लॉटरी समाधान का पक्ष लेता हूं क्योंकि यादृच्छिकता पर नियंत्रण बेहतर है। फ़िल्टर्ड अनुक्रमों के साथ, आप दृश्यों को उत्पन्न करने के लिए और अधिक जटिल तरीकों के साथ आ सकते हैं। उदाहरण के लिए, यादृच्छिक क्रमांकन लेने के बजाय, एक निश्चित दूरी तक स्थानीय स्वैप करें, या लोगों को पूल से पूरी तरह से स्वैप करने की अनुमति दें (लेकिन वे स्किप-लिस्ट पर जाते हैं) -लेकिन इन चीजों के लिए अधिक एल्गोरिदमिक प्रयास की आवश्यकता होती है। लॉटरी के साथ, आप बस मानक विचलन को समायोजित करते हैं।


4

चलो {P1,...,Pn}क्रोइसैन के बायर्स का सेट हो। चलोvik1 द्वारा खर्च की गई राशि हो Pi दिन के लिए क्रोइसैन पर k(यदि वह क्रोइसैन को खरीदता है तो कई बार हो सकता है यदि वे हमेशा वही पैसा खर्च करते हैं जो मौजूद लोगों की संख्या है, जो हमारे क्रोइसैन प्रेमी के लिए पर्याप्त चतुर नहीं लगते हैं); 1 विभाजन के लिए और विभाजन से बचने के लिए है 0

कुछ पैरामीटर के लिए l, चलो vk=i=1n(vik)l

दिन में k, वे अगले दिन के क्रोइसैन के खरीदार का चयन करते हैं, जिसके परिणामस्वरूप एक यादृच्छिक चर होता है i संभावना के साथ 1(vik)lvk। यदि चुने हुए व्यक्ति यहां नहीं है (आज या उसके बाद का दिन) वे सिक्के को फिर से उछालते हैं जब तक कि उन्हें एक अनुकूल नहीं मिलता (वह मौजूद है, क्योंकि वे ज्यादातर हर दिन यहां हैं ...)।

और वे खुशी से रहते थे जब तक कि उन्हें यह पता नहीं चल गया P1, वह कायर था, केवल एक ही दिन दो पर, और इसलिए, कभी भी कोई क्रोइसैन नहीं खरीदता है!

कुछ प्रतिबिंब के बाद (और थोड़ा यातना हो सकती है P1 ताकि वह बिना भुगतान किए हुए खाने वाले को वापस कर दे) वे अपने एल्गोरिथ्म को संशोधित करते हैं।

वे क्रोइसैन की औसत कीमत की गणना करते हैं जो वे हर दिन भुगतान करते हैं और इसे कॉल करते हैं v

पहले दिन वे आने वाले दिनों के लिए खरीदारों की योजना की गणना करते हैं। ऐसा करने के लिए वे रैंडम वैरिएबल के साथ पहले की तरह हैं, और अपडेट कर रहे हैंvik कीमत के हिसाब से उन्हें दिन पर भुगतान करना चाहिए था k, यानी जोड़ना vहर बार वे बेकर के पास जाने की योजना बना रहे हैं। क्योंकि वे चतुर हैं और वे बहुत अधिक भुगतान नहीं करना चाहते हैं उन्हें यह भी याद है कि उन्होंने वास्तव में दिन में कितना भुगतान किया थाk ताकि जब वे योजना को अपडेट करेंगे तो किसी को दंडित नहीं किया जाएगा।

वे योजना बनाते हैं, जब तक हर Pi भविष्य में एक तारीख है जहां उसे क्रोइसैन खरीदना चाहिए।

अगर Pi दिन पर क्रोइसैन खरीदने की योजना बनाई गई थी k+1 लेकिन घोषणा करता है कि वह दिन पर नहीं कर सकता k (या अगर उसे गर्म नहीं किया गया है) तो वह किसी ऐसे व्यक्ति को अपनी जगह देता है जिसका अगले दिन कोई दायित्व न हो जैसे Pj और वह अगली बारी लेता है Pj

जिस दिन का पहला Pi भविष्य में क्रोइसैन खरीदने की योजना नहीं है, वे अपनी योजना को लम्बा खींचते हैं (साथ में रैंडम चर के साथ vik जब तक सभी लोग लाइन पर वापस नहीं आ जाते, तब तक उन्होंने वास्तविक राशि और भुगतान की गई राशि) को अपडेट किया।

और जब यह हमेशा के लिए चला जाता है, तो वे खुश रहते हैं, समान रूप से क्रोइसैन की कीमत साझा करते हैं।

परंतु P1खुश नहीं है। दरअसल, वह सोचता है कि चुनाlबहुत छोटा है और इसलिए एक पंक्ति में दो बार भुगतान करने की संभावना बहुत बड़ी है। जो भी ... दूसरों ने उसे चुनने दियाlजितना बड़ा वह चाहता है। क्योंकि वह क्रोधी है लेकिन मूर्ख नहीं है, इसलिए उसने चुनाl=k इस तरह से समय बीतने के बावजूद बड़े भुगतानकर्ताओं और छोटे खिलाड़ियों के बीच का अनुपात बड़ा नहीं देखा जा सकता है l इस पर जोर देते हैं।

फिर भी P1 इतना खुश नहीं है, वह केवल आधे दिन (इसलिए आधे आधे क्रिस्सेंट) है और उतना ही भुगतान करना पड़ता है P2वह यहाँ हर दिन है। अनुचित!

लेकिन क्योंकि वे क्रोधी से थक गए हैं P1, वे दूर में पीछा करते हैं। लेकिन अपने सिर के कोने में वे अभी भी बदलने की सोच रहे हैंvik वे जो भुगतान करते हैं और जो खाते हैं उसके बीच अंतर में (सकारात्मक मूल्यों को प्राप्त करने के लिए सामान्यीकृत) लेकिन वे बहुत आलसी और बहुत अधिक क्रोइसैन से भरे होते हैं।

Ps: खराब अंग्रेजी के लिए खेद है, लेकिन मैं मूल वक्ता नहीं हूं और देर हो चुकी है ... कृपया गलतियों को सुधारने के लिए स्वतंत्र महसूस करें (और कहानी में इतना मसाला मिला सकते हैं ...)


2

आपके पास हर पुनरावृत्ति

  • ऐसे लोगों की सूची जो खरीदने के लिए मौजूद हैं और उपलब्ध हैं
  • पिछले खरीदार

यदि आप सूची में शामिल लोगों और पिछले खरीदार को छोड़कर किसी व्यक्ति को यादृच्छिक रूप से चुनते हैं, तो आप अपने उद्देश्यों को प्राप्त करते हैं:

  1. एल्गोरिथ्म "अधिकतम" यादृच्छिक है क्योंकि हम पिछली पुनरावृत्ति से न्यूनतम जानकारी का उपयोग करते हैं और यादृच्छिक रूप से चुनते हैं।
  2. औसतन लोग (N / (N-1)) क्रोइसैन के लिए हर बार भुगतान करते हैं, जो कि एल्गोरिथ्म को संभव बनाने के लिए एक निष्कर्षण में भाग लेते हैं।
  3. मैं इस अधिकतम को यादृच्छिक बनाने के लिए नो-रिपीट नियम को समाप्त करने का सुझाव दूंगा।

मेरे द्वारा प्रस्तावित अन्य एल्गोरिदम कम यादृच्छिक या कम निष्पक्ष हैं:

  1. "डेक फेरबदल" एल्गोरिदम वास्तव में इस मायने में यादृच्छिक नहीं हैं कि भुगतान करने की संभावना निरंतर नहीं है (पहली पिक में 1 / एन, दूसरी में 1 / (एन -1) ... 1 नथ पिक पर - - अगर किसी को अभी तक नहीं उठाया गया है)। इसके अलावा, यदि आप पहले चुने गए हैं, तो आपके पास अगले एन समय के लिए चुने जाने के लिए बिल्कुल शून्य संभावनाएं हैं। शायद ही कभी उठाया और फिर लगातार आने से सिस्टम आसानी से टूट गया है।

  2. "कॉम्पेंसेन्टिव" एल्गोरिदम जो सक्रिय रूप से हर किसी को बनाने की कोशिश करते हैं, यादृच्छिक संख्याओं के गुणों पर निर्भर होने के बजाय सभी समान क्रोइसैन प्राप्त करते हैं जो यादृच्छिक या निष्पक्ष (या दोनों) विफल होते हैं।


साथ में N लोग और m प्रति दिन औसतन मौजूद कर्मचारी, समय की संख्या में विचलन लगभग होगा N/m। चूंकि समाधान मौजूद हैं जो कभी भी अधिक से अधिक विचलन नहीं करते हैं1, यह "निष्पक्ष" की एक अजीब परिभाषा है (विशेषकर जब से इसे "कई बार" के रूप में निर्दिष्ट किया गया था)।
रेक्स केर

एनखरीद, निश्चित रूप से लोग नहीं।
रेक्स केर

@RexKerr आप कर्मचारियों से अधिक क्रोइसैन क्यों खरीदेंगे?
स्किलिव्ज

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