সম্মিলিতভাবে বিল সমস্যা পরিশোধ করুন


23

আছে n একটি টেবিলে মানুষ। তম ব্যক্তি বেতন হয়েছে ডলার।ipi

কিছু লোকের কাছে ঠিক প্রদান করার সঠিক বিল নেই , তাই তারা নিম্নলিখিত আলগোরিদিম নিয়ে আসে।pi

প্রথমে প্রত্যেকে তাদের কিছু অর্থ টেবিলের উপরে রাখে। তারপরে প্রতিটি ব্যক্তি তাদের অতিরিক্ত অর্থ পরিশোধের টাকা ফেরত নিয়ে যায়।

বিলে একটি নির্দিষ্ট সংজ্ঞা রয়েছে (ইনপুটটির অংশ নয়)।

উদাহরণস্বরূপ: ধরুন, অ্যালিস এবং বব দুজন লোক রয়েছেন। এলিসের পাওনা $ 5 এবং তার পাঁচটি $ 1 বিল রয়েছে। বব $ 2 পাওস এবং একটি $ 5 বিল। অ্যালিস এবং বব তাদের সমস্ত অর্থ টেবিলের উপরে রাখার পরে, বব $ 3 ফিরিয়ে নেয় এবং প্রত্যেকে খুশি হয়।

অবশ্যই, এমন সময় আছে যখন কাউকে তার সমস্ত অর্থ টেবিলে রাখতে হয় না। উদাহরণস্বরূপ, অ্যালিসের যদি এক হাজার $ 1 টি বিল থাকে, তবে তার পক্ষে সেগুলি সমস্ত টেবিলে রাখা এবং তারপরে সেগুলি বেশিরভাগই ফিরিয়ে নেওয়া দরকার নয়।

আমি নিম্নলিখিত বৈশিষ্ট্য সহ একটি অ্যালগরিদম পেতে চাই:

  1. ইনপুটটি মানুষের সংখ্যা নির্দিষ্ট করে দেয়, প্রতিটি ব্যক্তির কত .ণী রয়েছে এবং প্রতিটি ব্যক্তির কত সংখ্যক বিল রয়েছে।

  2. অ্যালগরিদম প্রতিটি ব্যক্তিকে বলে যে কোন রাউলে প্রথম রাউন্ডে টেবিলটি রাখা উচিত।

  3. অ্যালগরিদম প্রতিটি ব্যক্তিকে বলে যেটি দ্বিতীয় রাউন্ডে টেবিল থেকে সরিয়ে ফেলতে বিল দেয়।

  4. টেবিলের উপরে বিলের সংখ্যা + টেবিল থেকে সরানো বিলের সংখ্যা হ্রাস করা হয়।

যদি কোনও কার্যকর সমাধান না হয়, তবে অ্যালগরিদম কেবল একটি ত্রুটি ফেরায়।


9
কি বিলের সংজ্ঞাগুলি আগে থেকেই ঠিক করা হয়েছে (আমেরিকান সংজ্ঞাগুলি বলুন $ 1, $ 2, $ 5, $ 10, $ 20, $ 50, এবং $ 100) বা ইনপুটটির অংশ? অন্য কথায়, অ্যালগরিদমের কি ম্যাপিস্টোফিলিসের তিনটি $ 7 বিল, একটি 13 ডলার বিল এবং পনেরো $ 4 বিল রয়েছে এমন সম্ভাবনাটি পরিচালনা করতে হবে ?
জেফই

1
বিল ঠিক আছে। আমি অনুমান করি সেক্ষেত্রে আমি সাবসেটের পরিমাণ হ্রাস করতে এবং এটি এনপি-হার্ড প্রমাণ করতে পারি না। আমি এটি সম্পাদনা করব।
চাও Xu

1
আপনার একক অপ্টিমাইজেশন হিসাবে 4/5 প্রকাশ করার উপায় প্রয়োজন। এই দুটি স্বতন্ত্র অবস্থার জন্য অনুকূল করা সম্ভব নয়। আপনার উদ্দেশ্য কী তা সম্পর্কে আমি জানি, এর আগে আমারও একই রকম সমস্যা ছিল, তবে উভয় শর্তের জন্য অপ্টিমাইজ করার অর্থ কী তা আপনাকে সঠিকভাবে প্রমাণ করতে হবে।
এডিএ-কিএ মার্ট-ওরা-ই

3
আমি মনে করি, এটি একটি সূচনা পয়েন্ট হিসাবে ধরে নেওয়া ভাল হবে যে ধরে নেওয়া উচিত যে প্রত্যেকেই বিলটি একেবারে প্রদান করে বা অ্যালগরিদম কেবল ব্যর্থতার কথা বলে।
জেফই

2
এখানে প্রশ্নটি ঠিক কী, জটিলতার প্রয়োজনীয়তা রয়েছে? একটি নিষ্পাপ অ্যালগরিদম লিখতে তুচ্ছ মনে হয়, বা আমি কিছু অনুপস্থিত?
স্টাফেন গিমেনিজ

উত্তর:


6

আপনি যদি সমস্যাটি কিছুটা ভিন্ন (তবে সমতুল্য) উপায়ে পুনরুদ্ধার করেন তবে একটি অ্যালগরিদম আরও সুস্পষ্ট হয়ে ওঠে:

