মোট সংখ্যা না জেনে শতাংশের জন্য অ্যালগরিদম


17

ধরুন nহটলাইনের জন্য লাইন রয়েছে।

যখনই কোনও গ্রাহক হটলাইনে কল করেন, কলটি কোনও একটি nলাইনে ফরোয়ার্ড করা হয় । এবং আমি প্রতিটি এন লাইনে কল করার শতাংশ নির্ধারণ করতে চাই। ধরুন এখানে দুটি লাইন রয়েছে এবং একটি লাইন 60% এবং অন্যটি 40% নির্ধারিত হয়েছে, মোট কলগুলির সংখ্যা 10 তাই প্রথম লাইনে 6 টি কল আসে এবং দ্বিতীয়টি 4 টি কল পাবে।

আমি প্রতিটি লাইনে কল করার শতাংশ আগে থেকেই জানি তবে সমস্যাটি হ'ল আমি জানি না যে একদিনে কী পরিমাণ কল আসবে।

মোট কলগুলি না জেনে আমি কীভাবে কলগুলির সংখ্যা বিতরণ করতে পারি?


2
লাইন 1 এ 6 কল আসার পরে লাইনে 2 4 কল দিন। এটি হ'ল প্রকৃত মোট গণনা সম্পর্কে চিন্তা করবেন না, "পিরিয়ড" (এই ক্ষেত্রে 10) এর উপর বিতরণ সম্পর্কে যত্ন নিন। স্পষ্টতই আপনি শেষ মান বাদে বিকল্প লাইনের মতো স্টাফ করতে পারেন, সুতরাং কঠোর অপেক্ষা করার দরকার নেই isn't যদি কিছু ধরণের কিউ থাকে তবে সারিতে বর্তমান সারির উপর ভিত্তি করে শতাংশ করুন।
ক্লকওয়ার্ক-মিউজিক

"তারকাচিহ্ন" এবং "ডিআইডি" কী?
জিনাত

@ ক্লকওয়ার্ক-মিউজিক: আমি এখানে 6-6 বিতরণ বজায় না রেখে পূর্ণসংখ্যার উপর গোল করার পরামর্শ দেব। অন্যথায় আপনার বিতরণ বন্ধ হয়ে যাচ্ছে যদি না আপনি না জানেন যে আপনার কাছে 10 টি কল রয়েছে। উদাহরণস্বরূপ, যদি 6 টি মোট কল আসে, আপনার প্রস্তাবিত পদ্ধতির মাধ্যমে সেগুলি সমস্ত লাইনের এ লাইনে অর্পণ করা হবে; যদিও আরও সঠিক পন্থা 4 থেকে A এবং 2 থেকে বি হবে (যদি আপনি প্রতিটি লাইনের জন্য পূর্ণসংখ্যার সার্বিক পরিমাণ নির্ধারণ করেন তবে ABAABA অনুসারে অর্পণ করা হবে)
ফ্ল্যাটার

উত্তর:


26

ইতিমধ্যে নেওয়া কলগুলি সম্পর্কে কিছু বুককিপিং করুন এবং এন লাইনে তাদের বিতরণ গণনা করুন। এটি আপনাকে n শতাংশের মান দেয় (আপনার ইতিমধ্যে অর্জিত বিতরণ), যা আপনি অর্জন করতে চান এমন n শতাংশের সাথে তুলনা করা যেতে পারে। যখনই কোনও নতুন কল আসে, লক্ষ্য মান থেকে সর্বাধিক বিচ্যুতি নিয়ে লাইনে সেই কলটি বরাদ্দ করুন (নোট করুন যে যতক্ষণ আপনি প্রদত্ত বিতরণটিকে ঠিক আঘাত করবেন না, সেখানে একটি লাইনে সর্বদা খুব কম কল রয়েছে, যখন লক্ষ্য বিতরণের সাথে তুলনা করা হয়)।

উদাহরণস্বরূপ: প্রথম কলটি 1 নং লাইনে অর্পণ করার পরে:

 total calls line1      total calls line2    perc.line 1    perc. line 2
 1                      0                    100%             0% 
                                             *above 60%      *below 40% <- next call to 2
 1                      1                    50%             50% 
                                             * below 60%:    *above40% next to line1
 2                      1                    66%             33%
                                             *above 60%      *below 40% <- next to line 2
 2                      2                    50%             50% 
                                             * below 60%:    *above40% next to line1
 3                      2                    60%             40% 
                                             * both hit the mark: next call arbitrary
 4                      2                    66%             33%
                                             *above 60%      *below 40% <- next to line 2
 4                      3                    57.1%             42.85%
                                             *below 60%      *above 40% <- next to line 1

...

সম্পাদনা: এই পদ্ধতির পরম পার্থক্যটি না ব্যবহার করে আরও উন্নত করা যেতে পারে তবে লাইনটি বেছে নিয়ে যা সমস্ত বিচ্যুতির সমষ্টিগুলির সমষ্টিকে হ্রাস করে। আপনি লক্ষ্য মানগুলিতে ঠিক পৌঁছে যাওয়ার ক্ষেত্রে এটি আপনাকে আরও ভাল ফলাফল দেয় give


