सामूहिक रूप से बिल की समस्या का भुगतान करें


23

एक मेज पर लोग हैं । वें व्यक्ति भुगतान करना पड़ता है डॉलर।i p inipi

कुछ लोगों के पास बिलकुल भुगतान करने के लिए सही बिल नहीं हैं , इसलिए वे निम्नलिखित एल्गोरिथ्म के साथ आते हैं।pi

सबसे पहले, हर कोई अपना कुछ पैसा टेबल पर रखता है। फिर प्रत्येक व्यक्ति उन पैसों को वापस लेता है जो वे ओवरपेड करते हैं।

बिल में संप्रदायों का एक निश्चित सेट होता है (इनपुट का हिस्सा नहीं)।

एक उदाहरण: मान लीजिए कि दो लोग हैं, एलिस और बॉब। ऐलिस $ 5 बकाया है और पाँच $ 1 बिल है। बॉब का $ 2 बकाया है और उसके पास एक $ 5 बिल है। जब एलिस और बॉब ने अपना सारा पैसा टेबल पर रख दिया, तो बॉब ने $ 3 वापस ले लिया और सभी लोग खुश थे।

बेशक, ऐसे समय एक डाल करने के लिए नहीं है कर रहे हैं सब मेज पर उसका पैसा। उदाहरण के लिए, यदि ऐलिस के पास एक हज़ार डॉलर का 1 बिल था, तो यह जरूरी नहीं है कि वह उन सभी को टेबल पर रखे और फिर उनमें से अधिकांश को वापस ले ले।

मैं निम्नलिखित गुणों के साथ एक एल्गोरिथ्म खोजना चाहता हूं:

  1. इनपुट लोगों की संख्या को निर्दिष्ट करता है, प्रत्येक व्यक्ति पर कितना बकाया है और प्रत्येक व्यक्ति के पास कितने मूल्य के बिल हैं।

  2. एल्गोरिथ्म प्रत्येक व्यक्ति को बताता है कि पहले दौर में टेबल पर कौन सा बिल रखा जाए।

  3. एल्गोरिथ्म प्रत्येक व्यक्ति को बताता है कि दूसरे राउंड में टेबल से कौन सा बिल निकालना है।

  4. टेबल पर रखे गए बिलों की संख्या + टेबल से निकाले गए बिलों की संख्या को कम से कम किया जाता है।

यदि कोई संभव समाधान नहीं है, तो एल्गोरिथ्म बस एक त्रुटि लौटाता है।


9
क्या बिल के संप्रदाय अग्रिम रूप से तय किए गए हैं (अमेरिकी संप्रदायों $ 1, $ 2, $ 5, $ 10, $ 20, $ 50, और $ 100), या इनपुट का हिस्सा? दूसरे शब्दों में, एल्गोरिथ्म संभावना है कि Mephistopheles है संभाल करने के लिए है तीन $ 7 बिल, एक $ 13 बिल, और पंद्रह $ 4 बिल ?
जेफ जेले

1
बिल तय हो गए हैं। मुझे लगता है कि इस मामले में मैं उप-राशि को कम नहीं कर सकता और यह साबित कर सकता हूं कि यह एनपी-हार्ड है। मैं इसे संपादित करूंगा।
चाओ जू

1
आपको एकल अनुकूलन के रूप में 4/5 को व्यक्त करने का एक तरीका चाहिए। इन दो स्वतंत्र स्थितियों के लिए अनुकूलन करना संभव नहीं है। मुझे पता है कि आप क्या इरादा रखते हैं, मुझे पहले भी इसी तरह की समस्या थी, लेकिन आपको यह निर्धारित करने की आवश्यकता है कि दोनों स्थितियों के लिए अनुकूलन करने का क्या मतलब है।
eda-qa mort-ora-y

3
मुझे लगता है कि यह एक प्रारंभिक बिंदु के रूप में बेहतर होगा, यह मानने के लिए कि या तो हर कोई बिल का भुगतान करता है या एल्गोरिथ्म बस विफलता की रिपोर्ट करता है।
जेफ

2
वास्तव में यहाँ क्या सवाल है, क्या जटिलता की आवश्यकताएं हैं? एक भोली एल्गोरिथ्म लिखना तुच्छ लगता है, या क्या मुझे कुछ याद आ रहा है?
स्टेफेन जिमेनेज

जवाबों:


6

यदि आप समस्या को थोड़ा अलग (लेकिन समतुल्य) तरीके से नियंत्रित करते हैं, तो एक एल्गोरिथ्म अधिक स्पष्ट हो जाता है:

इसमें पार्टियां शामिल हैं: n - 1 व्यक्ति और एक टॉयलेट। चलो पी मैं पैसा पार्टी की राशि हो मैं होना चाहिए के बाद भोजन समाप्त और के लिए भुगतान किया जाता है। उदाहरण के लिए, यदि एलिस के पास $ 36 और $ 25 का बकाया है , तो बॉब के पास $ 12 और $ 11 का बकाया है , और कार्ल के पास $ 30 और 25 डॉलर का बकाया है , हम कहते हैं कि पी 0 रेस्तरां है और है:nn1piip0

p=(61,11,1,5)

यही है, जब भोजन खत्म हो जाता है तो रेस्तरां में $ 61 होना चाहिए, ऐलिस के पास $ 11 होना चाहिए, बॉब के पास $ 1 होना चाहिए और कार्ल के पास $ 5 होना चाहिए ।

bm

b=(1,5,10,20,1,1,5,5,10,20)

बिलों के मूल्य में कोई फर्क नहीं पड़ता है, लेकिन मैंने इस उदाहरण के लिए कागज की अमेरिकी मुद्रा के मूल्यवर्ग को चुना है क्योंकि वे परिचित हैं।

ij{0,1}CC0,j=0j

हमारा उदाहरण जारी है:

C=[0000000000000011111111110000111111111100]

इंगित करता है कि ऐलिस $ 1, $ 5, $ 10, $ 20 के साथ शुरू हुआ, बॉब ने $ 1, $ 1, $ 5, $ 5 से शुरू किया, और कार्ल ने $ 10 और $ 20 से शुरू किया ।

फिर से, लक्ष्य उन बिलों की संख्या को कम करना है जो हाथों को बदलते हैं। दूसरे शब्दों में:

Minimize:i=0n1j=0m1Ci,jxi,jsubject to:i=0n1xi,j=1 for 0j<m,j=0m1xi,jbj=pi for 0i<n,andxi,j0

पहला बाधा कहता है कि समाधान केवल एक पार्टी को एक विशेष बिल सौंप सकता है, और दूसरा यह सुनिश्चित करता है कि हर कोई उचित राशि का भुगतान करता है।

यह 0,1 पूर्णांक समस्या है और NP- पूर्ण है (देखें [ 1972 1972 ])। रैखिक प्रोग्रामिंग के बारे में विकिपीडिया पृष्ठ में विभिन्न एल्गोरिदम के बारे में जानकारी है जो इस प्रकार की समस्याओं के लिए उपयोग किया जा सकता है।

संभावित रूप से कई इष्टतम समाधान हैं; उदाहरण के लिए पहला समाधान हाथ से लेकर मैं आया था:

x=[0101100111101000000000001000000000001000]

जिसका अर्थ है कि एलिस $ 5 और $ 20 का भुगतान करता है, बॉब बिलकुल $ 1, $ 5 और $ 5 का भुगतान करता है , और कार्ल $ 10 और $ 20 से आगे निकल जाता है और फिर टेबल से $ 5 निकाल देता है ।

मैंने ऋषि मठ प्रणाली के मिश्रित पूर्णांक रैखिक कार्यक्रम मॉड्यूल का भी उपयोग किया, जिसमें विभिन्न सॉल्वर बैकेंड ( GLPK , COIN , CPLEX , या Gurobi ) का उपयोग करने की क्षमता है । इसका पहला हल जो था

x=[0101010111101000000000001000000000000100]

जो लगभग वैसा ही है सिवाय इसके कि कार्ल ने "अन्य" $ 5 लिया जो बॉब ने टेबल पर रखा।

Cx

उन लोगों के सबसेट को पहचानें जो कम किए गए कुल का भुगतान कर सकते हैं? या शायद लोगों का एक सबसेट जो अभी भी पूरे बिल का भुगतान कर सकता है, यानी वे अपने दोस्त के लिए भुगतान करते हैं।

आपका अंतिम विवरण यह बताता है कि आप इस मामले में रुचि रखते हैं कि बिल के मूल्यवर्ग तय किए गए हैं, लेकिन यह समस्या को नहीं बदलता है।

O(1)


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

0,1 चर की तुलना में किसी विशेष संप्रदाय के बिलों की संख्या के लिए एक चर होने से, इस आईपी का एक और अधिक संक्षिप्त रूप मौजूद है। निश्चित संप्रदाय थोड़ी सी जटिलता को बदल देते हैं, अगर लोगों की संख्या भी तय हो जाती है, तो लेनस्ट्रा का एल्गोरिदम इसे बहुपद समय में हल कर सकता है।
चाओ जू जू

-2

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

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