এর মধ্যে পার্টি রয়েছে: এন - 1 জন ব্যক্তি এবং একটি পুনরুদ্ধারকারী au যাক পি আমি টাকা পার্টির পরিমাণ আমি থাকা উচিত পর খাবার শেষ করে জন্য অর্থ প্রদান করা হয়। উদাহরণস্বরূপ, যদি অ্যালিসের $ 36 এবং $ 25 owণী থাকে তবে ববের 12 ডলার এবং owণী আছেnn1pii $ 11, এবং কার্ল হয়েছে $ 30 এবং ঋণী $ 25, আমরা বলতে যে রেস্তোরাঁ এবং আছে:p0

p=(61,11,1,5)

অর্থাত্, যখন রেস্তোঁরাটি খাবারের শেষে হয় $ 61, অ্যালিসের 11 ডলার , ববের 1 ডলার এবং কার্লের 5 ডলার হওয়া উচিত ।

এখন যাক জড়িতসমস্ত মি বিলেগণনা। উদাহরণ স্বরূপ:bm

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

বিলের সংজ্ঞাগুলি কিছু বিবেচনা করে না, তবে আমি এই উদাহরণের জন্য কাগজের মার্কিন মুদ্রার সংজ্ঞা বেছে নিয়েছি কারণ তারা পরিচিত।

আমরা যে হাত পরিবর্তন বিল সংখ্যা কমানোর জন্য তাই আমরা ব্যক্তির সাথে শরীক একটি "খরচ" চাইছেন বিলের যাব একটি ব্যবহার করে { 0 , 1 } ম্যাট্রিক্স সি । এই ম্যাট্রিক্সে 0 এর এন্ট্রিগুলি নির্দেশ করে যা প্রতিটি পক্ষের সাথে बिलগুলি শুরু হয় ( সি 0 ,ij{0,1}Cসমস্তজে জন্যকারণ রেস্তোঁরা কোনও বিল ছাড়াই শুরু হয়)।C0,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 ইন্টিগ্রেটার প্রোগ্রামিং সমস্যা এবং এনপি-সম্পূর্ণ (দেখুন [ কার্প 1972 ])। লিনিয়ার প্রোগ্রামিং সম্পর্কিত উইকিপিডিয়া পৃষ্ঠায় বিভিন্ন অ্যালগরিদমের তথ্য রয়েছে যা এই ধরণের সমস্যার জন্য ব্যবহার করা যেতে পারে।

সম্ভাব্য একাধিক অনুকূল সমাধান রয়েছে; হাতে প্রথম যে সমাধানটি আমি নিয়ে এসেছি তা হ'ল:

x=[0101100111101000000000001000000000001000]

যা এলিস বহন করেনা ঠিক মানে $ 5 এবং $ 20, বব ঠিক বহন করেনা $ 1, $ 5 এবং $ 5, এবং কার্ল overpays $ 10 $ 20 এবং তারপর একটি সরিয়ে ফেলা হবে $ টেবিল থেকে 5।

আমি সেজ ম্যাথ সিস্টেমের মিশ্রিত পূর্ণসংখ্যার লিনিয়ার প্রোগ্রাম মডিউলটিও ব্যবহার করেছি যা বিভিন্ন সলভার ব্যাকেন্ডগুলি ( GLPK , COIN , CPLEX , বা গুরুবি ) ব্যবহার করার ক্ষমতা রাখে । এটি প্রথম সমাধানটি দিয়েছিল

x=[0101010111101000000000001000000000000100]

which is almost the same except that Carl took the "other" $5 that Bob put on the table.

Formulating the problem in this way satisfies all the properties you list (you can extrapolate which bills end up where from C and the solution matrix x). The exception is perhaps #4 which was discussed in the comments of the question. It is not clear to me what you would like to do in the situation that there is no feasible solution to the set of linear equations:

Identify a subset of people that can pay the reduced total? Or perhaps a subset of people which could still pay the entire bill, i.e. they pay for their friend.

Your final statement makes it seem like you are interested in the case that the denominations of the bills are fixed, this doesn't change the problem however.

In any case, there is also an O(1) solution in which every person pays with a credit card.


That this problem can be expressed as IP was (almost?) clear; but how good is this solution? Can IPs of the created form be solved efficiently? If not, is there a faster algorithm?
Raphael

There exist a more condensed form of this IP, by having a variable for number of bills of a particular denomination than a 0,1 variable. Fixed denominations do change the complexity by a little, if the number of people are fixed as well, Lenstra's algorithm can solve it in polynomial time.
Chao Xu

-2

Certainly some basic starts could be to include the smallest bills available to reach the total amount of the overall bill. If you don't care to allow $2 bills, each person could simply remove the largest bill they can take from the pool then and would get there relatively quickly. The $2 bill throws that off as it doesn't sub-divide nicely in to the other denominations and greatly complicates the problem. There are also certainly a number of other optimizations that could be done to make observations about the need for further funds to be added during round 1 (for example, if the total number of $1 bills is ever sufficient to cover the bill, then everyone can stop putting in unless they have not yet put in enough for their bill).

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.