2
আপনি এটিকে "যতক্ষণ" আরও স্পষ্টত "আলাদা টাইব্রেকার ব্যবহার করুন" রেফারেন্স, এফডাব্লুআইডাব্লুতে পরিবর্তন করতে চাইতে পারেন।
ডগএম

@ ডগএম: আমার সম্পাদনা দেখুন।
ডক ব্রাউন

5
  • ধরা যাক শ্রমিকের সংখ্যা 100 এরও কম
  • 100 এর ক্ষমতা সম্পন্ন কর্মীদের একটি অ্যারে তৈরি করুন
  • এই অ্যারেতে কোনও শ্রমিককে তার কল করার শতাংশের সমান কয়েকগুণ রাখুন, উদাহরণস্বরূপ, যদি কর্মী 1 সমস্ত কলগুলির 30% পেয়ে থাকে তবে তাকে অ্যারের 0 থেকে 29 পজিশনে রেখে দিন।
  • শেষে অ্যারের প্রতিটি অবস্থান ব্যবহার করা উচিত, এবং শ্রমিকরা যত কল আসবে তার শতাংশের চেয়ে বহুবার অ্যারেতে উপস্থিত হওয়া উচিত।
  • একটি লুপে 0 এবং 99 এর মধ্যে একটি এলোমেলো সংখ্যা তৈরি করুন এবং অ্যারের সেই অবস্থানে কর্মীকে ইনকামিং কল বরাদ্দ করুন। কর্মী ব্যস্ত থাকলে পুনরাবৃত্তি করুন।
  • এইভাবে, নিখুঁত সম্ভাবনার বাইরে, কলগুলি পছন্দসই হিসাবে বিতরণ করা হবে
  • আমার উদাহরণে, কর্মী 1 এর কোনও প্রদত্ত পুনরাবৃত্তিতে চয়ন হওয়ার 30/100 সুযোগ রয়েছে।

4

আমি @ ডকব্রাউন এর সমাধানের সাথে একমত এটিকে একটি অ্যালগরিদম ফর্মে স্থাপন করা:

for each incoming call:
    sort lines ascending by delta* (see footnote below)

    // first element in array gets the call 
    increase number of calls for first element by 1
  • ডেল্টা একটি লাইনের প্রত্যাশিত শতাংশের প্রকৃত শতাংশ বিয়োগ দ্বারা নির্ধারিত হয়। এইভাবে, সবচেয়ে বড় নেতিবাচক ব-দ্বীপযুক্ত ব্যক্তিরা হ'ল প্রত্যাশিত শতাংশের সাথে মানিয়ে নিতে সবচেয়ে বেশি কল প্রয়োজন।

    উদাহরণস্বরূপ, যে ক্ষেত্রে লাইন 1 এবং 2 এর জন্য প্রত্যাশিত শতাংশ যথাক্রমে 60% এবং 40%, এবং তাদের প্রকৃত শতাংশ 50% এবং 50%, আপনি লাইন 2 অনুসরণ করার পরে ক্রম লাইন 1 দেখতে পাবেন -10 % 10% এর চেয়ে কম। সুতরাং লাইন 1 কল আসবে।

    আমি সন্নিবেশ সজ্জাটি ব্যবহার করার জন্য অত্যন্ত পরামর্শ দিই যখন অ্যারে ইতিমধ্যে বেশিরভাগ সাজানো থাকে তখন এটি সর্বোত্তম করে।

এছাড়াও, একটি ছোট্ট অপ্টিমাইজেশন হিসাবে, আপনি যদি প্রতিটি লাইনের প্রকৃত শতাংশ গণনা করার পরিবর্তে মোট কলগুলির সংখ্যা এতদূর ধরে রাখেন, আপনি কেবল সেই লাইন বিয়োগের জন্য কলের মোট সংখ্যার জন্য প্রত্যাশিত শতাংশের গণনা করতে পারেন মোট কলগুলির সংখ্যা লাইন বার (ডেল্টা = t_i - p_i * টি)। এক্ষেত্রে ব-দ্বীপ হ'ল প্রত্যাশিত শতাংশ অর্জনের জন্য কলগুলির নেতিবাচক সংখ্যা।

আমি আশা করি যে অন্য কোনও সন্দেহের ব্যাখ্যা দেয়।


ধন্যবাদ @ নীল আপনি সত্যই আমাকে সাহায্য করেছেন তবে দুজনেই যখন চিহ্নটি আঘাত করেন তখন আমার কোন লাইনে ফোন করা উচিত, এর কোনও মানদণ্ড আছে কি?
আক্কু

@ অাক্কু আমার অ্যালগরিদমের সাহায্যে আপনি বাছাইয়ের পরে সর্বদা প্রথম গ্রহণ করেন, মানে অ্যালগরিদমের যত্ন নেই। আপনার যদি প্রয়োগ করার জন্য আরও একটি মানদণ্ড থাকে তবে আপনার এটি বাছাই করার সময় আপনার অবশ্যই এটি ওজন করতে হবে। অন্য কথায়, যদি লাইন নম্বরটি গুরুত্বপূর্ণ ছিল, তবে আপনার বদ্বীপটি নেওয়া উচিত, মোট রেখার সংখ্যা দ্বারা গুণ করা উচিত, তারপরে বর্তমান লাইন নম্বরটি যুক্ত করুন। অন্য সকলকে সমান বলে ধরে নিয়ে এটি উচ্চতর রেখার সংখ্যাগুলির পক্ষে।
নীল

@ নীল: আপনার উত্তরটি ঠিক আছে, তবে যখনই আমি কেউ দেখি কেবল ন্যূনতম মান সন্ধানের জন্য কোনও অ্যারে সম্পূর্ণরূপে সাজানোর পরামর্শ দিই, আমি মনে করি "গ্রেট স্কট, এটি কি আসলেই প্রয়োজনীয়?"
ডক ব্রাউন

@ ডকব্রাউন O(n)হ'ল আপনি সন্নিবেশ সাজানোর মাধ্যমে ইতিমধ্যে সাজানো তালিকার বাছাইয়ের প্রত্যাশা করতে পারেন এবং O(n)এটিই আপনাকে সবচেয়ে ছোট মানটি খুঁজে পেতে ব্যবহার করতে হবে। আমি ঠিক ধরেছি এটি বাছাই হয়েছে।
নীল

@ নীল: কেবলমাত্র দুটি অ্যালগরিদম উভয় ও (এন) হওয়ায় এগুলি সমান সহজ (বা সমানভাবে দ্রুত) নয়।
ডক ব্রাউন

2

ওপি হিসাবে অনুমান হিসাবে

  1. রেখার সংখ্যা, এন, জানা যায় এবং;
  2. প্রতিটি লাইনের% জানা আছে

অ্যালগরিদম ডিজাইন

  1. প্রতিটি লাইন এর% দ্বারা সংজ্ঞায়িত করুন

  2. প্রতিটি লাইনের অবস্থান 0 অনুসারে বাছাই করুন 0 থেকে নির্ধারিত (কর্মীদের বর্তমান% - নির্ধারিত% কর্মী) বা এলোমেলো অ্যাসাইনমেন্ট দ্বারা যদি সমস্ত লাইন = 0

  3. প্রতিটি কলকে 0 থেকে দূরে বৃহত্তম লাইনে ফরোয়ার্ড করুন

উদাহরণ: যথাক্রমে 20, 30 এবং 50% এর সাথে 3 লাইন। সময় পয়েন্টে x 1 জন ফোন করে এবং যেহেতু প্রতিটি লাইন 0 থেকে 0 দূরে থাকে, তাই এলোমেলোভাবে বরাদ্দ দেওয়া হয় - 2 লাইনে বলুন যা সমস্ত কলগুলির 30% ধারণ করে। যেহেতু লাইন 2 সমস্ত কলগুলির 30% ধারণ করে এবং এখন সমস্ত কলগুলির 100% ধারণ করে, তাই 0 থেকে তার অবস্থানটি বৃদ্ধি পায়। পরের কলারকে এখন ভারসাম্য (0) অবধি লাইন 1 বা লাইন 3 ইত্যাদির জন্য বরাদ্দ করা হবে এবং এভাবে লুপটি পুনরাবৃত্তি হবে।


0

এটি একটি নিষ্পাপ সমাধান এবং শতাংশ ভিত্তিক বিতরণকে অনুমতি দেয় তবে কিছুই ধরে নেয় না। এই সমাধানটি অনেক উপায়ে উন্নত করা যেতে পারে তবে এটি এর মূল বক্তব্য। আমি নিশ্চিত নই যে এটি আপনি যা খুঁজছেন তা যদি হয় তবে এটি আপনাকে সত্য বিতরণ দেয়।

স্যুইডো কোড ...

int running_total_of_calls = 0

//This is hard coded for clarity. You'd most likely want to dynamically populate this array depending and probably distribute the work by alternating workers. Notice how "worker1" appears 6 out of 10 times in the array.
string[] worker = new string[10]
workers[0] = "worker1"
workers[1] = "worker1"
workers[2] = "worker1"
workers[3] = "worker1"
workers[4] = "worker1"
workers[5] = "worker1"
workers[6] = "worker2"
workers[7] = "worker2"
workers[8] = "worker2"
workers[9] = "worker2"

while(1) //run forever
    //This is where the distribution occurs. 
    //first iteration: 0 modulus 10 = 0. 
    //second: 1 modulus 10 = 1
    //third: 2 modulus 10 = 2
    //...
    //10th: 10 modulus 10 = 0
    //11th: 11 modulus 10 = 1 
    //12th: 12 modulus 10 = 2
    //...
    int assigned_number = running_total_of_calls % workers.Count //count of workers array
    string assigned_worker = workers[assigned_number]
    do_work(assigned_worker)
    running_total_of_calls = ++running_total_of_calls
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.